19.21. Конфигурация распределённого кластера #
Утилита shardmanctl использует конфигурационный файл sdmspec.json
при инициализации кластера Postgres Pro Shardman. Пакет shardman-utils
содержит пример такого файла.
Файл sdmspec.json
содержит основные пути в файловой системе, используемые Postgres Pro Shardman, глобальные параметры кластера, параметры, связанные с базой данных, например логины администраторов и пользователей репликации и методы их аутентификации, параметры FDW и конфигурацию сегментов (ShardSpec
).
Обратите внимание, что существует ряд внутренних параметров Postgres Pro Shardman, изменение которых пользователями может привести к полной неработоспособности кластера. К таким параметрам относятся:
Параметр
shardman.cluster_uuid
определяет версию работающего кластера, к которому принадлежит данный узел.Параметр
shardman.config_uuid
определяет версию конфигурации. Игнорируется, если задан с помощью команды shardmanctlconfig update
или shardmanctlinit
.Параметр
shardman.manual_execution
управляет согласованной работой с глобальными объектами.Параметр
shardman.silk_never_restart
запрещает перезапуск рабочих процессов мультиплексора в случае ошибки.Параметр
shardman.pre_promote_mode
включает механизм согласованного повышения (из резервного узла в ведущий).
19.21.1. Список параметров #
Repfactor
#Целое число, определяющее, сколько реплик должна настроить утилита shardmanctl для каждой СУБД. Этот параметр можно изменить только для кластера Postgres Pro Shardman с режимом ручной топологии.
DataDir
#Позволяет указать каталог для хранения данных, отличный от каталога по умолчанию (
/var/lib/pgpro/sdm-17/data
). Этот параметр нельзя изменить после инициализации кластера.PGsInitialPort
#Порты, начинающиеся с этого числа, назначаются экземплярам PostgreSQL. Этот параметр нельзя изменить после инициализации кластера.
SilkInitialPort
#Порты, начинающиеся с этого числа, назначаются экземплярам Silk (Postgres Pro Shardman InterLinK). Этот параметр нельзя изменить после инициализации кластера.
AuthMethod
#Метод аутентификации, используемый административным пользователем для подключения к СУБД. Может быть любым из поддерживаемых PostgreSQL методов аутентификации. В настоящее время рекомендуется
scram-sha-256
. Методmd5
пока разрешён, но не рекомендуется. Этот параметр нельзя изменить после инициализации кластера. Указывается в отдельном блокеUsers
для каждого элемента массива.По умолчанию:
trust
.Группы
#Массив, который может принимать два значения:
su
— для суперпользователя иrepl
— для репликации.HTTP
#Определяет параметры безопасного подключения по HTTP/HTTPS, где
Port
— это порт API, аPortMetrics
— порт для метрик. Если указаны одинаковые порты, то API и метрики прослушиваются на одном и том же порту.По умолчанию:
15432
.Имя
#Имя пользователя. Создаётся при инициализации кластера. По умолчанию используется имя эффективного пользователя, от имени которого выполняется команда
shardmanctl init
. Этот параметр нельзя изменить после инициализации кластера. Указывается в отдельном блокеUsers
для каждого элемента массива.Password
#Пароль пользователя. Может быть изменён с помощью команды shardmanctl
config update credentials
. Указывается в отдельном блокеUsers
для каждого элемента массива.PgSuSSLCert
#Клиентский сертификат для административного пользователя СУБД.
PgSSLRootCert
#Расположение файла корневого сертификата для подключения пользователя к СУБД.
PgSuSSLKey
#Закрытый ключ клиента для административного пользователя СУБД.
PgSSLMode
#Режим SSL для пользователя СУБД. Допустимые значения:
verify-ca
иverify-full
.PgReplSSLCert
#Клиентский сертификат для пользователя репликации СУБД.
PgReplSSLKey
#Закрытый ключ клиента для пользователя репликации СУБД.
ShardSpec
#Описание конфигурации кластера сегментов. Подробнее см. в разделе Параметры
ShardSpec
. Может быть изменено с помощью команды shardmanctlconfig update
.FDWOptions
#Этот объект содержит параметры FDW.
Эти параметры можно изменить с помощью команды shardmanctl
config update
(за исключением параметров, связанных с авторизацией, подключением к серверу, SSL и Kerberos, а также параметровservice
иtarget_session_attrs
).На сторонних серверах, соответствующих группам репликации Postgres Pro Shardman, также будет автоматически включён параметр
extended_features
. Никогда не устанавливайте этот параметр для сторонних серверов postgres_fdw, которые вы создаёте для собственных целей (например, для загрузки данных в кластер Postgres Pro Shardman).
19.21.2. Параметры ShardSpec
#
Спецификация ShardSpec
содержит набор параметров, которые можно настроить для конкретной группы репликации.
pgHBA
#Массив JSON-строк
pg_hba.conf
. Значение по умолчанию предоставляет пользователю из группыsu
доступ из любого места с использованием метода аутентификацииAuthMethod
. Если значениеdefaultSUReplAccessMode
установлено вstrict
, строкиpg_hba.conf
должны явно разрешать пользователям из группsu
илиrepl
доступ со всех узлов кластера Postgres Pro Shardman.Кластерное программное обеспечение продолжит работу, даже если запись в файл
pg_hba.conf
запрещена.-
forceSuUserLocalPeerAuth
# При включении задаёт аутентификацию типа peer через Unix-сокет для пользователя
postgres
, если параметрstrictUserHBA
не установлен в значениеtrue
.По умолчанию:
false
.maxSynchronousStandbys
#Максимальное количество необходимых синхронных резервных серверов при включённой синхронной репликации. В кластере Postgres Pro Shardman это значение должно быть
>=
Repfactor. Значение по умолчанию —Repfactor
.strictUserHBA
#Запрещает добавление автоматически сгенерированных строк в файл
pg_hba.conf
. Значение по умолчанию:false
.automaticPgRestart
#Определяет, должен ли экземпляр СУБД автоматически перезапускаться после изменения хеш-таблицы pgParameters, требующего перезапуска. В кластере Postgres Pro Shardman этот параметр должен быть включён.
По умолчанию:
true
.masterDemotionEnabled
#Включает понижение роли ведущего узла в случае потери соединения группы репликации с etcd. Ведущий узел пытается подключиться ко всем своим резервным узлам, чтобы определить, не стал ли один из них новым ведущим. Если обнаружен другой ведущий, текущий узел завершает работу экземпляра СУБД до восстановления подключения к etcd. Если ведущий узел длительное время не может подключиться хотя бы к одному из резервных, также происходит завершение работы экземпляра СУБД.
По умолчанию:
false
.masterDemotionTimeout
#Тайм-аут, в течение которого ведущий узел пытается подключиться к своим резервным узлам при потере соединения с etcd. Параметр действует только при включённом значении
masterDemotionEnabled
.По умолчанию:
30s
.minSyncMonitorEnabled
#Включает мониторинг значения
MinSynchronousStandbys
для каждой группы репликации. Если узел теряет соединение с кластером (все егоkeeper
-процессы считаются неработоспособными:keeper
не обновляет своё состояние в течение времени, превышающего значение параметраminSyncMonitorUnhealthyTimeout
), монитор уменьшает значениеMinSynchronousStandbys
для всех групп репликации, связанных с этим узлом, до максимально допустимого. Это позволяет предотвратить переход кластера в режим только для чтения из-за «ложной» реплики. Максимально допустимое значение всегда меньше или равно значению, заданному в конфигурации кластера. Если всеkeeper
-процессы, связанные с этим узлом, вновь становятся работоспособными, монитор возвращает значениеMinSynchronousStandbys
для соответствующей группы репликации к заданному в конфигурации кластера.По умолчанию:
false
.minSyncMonitorUnhealthyTimeout
#Интервал времени, по истечении которого узел (и все
keeper
-процессы, связанные с этим узлом) будет считаться неработоспособным. Параметр действует только при включённом значенииminSyncMonitorEnabled
.По умолчанию:
30s
.-
syncPointMonitorEnabled
# Включает отслеживающий процесс, который каждую минуту создаёт точку синхронизации, гарантируя, что кластер Postgres Pro Shardman можно восстановить в согласованном состоянии на данный LSN. В каждой точке синхронизации состояние кластера согласованно, то есть все транзакции завершены. Если для этого параметра установлено значение
true
, PITR будет гарантированно работать.syncPointMonitorEnabled
сохраняет историю точки синхронизации в etcd с ключомshardman/{cluster_name}/data/cluster/syncpoints
.По умолчанию:
false
.-
syncPointMonitorLimit
# Определяет ограничение на размер истории синхронизаторов, сохраняемой при включённом параметре
syncPointMonitorEnabled
.По умолчанию: 60.
-
shardmanSchemaDumpMonitorDisabled
# Отключает монитор
shardmanSchemaDumpMonitorDisabled
, который периодически создаёт дамп схемыshardman
.По умолчанию:
true
.-
shardmanSchemaDumpMonitorTick
# Задаёт частоту создания дампа монитором
shardmanSchemaDumpMonitor
.По умолчанию: каждые 20 минут.
pgParameters
#Хеш-таблица, определяющая параметры PostgreSQL, включая параметры для распределённой системы.
biHAReplicaWithProbackup
#Если параметр включён, новые ведомые узлы BiHA и узлы с типом
referee-with-wal
будут использовать probackup в качестве метода синхронизации.
19.21.3. Параметры PostgreSQL для распределённой системы #
Следующие параметры в pgParameters
являются специфичными для распределённой системы:
enable_sql_func_custom_plans
(boolean
) #Если параметр включён, для выполнения операторов внутри SQL-функций могут создаваться пользовательские планы. Эти планы зависят от значений параметров.
Планы запросов могут кэшироваться в пределах одного запроса. Сначала план формируется пять раз с разными значениями параметров, после чего создаётся обобщённый план, не зависящий от значений. Если стоимость пользовательского и обобщённого планов отличается незначительно, в кэш помещается обобщённый план, который будет использоваться в дальнейшем. Однако пользовательские планы позволяют более эффективно исключать обращения к секциям сегментированной таблицы, если выбор секций зависит от параметра запроса.
По умолчанию:
off
.enable_merge_append
(boolean
) #Включает использование планов
MergeAppend
при построении плана запроса.По умолчанию:
on
.enable_async_merge_append
(boolean
) #Включает или отключает использование планировщиком планов с асинхронным добавлением данных слиянием. По умолчанию имеет значение
on
(вкл.).csn_snapshot_defer_time
(integer
) #Указывает минимальный возраст разрешённых для очистки записей в секундах.
Особенности распределённой системы описаны в
csn_snapshot_defer_time
.Все глобальные транзакции должны начинаться на всех участвующих узлах в течение
csn_snapshot_defer_time
секунд после старта; в противном случае они прерываются с ошибкой «csn snapshot too old
».По умолчанию:
15
.csn_commit_delay
(integer
) #Задаёт максимально допустимое рассогласование часов (в наносекундах) в кластере. Добавляет задержку перед каждой фиксацией транзакции в системе для обеспечения внешней согласованности. При значении 0 внешняя согласованность не гарантируется. Допустимы суффиксы единиц измерения:
ns
,us
,ms
иs
.По умолчанию:
0
.csn_lsn_map_size
(integer
) #Размер структуры CSNLSNMap.
Запись фиксации каждой завершённой транзакции в Postgres Pro Shardman содержит назначенный
CSN
для этой транзакции. Это значение вместе сLSN
этой записи образует пару значений(CSN, LSN)
. Каждый из узлов кластера хранит определённое количество таких пар в оперативной памяти в специальной структуре — картеCSNLSNMap
. Эта карта используется для получения точки синхронизации. За дополнительной информацией обратитесь к разделу «Точки синхронизации и согласованное резервное копирование» в главе Внутреннее устройство.По умолчанию:
1024
.csn_max_shift_error
(boolean
) #При проверке с использованием значения
csn_max_shift
вызывается ошибка, если значениеcsn_max_shift
превышено.По умолчанию:
off
.csn_max_shift
(integer
) #Максимальный сдвиг CSN в секундах для распределённых запросов и импортированных снимков. Если сдвиг превышает значение
csn_max_shift
, будет выдана ошибка или предупреждение. Если параметр установлен в 0, проверка не выполняется.По умолчанию:
15
секунд.foreign_analyze_interval
(integer
) #Задаёт частоту сбора сторонней статистики в процессе автоочистки, в секундах. Если значение параметра
foreign_analyze_interval
меньше значения autovacuum_naptime, сторонняя статистика собирается через заданные вautovacuum_naptime
промежутки времени (в секундах).По умолчанию:
60
.foreign_join_fast_path
(boolean
) #Включает ускоренный путь планирования объединений с внешними источниками. При включённом параметре пути выполнения с использованием внешнего объединения для запросов
SELECT
ищутся раньше всех остальных, и поиск для данного объединения прекращается, как только найден путь внешнего объединения.По умолчанию:
off
.optimize_correlated_subqueries
(boolean
) #Включает или отключает логику планировщика запросов для преобразования связанных подзапросов в полусоединения.
По умолчанию:
on
.port
(integer
) #TCP-порт, через который сервер принимает подключения. Для кластера Postgres Pro Shardman значение
port
назначается системой автоматически на основании параметраPGsInitialPort
. Даже если значение параметра будет изменено вручную, оно перезапишется автоматически назначенным параметром конфигурации.enable_partition_pruning_extra
(boolean
) #Включает расширенную обрезку секций для подготовленных запросов с известным ключом секционирования. При включённом параметре могут быть отброшены планы объединения по секциям.
По умолчанию:
off
.postgres_fdw.enforce_foreign_join
(boolean
) #Включает альтернативную оценку стоимости объединений с внешними источниками, что значительно повышает вероятность выполнения объединения нескольких внешних таблиц, ссылающихся на один сервер, на стороне источника. Стоимость исходного объединения оценивается как
(1 - 1/(cost + 1))
, гдеcost
— исходно рассчитанная стоимость удалённого объединения.По умолчанию:
off
.postgres_fdw.foreign_explain
(enum
) #Определяет, как включать вывод команды
EXPLAIN
с удалённых серверов, если план запроса содержит узлыForeignScan
. Возможные значения:none
— не включать выводEXPLAIN
с удалённых серверов,full
— включать выводEXPLAIN
с удалённых серверов,collapsed
— включать выводEXPLAIN
только для первого узлаForeignScan
, расположенного под соответствующимAppend
илиMergeAppend
.По умолчанию:
collapsed
.postgres_fdw.use_twophase
(enum
) #Задаёт использование двухфазной фиксации (2PC) в postgres_fdw для распределённых транзакций.
Этот параметр postgres_fdw принудительно включает двухфазную фиксацию, если транзакция затрагивает несколько узлов. При значении
auto
двухфазная фиксация используется только в тех транзакциях, гдеenable_csn_snapshot
установлено вtrue
и уровень изоляции не нижеREPEATABLE READ
.В двухфазных транзакциях (2PC) нельзя использовать временные таблицы.
По умолчанию:
auto
.postgres_fdw.additional_ordered_paths
(boolean
) #При включённом параметре сортировка на удалённом сервере рассматривается, если она позволяет выполнить операции
MergeJoin
илиMergeAppend
. Этот параметр включён по умолчанию в новых установках, но в обновлённых кластерах его необходимо включить вручную.shardman.broadcast_ddl
(boolean
) #Задаёт поведение, при котором расширение Postgres Pro Shardman транслирует операторы DDL для всех групп репликации.
Если этот параметр включён, расширение Postgres Pro Shardman транслирует поддерживаемые операторы DDL для всех групп репликации, если это имеет смысл для этих операторов. Это поведение можно включить или отключить в любой момент. Этот параметр не учитывается, если он установлен в файле конфигурации.
По умолчанию:
off
.shardman.enable_limit_pushdown
(boolean
) #Включает проталкивание ограничительных предложений через нижележащие присоединения. Если этот параметр включён, оптимизатор Postgres Pro Shardman попытается передать ограничительное предложение подпутям нижележащего узла плана
Append
/MergeAppend
, если они ссылаются на сторонние таблицы postgres_fdw. Эта оптимизация работает только для плановSELECT
, когда параметр ограничения представлен в виде константы или параметра. Она также ограничена для путейAppend
, соответствующих секционированной таблице. Оптимизация не работает дляSELECT
с предложениями блокировки (SELECT FOR UPDATE
/NO KEY UPDATE
/FOR SHARE
/KEY SHARE
).По умолчанию:
on
.shardman.num_parts
(integer
) #Задаёт количество секций по умолчанию для сегментированной таблицы.
Сегментированная таблица будет содержать это количество секций по умолчанию, если параметр
num_parts
не указан в команде CREATE TABLE.Чтобы разрешить масштабирование, значение
shardman.num_parts
должно быть больше ожидаемого максимального количества узлов в кластере Postgres Pro Shardman.Допустимые значения — от
1
до1000
.По умолчанию:
20
.shardman.rgid
(integer
) #Указывает идентификатор группы репликации узла Postgres Pro Shardman.
Этот параметр задаётся утилитами Postgres Pro Shardman при добавлении узла в кластер и никогда не должен изменяться вручную.
По умолчанию:
-1
.shardman.sync_schema
(boolean
) #Задаёт поведение Postgres Pro Shardman, при котором все операторы DDL, затрагивающие сегментированные и глобальные отношения, распространяются на все группы репликации.
Когда этот параметр включён, Postgres Pro Shardman транслирует все поддерживаемые служебные операторы, затрагивающие сегментированные и глобальные отношения, для всех групп репликации. Этот параметр не рекомендуется отключать. Он не учитывается, если он установлен в файле конфигурации.
По умолчанию:
on
.shardman.sync_cluster_settings
(boolean
) #Включает кластерную синхронизацию параметров конфигурации, заданных пользователем. Эти параметры передаются при каждом удалённом запросе.
По умолчанию:
on
.shardman.sync_cluster_settings_blacklist
(boolean
) #Исключает параметры, которые не должны передаваться в удалённый кластер.
По умолчанию: параметры конфигурации локальной системы, которые никогда не синхронизируются.
shardman.query_engine_mode
(enum
) #Переключает режимы планирования и выполнения запросов. Допустимые значения:
none
иtext
.Значение
none
означает, что при планировании и выполнении запроса транспорт Silk использоваться не будет.Значение
text
означает, что текстовое представление запроса передаётся через транспорт Silk для удалённого выполнения.По умолчанию:
none
.shardman.silk_use_ip
(string
) #Транспорт Silk использует IP-адрес, указанный в этом параметре, для идентификации узла. Если указано имя хоста, оно разрешается, и используется первый IP-адрес, соответствующий этому имени.
По умолчанию: node hostname.
shardman.silk_listen_ip
(string
) #Демон маршрутизации Silk прослушивает входящие подключения на этом IP-адресе. Если указано имя хоста, оно разрешается, и используется первый IP-адрес, соответствующий этому имени.
По умолчанию: node hostname.
shardman.silk_use_port
(integer
) #Демон маршрутизации Silk прослушивает входящие соединения на этом порту. Этот параметр должен быть одинаковым для всех узлов в кластере Postgres Pro Shardman.
По умолчанию:
8888
.shardman.silk_tracepoints
(bool
) #Включает трассировку запросов, проходящих через конвейер Silk. Результаты трассировки доступны при выполнении команды
EXPLAIN
с параметромANALYZE
, установленным вON
.По умолчанию:
off
.shardman.silk_num_workers
(integer
) #Количество фоновых процессов, выделяемых для распределённого выполнения. Значение этого параметра должно быть меньше
max_worker_processes
(с учётом вспомогательных рабочих процессов PostgreSQL).По умолчанию:
2
.shardman.silk_stream_work_mem
(integer
) #Задаёт базовый максимум объёма памяти, используемой потоком Silk в качестве размера буфера перед записью во временные файлы на диск. Если значение указано без единиц измерения, по умолчанию используется килобайты.
Имейте в виду, что большинство запросов может выполнять несколько операций выборки одновременно — как правило, по одной на каждую удалённую секцию сегментированной таблицы (если таковые есть). Каждая операция выборки обычно может использовать объём памяти, заданный этим параметром, до начала записи данных во временные файлы. Кроме того, несколько сессий могут выполнять такие операции параллельно. Поэтому общий объём памяти, используемой Silk для буферов, может многократно превышать значение параметра
shardman.silk_stream_work_mem
и зависит от значения shardman.num_parts. Учитывайте это при выборе значения.По умолчанию:
16МБ
.shardman.silkworm_fetch_size
(integer
) #Количество строк в одном блоке, которое рабочий процесс
silkworm
извлекает и отправляет мультиплексору в качестве результата за одну итерацию чтения.По умолчанию: 100.
shardman.silk_unassigned_job_queue_size
(integer
) #Размер очереди заданий, которые ещё не распределены между рабочими процессами мультиплексора
silkworm
, в случае, если все процессы заняты.Значение по умолчанию: 1024.
shardman.silk_max_message
(integer
) #Максимальный размер сообщения (в байтах), которое можно передать через Silk. Обратите внимание, что данный параметр не ограничивает максимальный размер результата, возвращаемого запросом. Он относится только к сообщениям, отправляемых рабочим процессам. Увеличение этого параметра приведёт к пропорциональному увеличению памяти, потребляемой Postgres Pro Shardman. Не рекомендуется менять значение по умолчанию без острой необходимости.
По умолчанию: 524288.
shardman.silk_hello_timeout
(integer
) #Тайм-аут установления соединения между мультиплексорами разных узлов, в секундах.
По умолчанию: 3.
shardman.silk_scheduler_mode
(enum
) #Включает дополнительные параметры планирования CPU для процессов мультиплексора (
silkroad
иsilkworm
).Если этот параметр равен
fifo
, Postgres Pro Shardman назначает политику планирования SCHED_FIFO для процессовsilkroad
и каждого изsilkworm
. Оно назначает статический приоритет планирования (sched_priority) значениямshardman.silkroad_sched_priority
иshardman.silkworm_sched_priority
соответственно.Этот параметр улучшает производительность транспорта Silk при высокой загрузке процессора.
Обратите внимание, что для использования этой опции бинарный файл
postgres
должен иметь возможность CAP_SYS_NICE. Если процессу не назначена соответствующая возможность, включение этого параметра не даст эффекта. Возможность должна быть назначена бинарному файлуpostgres
до запуска сервера. Процессыpostgres
(в том числе silkroad и silkworm) применяют параметры планирования один раз при запуске службы. Для изменения параметров планирования требуется перезапуск сервиса postgres.По умолчанию:
none
.Для установки возможности необходимо выполнить следующую команду один раз после установки PostgreSQL:
$
sudo setcap cap_sys_nice+ep /opt/pgpro/sdm-17/bin/postgres
При необходимости замените путь
/opt/pgpro/sdm-17/bin/postgres
на корректный путь к вашему бинарному файлу postgres. Также обратите внимание, что ваша файловая система должна поддерживать расширенные атрибуты файлов. Для полного эффекта эту настройку нужно выполнить на каждом узле кластера.В ядре Linux существует механизм, называемый ограничением для задач реального времени (real-time throttling), предназначенный для предотвращения монополизации ресурсов процессора задачами с политиками планирования реального времени (например,
SCHED_FIFO
). Это гарантирует, что другие задачи с более низкими приоритетами, обычно планируемые по политикеSCHED_OTHER
, также получают часть времени процессора. Управление этим механизмом осуществляется с помощью двух параметров, которые доступны через файловую системуproc
или интерфейсsysctl
:Параметр
/proc/sys/kernel/sched_rt_period_us
задаёт длительность периода планирования в микросекундах. В течение этого периода задачи реального времени и задачи с обычным приоритетом разделяют время процессора.Параметр
/proc/sys/kernel/sched_rt_runtime_us
задаёт, какая часть периода планирования выделяется задачам реального времени (с политикойSCHED_FIFO
). Остальное время остаётся для задач с обычным приоритетом (SCHED_OTHER
).
Типичная и допустимая конфигурация для Postgres Pro Shardman может задавать эти параметры следующим образом:
# cat /proc/sys/kernel/sched_rt_period_us 1000000 # cat /proc/sys/kernel/sched_rt_runtime_us 950000
Эта конфигурация позволяет задачам реального времени использовать до 950 миллисекунд каждой секунды, оставляя 50 миллисекунд для задач с обычным приоритетом.
Однако в некоторых дистрибутивах Linux значения этих параметров по умолчанию могут быть настолько низкими (или даже равными нулю), что задачи реального времени получают очень мало или вообще не получают процессорного времени. Это может сделать планирование реального времени неэффективным или помешать применению конфигурации. Например, попытка вручную назначить задаче приоритет
SCHED_FIFO
с помощью командыchrt
может привести к ошибке следующего вида:$ sudo chrt -f -p 2 $(pgrep -f silkroad)
chrt: failed to set pid 1897706's policy: Operation not permittedЭта ошибка указывает на неправильную настройку параметров ядра. В таких случаях выполните следующую команду:
echo 1000000 > /proc/sys/kernel/sched_rt_period_us echo 950000 > /proc/sys/kernel/sched_rt_runtime_us
Или добавьте соответствующие значения в файл
/etc/sysctl.conf
и перезагрузите параметры с помощью командыsysctl -p
:kernel.sched_rt_period_us = 1000000 kernel.sched_rt_runtime_us = 950000
shardman.silkroad_sched_priority
(integer
) #Значение статического приоритета планирования (sched_priority) для процесса
silkroad
. Имеет смысл только если параметрshardman.silk_scheduler_mode
равен «fifo».По умолчанию:
2
.shardman.silkworm_sched_priority
(integer
) #Значение статического приоритета планирования (sched_priority) для процессов
silkworm
(одинаковое для каждого из них). Имеет смысл только если параметрshardman.silk_scheduler_mode
равен «fifo».По умолчанию:
1
.shardman.silk_set_affinity
(bool
) #Включает закрепление процессов мультиплексора (
silkroad
иsilkworm
) за ядрами процессора для устранения негативных эффектов миграции потоков между ядрами.Если параметр установлен в значение
true
, процессsilkroad
будет закреплён за первым доступным ядром процессора, а все процессыsilkworm
— за всеми остальными доступными ядрами, кроме первого.Этот параметр улучшает производительность транспорта Silk при высокой загрузке процессора.
Обратите внимание, что бинарный файл
postgres
должен иметь возможность CAP_SYS_NICE для использования этой опции. Если процессу не назначена соответствующая возможность, включение этого параметра не даст эффекта. Возможность должна быть назначена бинарному файлуpostgres
до запускаpostgres
. Процессыpostgres
(включаяsilkroad
иsilkworm
) применяют параметры привязки один раз при запуске службы. Для изменения параметров аффинности требуется перезапуск сервиса postgres.Для установки возможности необходимо выполнить следующую команду один раз после установки PostgreSQL:
$
sudo setcap cap_sys_nice+ep /opt/pgpro/sdm-17/bin/postgres
При необходимости замените путь
/opt/pgpro/sdm-17/bin/postgres
на корректный путь к вашему бинарному файлу postgres. Также обратите внимание, что ваша файловая система должна поддерживать расширенные атрибуты файлов. Для полного эффекта эту настройку нужно выполнить на каждом узле кластера.По умолчанию:
false
.shardman.silk_flow_control
(boolean
) #Управляет режимом работы с событиями чтения. Возможные значения:
none
,round_robin
иshortest_job_first
.Режим
none
означает отсутствие управления и дополнительной нагрузки. Однако в этом случае канал может быть занят только одним распределённым запросом.Режим
round_robin
означает, что события, созданные раньше, обрабатываются первыми на каждом цикле обработки событий. Если режим включён, все серверные процессы группируются, а клиентские процессы получают приоритет над остальными.Режим
shortest_job_first
означает полный контроль над трафиком. При включении все серверные процессы группируются, при этом клиентские процессы имеют приоритет над остальными, а также приоритет получают рабочие процессы с наименьшей сессионной нагрузкой.По умолчанию:
round_robin
.shardman.silk_track_time
(boolean
) #Включает или отключает метрики с префиксом
transferred_
и метрики, основанные на времени (с префиксамиread_efd_
,write_efd_
иsort_time_
). Если метрики отключены, их значения равны0
.По умолчанию:
off
.shardman.silk_tracelog
(bool
) #Включает или отключает ведение журналов Silk.
По умолчанию:
off
.shardman.silk_tracelog_category
(string
) #Определяет категории сообщений Silk, которые подлежат трассировке.
По умолчанию:
streams, routing, events
.shardman.database
(string
) #Имя базы данных, к которой подключаются все рабочие процессы Silk.
По умолчанию:
postgres
.shardman.monitor_interval
(integer
) #Параметр
shardman.monitor_interval
устарел и не выполняет никаких действий.Используйте вместо этого параметр
shardman.monitor_dxact_interval
.shardman.monitor_dxact_interval
(integer
) #Интервал между проверками устаревших подготовленных транзакций.
Фоновый процесс Postgres Pro Shardman monitor активируется каждые
shardman.monitor_deadlock_interval
секунд и пытается проверить и разобрать все подготовленные транзакции, которые не завершились и по какой-то причине устарели. Чтобы разобрать эти транзакции, процесс Postgres Pro Shardman monitor определяет координатора транзакции и запрашивает у него статус транзакции. В зависимости от статуса транзакции Postgres Pro Shardman monitor либо откатывает, либо фиксирует транзакцию.Чтобы отключить логику разрешения подготовленных транзакций, установите параметр
shardman.monitor_dxact_interval
в значение0
.По умолчанию:
5
(секунд).shardman.monitor_trim_csnxid_map_interval
(integer
) #Каждый узел кластера замораживает собственное значение
xmin
наcsn_snapshot_defer_time
секунд для поддержки глобальных транзакций. Большие значенияcsn_snapshot_defer_time
могут негативно сказаться на производительности. У расширения Postgres Pro Shardman monitor есть подпрограмма, которая каждыеshardman.monitor_trim_csnxid_map_interval
секунд обновляетxmin
на всех узлах до минимально возможного значения (с учётом активных транзакций).Фоновая процедура будет выполняться только на одном узле в кластере Postgres Pro Shardman. Учтите, что это создаст дополнительную нагрузку на данный узел.
Чтобы отключить такие обновления, установите параметр
shardman.monitor_trim_csnxid_map_interval
в значение0
.По умолчанию:
5
(секунд).shardman.monitor_dxact_timeout
(integer
) #Максимально допустимый возраст подготовленных транзакций до попытки их разрешения.
Во время разбора подготовленной транзакции Postgres Pro Shardman monitor определяет, не устарела ли она. Транзакция становится устаревшей, если она была подготовлена более
shardman.monitor_dxact_timeout
секунд назад.По умолчанию:
5
(секунд).shardman.trim_csnxid_map_naptime
(integer
) #Задаёт минимальную задержку между обновлениями
xmin
на всех узлах. Подробнее см. в разделе shardman.monitor_trim_csnxid_map_interval.Допустимые значения — от
1
до600
.По умолчанию:
5
.shardman.monitor_deadlock_interval
(integer
) #Интервал между проверками условий распределённой взаимоблокировки.
Фоновый процесс Postgres Pro Shardman monitor активируется каждые
shardman.monitor_deadlock_interval
секунд и ищет распределённые взаимоблокировки в кластере. Он собирает информацию о взаимных блокировках со всех узлов и ищет циклические зависимости между транзакциями. Если он обнаруживает взаимоблокировку, то разрешает её, отменяя один из рабочих процессов, участвующих в блокировке.Чтобы отключить логику разрешения распределённых взаимоблокировок, установите параметр
shardman.monitor_deadlock_interval
в значение0
.По умолчанию:
2
(секунды).postgres_fdw.remote_plan_cache
(boolean
) — EXPERIMENTAL #Включает кэширование планов на удалённых серверах для запросов FDW, сгенерированных из локально кэшированных планов.
По умолчанию:
off
.shardman.plan_cache_mem
(integer
) — EXPERIMENTAL #Задаёт объём памяти на каждый рабочий процесс, который может использоваться для кэша удалённых планов.
По умолчанию:
0
(кеши отключены).shardman.gt_batch_size
(integer
) — #Задаёт размер буфера для команд
INSERT
иDELETE
, выполняемых на глобальной таблице.По умолчанию:
64K
.track_fdw_wait_timing
(boolean
) #Статистика задержки сети (время ожидания) для операций между кластерами, в миллисекундах. Доступна при выполнении команды
EXPLAIN
с включённым параметромnetwork
.По умолчанию:
on
.track_xact_time
(boolean
) #Включает или отключает сбор статистики для времени, затраченного на транзакцию.
По умолчанию:
off
.enable_non_equivalence_filters
(boolean
) #Позволяет оптимизатору генерировать дополнительные неэквивалентные условия с использованием классов эквивалентности.
По умолчанию:
off
.optimize_row_in_expr
(boolean
) #Позволяет оптимизатору генерировать дополнительные условия из выражения
IN ()
.По умолчанию:
off
.
19.21.4. Примеры #
19.21.4.1. Файл спецификации для кластера с включённой аутентификацией scram-sha-256 #
Примечание
Исходный конфигурационный файл следует сгенерировать с помощью следующей команды:
shardmanctl config generate > sdmspec.json
Приведённый ниже пример предназначен исключительно для обучения и может не содержать последних обновлений.
Содержимое примерного файла конфигурации sdmspec.json
:
{ "ConfigVersion": "1", "Repfactor": 1, "PGsInitialPort": 5432, "SilkInitialPort": 8000, "BiHAInitialPort" : 25432, "HTTP": { "Port": 15432, "PortMetrics": 15432 }, "Users": [ { "Name": "postgres", "Groups": [ "su"], "AuthMethod": "scram-sha-256", "Password": "changeMe" }, { "Name": "biha_replication_user", "Groups": ["repl"], "AuthMethod": "scram-sha-256", "Password": "changeMe" } ], "ShardSpec": { "usePgrewind": true, "pgParameters": { "csn_snapshot_defer_time": "300", "enable_csn_snapshot": "on", "enable_csn_wal": "true", "shardman.query_engine_mode": "text", "shardman.silk_num_workers": "8", "max_connections": "600", "max_files_per_process": "65535", "max_logical_replication_workers": "14", "max_prepared_transactions": "200", "max_worker_processes": "24", "shared_preload_libraries": "postgres_fdw, shardman, biha" }, "pgHBA": [ "host replication postgres 0.0.0.0/0 scram-sha-256", "host replication postgres ::0/0 scram-sha-256" ], "automaticPgRestart": true, "masterDemotionEnabled": false }, "FDWOptions": { "async_capable": "on", "batch_size": "100", "connect_timeout": "5", "fdw_tuple_cost": "0.2", "fetch_size": "50000", "tcp_user_timeout": "10000" } }
Из этого файла конфигурации видно, что кластер Postgres Pro Shardman, инициализированный этим файлом конфигурации, имеет значение Repfactor
, равное 1 (одна реплика для каждого ведущего сервера). Файл конфигурации показывает, что в этом кластере созданы два специальных пользователя — суперпользователь postgres
и пользователь репликации repluser
с паролями ChangeMe
. Они могут быть аутентифицированы, используя метод авторизации md5
или scram-sha-256
. Одна операция выборки postgres_fdw позволяет получить до 50000 строк с удалённого сервера. Для стоимости выборки одной строки установлено достаточно большое значение, чтобы планировщик PostgreSQL рассматривал условия как привлекательные для проталкивания. Параметры pg_hba.conf
разрешают пользователю postgres
доступ из любого места с использованием протокола репликации; все остальные пользователи могут получить доступ к любой базе данных из любого места. Поскольку для defaultSUReplAccessMode
не задано значение strict
, утилиты автоматически добавляют записи, разрешающие пользователю PgSuUsername
(postgres
) доступ к любой базе данных из любого места и доступ к репликации пользователю PgReplUsername
(repluser
) из любого места.
В хеш-таблице pgParameters
задаются несколько важных параметров для распределённой системы. За информацией для обычных типов систем обратитесь к Разделу 19.7. Это:
wal_level
#Для правильной работы Postgres Pro Shardman должно быть установлено значение
logical
.shared_preload_libraries
#Должен включать расширения postgres_fdw и shardman в указанном порядке.
max_logical_replication_workers
#Должно быть достаточно высоким, поскольку процесс перебалансировки использует до
max(
параллельных потоков.max_replication_slots
,max_logical_replication_workers
,max_worker_processes
,max_wal_senders
)/3max_prepared_transactions
#Должно быть достаточно большим, так как утилиты Postgres Pro Shardman используют протокол 2PC. Если
postgres_fdw.use_twophase
имеет значениеtrue
, postgres_fdw также использует 2PC.enable_csn_snapshot
#Должен быть включён для обеспечения настоящего уровня изоляции
REPEATABLE READ
в распределённой системе.csn_snapshot_defer_time
#Все глобальные транзакции должны начаться на всех участвующих узлах в течение
csn_snapshot_defer_time
секунд после старта, иначе они будут прерваны.enable_partitionwise_aggregate
enable_partitionwise_join
#Установите значение
on
для включения оптимизаций для секционированных таблиц.
19.21.4.2. Файл спецификации для кластера с включённой аутентификацией по сертификатам #
Содержимое примерного файла конфигурации sdmspec.json
:
{ "ConfigVersion": "1", "HTTP": { "Port": 15432, "PortMetrics": 15432 "SSLKey": "/pgpro/ssl/server.key", "SSLCert": "/pgpro/ssl/server.crt" }, "Users": [ { "Name": "postgres", "SSLKey": "/var/lib/postgresql/.ssh/client.key", "SSLCert": "/var/lib/postgresql/.ssh/client.crt", "Groups": ["su"], "AuthMethod":"scram-sha-256" }, { "Name": "biha_replication_user", "SSLKey": "/var/lib/postgresql/.ssh/repluser.key", "SSLCert": "/var/lib/postgresql/.ssh/repluser.crt", "Groups": ["repl"], "AuthMethod":"scram-sha-256" } ], "ShardSpec": { "synchronousReplication": true, "usePgrewind": true, "certVersion": true, "pgParameters": { "ssl": "on", "ssl_cert_file": "/var/lib/postgresql/.ssh/server.crt", "ssl_key_file": "/var/lib/postgresql/.ssh/server.key", "ssl_ca_file": "/var/lib/postgresql/.ssh/ca.crt", "csn_snapshot_defer_time": "300", "enable_csn_snapshot": "on", "enable_csn_wal": "true", "log_line_prefix": "%m [%r][%p]", "log_min_messages": "INFO", "log_statement": "none", "maintenance_work_mem": "1GB", "max_connections": "600", "max_files_per_process": "65535", "max_logical_replication_workers": "9", "max_prepared_transactions": "200", "max_wal_size": "4GB", "max_worker_processes": "16", "min_wal_size": "512MB", "shardman.query_engine_mode": "text", "shardman.silk_num_workers": "8", "shared_buffers": "4GB", "shared_preload_libraries": "postgres_fdw, shardman, biha" }, "strictUserHBA": true, "pgHBA": [ "hostssl all postgres 0.0.0.0/0 cert clientcert=verify-full", "hostssl all repluser 0.0.0.0/0 cert clientcert=verify-full", "hostssl replication postgres 0.0.0.0/0 cert clientcert=verify-full", "hostssl replication postgres ::0/0 cert clientcert=verify-full", "hostssl replication repluser 0.0.0.0/0 cert clientcert=verify-full", "hostssl replication repluser ::0/0 cert clientcert=verify-full", "hostnossl all all 0.0.0.0/0 reject", "local postgres postgres scram-sha-256", "local replication repluser scram-sha-256" ], "automaticPgRestart": true, "masterDemotionEnabled": false }, "FDWOptions": { "async_capable": "on", "batch_size": "100", "connect_timeout": "5", "fdw_tuple_cost": "0.2", "fetch_size": "50000", "tcp_user_timeout": "10000" } }
Обратите внимание, что pg_hba.conf
нельзя изменить, если для параметра certVersion
задано значение true
.
19.21.4.3. Файл спецификации для создания кластера BiHA #
Для создания кластера с топологией, заданной в конфигурационном файле sdmspec.json
, разместите её под ключом Topology
. Формат топологии — это пара «ключ-значение», где ключ — строка с именем сегмента (shard_name
-n, где n — номер сегмента), а значением — массив узлов, относящихся к этому шару. Каждый узел должен содержать следующую информацию:
{ "host": "host", // name or IP of a node "role": "leader", // node role: leader, follower, referee, referee-with-wal "pgPort": 5432, // PostgreSQL instance port "silkPort": 8000, // silk port "bihaPort": 25432, // biha port "priority": 10 // node priority, a time interval after which the node can be suggested as a leader candidate, in milliseconds. The smaller the value, the greater is priority. Optional parameter. }
Также учитывайте, что заданная топология должна соответствовать ряду правил:
Каждый сегмент должен содержать хотя бы один узел-лидер.
Количество ведомых узлов сегмента должно быть больше или равно значению параметра
minSynchonousStandbys
.Пара
host:pgPort
должна быть уникальной для каждого узла.Порты не могут повторяться внутри одного узла.
Приоритет узла должен быть либо не задан, либо меньше 0. Экземпляры с ролями referee или
referee-with-wal
не должны иметь приоритета.
Пример:
{ "ConfigVersion": "1", "Repfactor": 1, "Topology": { "shard-1": [ { "host": "host1", "role": "leader", "pgPort": 5432, "silkPort": 8000, "bihaPort": 25432, "priority": 10 }, { "host": "host2", "role": "follower", "pgPort": 5433, "silkPort": 8001, "bihaPort": 25433, "priority": 1000 }, { "host": "host3", "role": "referee", "pgPort": 5432, "silkPort": 8000, "bihaPort": 25432 } ], "shard-2": [ { "host": "host2", "role": "leader", "pgPort": 5432, "silkPort": 8000, "bihaPort": 25432, "priority": 10 }, { "host": "host1", "role": "follower", "pgPort": 5433, "silkPort": 8001, "bihaPort": 25433, "priority": 1000 }, { "host": "host4", "role": "referee-with-wal", "pgPort": 5432, "silkPort": 8000, "bihaPort": 25432 } ] }, "ShardSpec": { "synchronousReplication": true, "minSynchronousStandbys": 0, ....
19.21.4.4. Файл спецификации для создания пользовательского журналирования #
Для создания пользовательского журналирования используйте подстановочные знаки из команд shardmanctl config update и shardmanctl set.
Пример:
{ "log_directory": "{{dataDir}}", "log_filename": "postgres-{{host}}-{{cluster}}-{{shard}}-{{keeperID}}.log", }