sdmspec.json
sdmspec.json — файл инициализации Shardman
Синтаксис
sdmspec.json
Описание
Расширение shardmanctl использует файл конфигурации sdmspec.json
во время инициализации кластера Shardman. Пакет shardman-utils
содержит пример файла конфигурации.
Файл sdmspec.json
содержит основные пути файловой системы, используемые Shardman, глобальные параметры кластера, параметры, связанные с базой данных, например логины администраторов и пользователей репликации и методы их аутентификации, параметры FDW и конфигурация сегментов (ShardSpec
).
Список параметров
Repfactor
Целое число, определяющее, сколько реплик нужно настроить расширению shardmanctl для каждой СУБД. Этот параметр можно изменить только для кластера Shardman с режимом топологии manual.
PlacementPolicy
Строка, определяющая политику размещения экземпляров СУБД. В настоящее время поддерживаются только политики размещения
cross
иmanual
. Прежнее значениеclover
используется как псевдоним для политикиcross
.С политикой
cross
узлы группируются в звенья, где на каждом узле работает главный сервер СУБД и реплики для всех остальных узлов в звене. Количество узлов в звене определяется параметром Repfactor и равноRepfactor
+ 1.Политика размещения
manual
позволяет вручную добавлять или удалять необходимое количество реплик в указанных группах репликации. В этом случаеRepfactor
используется только в рекомендательных целях и не накладывает ограничений.DataDir
Позволяет указать каталог для хранения данных, отличный от каталога по умолчанию (
/var/lib/pgpro/sdm-14/data
). Этот параметр нельзя изменить после инициализации кластера.PGsInitialPort
Порты, начинающиеся с этого целого числа, назначаются экземплярам PostgreSQL. Этот параметр нельзя изменить после инициализации кластера.
SilkInitialPort
Порты, начинающиеся с этого целого числа, назначаются экземплярам Silk (Shardman InterLinK). Этот параметр нельзя изменить после инициализации кластера.
AuthMethod
Метод аутентификации, используемый администратором для подключения к СУБД. Может быть любым методом аутентификации, поддерживаемым PostgreSQL. В настоящее время рекомендуется использовать
scram-sha-256
. Методmd5
сейчас разрешён, но не рекомендован. Этот параметр нельзя изменить после инициализации кластера. Он должен быть расположен в отдельном блокеUsers
для каждого элемента массива.По умолчанию:
trust
.Groups
Массив, который может иметь два возможных значения:
su
для суперпользователя илиrepl
для пользователя репликации.HTTP
Задаёт параметры безопасного подключения по протоколу HTTP/HTTPS с помощью параметров
Port
, задающего порт API, иPortMetrics
, задающего порт метрик. Если эти порты одинаковые, API и метрики слушают один и тот же порт.По умолчанию:
15432
.Name
Имя пользователя. Создаётся при инициализации кластера. По умолчанию используется имя действительного пользователя, запустившего
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
).На сторонних серверах, соответствующих группам репликации Shardman, также будет автоматически включён параметр
extended_features
. Никогда не устанавливайте этот параметр для сторонних серверов postgres_fdw, которые определяются для пользовательских целей (например, для загрузки данных в кластер Shardman).
Параметры ShardSpec
Спецификация ShardSpec
может включать все обычные параметры stolon, описанные в Спецификация кластера Stolon. Однако следующие параметры следует тщательно настроить для кластера Shardman.
pgHBA
Массив JSON строк
pg_hba.conf
. По умолчанию разрешает доступ пользователю из группыsu
из любого места с методом аутентификацииAuthMethod
. Если значениеdefaultSUReplAccessMode
равноstrict
, строкиpg_hba.conf
должны явно разрешать доступ пользователей из группsu
илиrepl
со всех узлов кластера Shardman.-
forceSuUserLocalPeerAuth
Если этот параметр включён, он устанавливает аутентификацию peer через сокет Unix для пользователя
postgres
, если дляstrictUserHBA
не установлено значениеtrue
.По умолчанию:
false
.synchronousReplication
Определяет, должны ли реплики использовать синхронную репликацию. Должен иметь значение
true
в кластере Shardman.По умолчанию:
true
.maxSynchronousStandbys
Максимальное количество необходимых синхронных резервных серверов при включённой синхронной репликации. Должно быть
>=
Repfactor в кластере Shardman. По умолчанию:Repfactor
.strictUserHBA
Запрещает добавление автоматически сгенерированных строк в файл
pg_hba.conf
. По умолчанию:false
.automaticPgRestart
Определяет, должен ли экземпляр СУБД автоматически перезапускаться после изменения хеш-таблицы pgParameters, внесение которого требует перезапуска. Должен быть включён в кластере Shardman.
По умолчанию:
true
.masterDemotionEnabled
Включить понижение роли ведущего сервера, если ведущий сервер группы реплик потерял связь с etcd. Ведущий сервер пытается подключиться к каждому из своих резервных узлов, чтобы определить, стал ли какой-либо из них ведущим. Если обнаруживается другой ведущий сервер, текущий выключает свой экземпляр СУБД до тех пор, пока не будет восстановлено соединение с etcd. Если ведущий сервер в течение длительного времени не может подключиться к одному из своих резервных узлов, происходит отключение экземпляра СУБД.
По умолчанию:
false
.masterDemotionTimeout
Тайм-аут, в течение которого ведущий сервер пытается подключиться к своим резервным узлам в случаях, когда связь с etcd потеряна. Работает, только если для параметра
masterDmotionEnabled
установлено значение true.По умолчанию:
30s
.minSyncMonitorEnabled
Включает отслеживание значения
MinSynchronousStandbys
для каждой группы реплики. Если узел теряет соединение с кластером (все процессыkeeper
неработоспособны: состояниеkeeper
не обновляется дольше, чемminSyncMonitorUnhealthyTimeout
), отслеживается уменьшение значенияMinSynchronousStandbys
для каждой группы реплик, связанной с отключённым узлом, до максимально доступного значения. Это позволяет предотвратить состояние только для чтения, вызванное поддельной репликой. Максимально доступное значение всегда меньше или равно значению, указанному в конфигурации кластера. Если все процессыkeeper
, связанные с отключённым узлом, становятся работоспособными, отслеживается изменение значенияMinSynchronousStandbys
группы реплик на значение, указанное в конфигурации кластера.По умолчанию:
false
.minSyncMonitorUnhealthyTimeout
Временной интервал, по истечении которого узел (и все процессы
keeper
, связанные с этим узлом) будет считаться неработоспособным. Работает, только если для параметраminSyncMonitorEnabled
установлено значение true.По умолчанию:
30s
.-
syncPointMonitorEnabled
Включить отслеживающий процесс, который каждую минуту создаёт точку синхронизации, гарантируя, что Shardman сможет восстановить согласованный LSN. В каждой точке синхронизации состояние кластера согласованно, то есть все транзакции завершены. Если для этого параметра установлено значение true, PITR будет гарантированно работать
По умолчанию:
false
.-
dbWaitRewindTimeout
Перед полной повторной синхронизацией реплики программное обеспечение кластера сначала пытается задействовать pg_rewind, поскольку операция перемотки выполняется значительно быстрее других подходов, когда база данных большая и кластеры отличаются лишь небольшой частью блоков. Параметр
dbWaitRewindTimeout
указывает максимальное время работы для pg_rewind (примеры значений:5m
,30s
,1m30s
).По умолчанию:
7m
.pgParameters
Хеш-таблица, определяющая параметры PostgreSQL, включая параметры, специфичные для Shardman.
Параметры PostgreSQL, специфичные для Shardman
Следующие параметры в pgParameters
относятся к Shardman:
enable_csn_snapshot
(boolean
)Включает или отключает для снимка отслеживание видимости транзакции на основе последовательного номера фиксации (CSN).
PostgreSQL использует метку времени в качестве CSN, поэтому включение снимков на основе CSN может быть полезно для реализации глобальных снимков и глобальной видимости транзакций.
Когда этот параметр включён, PostgreSQL создаёт каталог
pg_csn
вPGDATA
для отслеживания сопоставлений CSN и XID.По умолчанию:
off
.enable_custom_cache_costs
(boolean
)Включает логику оценки стоимости плана. Это позволяет планировщику чаще выбирать общие планы с учётом устранения секций во время выполнения запроса.
По умолчанию:
off
.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 too old
».По умолчанию:
15
.csn_commit_delay
(integer
)Задаёт максимально возможное значение рассогласования часов (в наносекундах) в кластере. Добавляет задержку перед каждой фиксацией в системе для обеспечения внешней согласованности. Если установлено значение 0, внешняя согласованность не гарантируется. Значения могут дополняться суффиксами
ns
,us
,ms
иs
.По умолчанию:
0
.csn_lsn_map_size
(integer
)Размер карты CSNLSNMap.
Запись фиксации каждой завершённой транзакции в Shardman содержит назначенный
CSN
для этой транзакции. Это значение вместе сLSN
этой записи образует пару значений(CSN, LSN)
. Каждый из узлов кластера хранит определённое количество таких пар в оперативной памяти в специальной структуре — картеCSNLSNMap
. Эта карта используется для получения точки синхронизации. За дополнительной информацией обратитесь к разделу «Точки синхронизации и согласованное резервное копирование» в главе Внутреннее устройство.По умолчанию:
1024
.csn_max_snapshot_shift
(integer
)Включает проверку снимков, импортированных функцией
pg_csn_snapshot_import()
. При попытке импортировать в будущее дальше, чем наcsn_max_snapshot_shift
наносекунд, возвращается ошибка. При попытке импортировать в будущее дальше, чем на половинуcsn_max_snapshot_shift
наносекунд, в журнал пишется предупреждение. Еслиcsn_max_snapshot_shift
=0, проверка не выполняется.По умолчанию:
0
.csn_max_commit_shift
(integer
)Максимальное разрешённое смещение CSN снимка относительного настоящего момента времени в
COMMIT PREPARED ... WITH (csn = ...)
.По умолчанию:
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-порт, через который сервер принимает подключения. Значение
port
для кластера Shardman назначается системой автоматически на основании параметраPGsInitialPort
. Даже если значение параметра будет изменено вручную, оно перезапишется автоматически назначенным параметром конфигурации.enable_partition_pruning_extra
(boolean
)Включает механизм расширенного отсечения секций для подготовленных запросов. Включение этого параметра позволяет отсекать секции из планов, использующих соединение с учётом секционирования.
По умолчанию:
off
.crash_info
(boolean
)Если установлено значение по умолчанию
on
, Shardman записывает диагностическую информацию о сбое сервера в файл.По умолчанию:
on
.crash_info_dump
(text
)Указывает разделённый запятыми список текстовых строк, содержащих источники данных для аварийных дампов. Возможны следующие значения строк:
queries
— тексты запросовmemory_context
— контекст памятиsystem
— информация об ОСmodule
— информация о модулях, загруженных в процессpostgres
cpuinfo
— информация о процессореvirtual_memory
— информация о виртуальной памяти
Значение по умолчанию —
system,module,queries,memory_context
.crash_info_location
(string
)Указывает каталог, в котором должна храниться информация о сбое сервера. При значении
stderr
информация о сбое отправляется в каталог stderr. Если в этом параметре указана пустая строка''
, используется каталог$PGDATA/crash_info
. Если нужно сохранять файлы в другом месте, заранее создайте целевой каталог и выдайте соответствующие права.По умолчанию:
''
.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.optimize_cursors
(boolean
)Задаёт поведение postgres_fdw, при котором расширение будет пытаться извлечь первую часть данных курсора сразу после объявления и задерживать закрытие курсора.
Этот параметр postgres_fdw заставляет расширение избегать закрытия курсоров после окончания сканирования. Курсоры закрываются в конце транзакции.
По умолчанию:
off
.postgres_fdw.subplan_pushdown
(boolean
)Включает или отключает логику postgres_fdw для выталкивания подзапросов, ссылающихся только на таблицы стороннего сервера, на этот сторонний сервер.
По умолчанию:
off
.postgres_fdw.use_twophase
(enum
)Задаёт поведение postgres_fdw, при котором расширение использует протокол двухфазной фиксации (2PC) для распределённых транзакций.
Этот параметр postgres_fdw заставляет использовать двухфазную фиксацию, если транзакция затрагивает несколько узлов. Если установлено значение
auto
, двухфазная фиксация используется только в транзакциях сenable_csn_snapshot
=true
и уровнем изоляцииREPEATABLE READ
или выше.Временные таблицы нельзя использовать в двухфазных транзакциях.
По умолчанию:
auto
.postgres_fdw.estimate_as_hashjoin
(boolean
)Когда этот параметр включён, планировщик оценивает стоимость стороннего соединения таким же образом, как и стоимость хеш-соединения, когда это возможно. Эта стоимость сравнивается со стоимостью по умолчанию (которая аналогична стоимости соединения вложенным циклом), и для пути выбирается меньшая стоимость.
По умолчанию:
off
.postgres_fdw.additional_ordered_paths
(boolean
)Когда этот параметр включён, сортировка на стороне удалённого сервера будет рассматриваться, если возможно её использование для выполнения операции
MergeJoin
илиMergeAppend
. Параметр по умолчанию включён в новых инсталляциях, но при обновлении кластера требуется явное включение.shardman.broadcast_ddl
(boolean
)Задаёт поведение, при котором расширение Shardman транслирует операторы DDL для всех групп репликации.
Если этот параметр включён, расширение Shardman транслирует поддерживаемые операторы DDL для всех групп репликации, если это имеет смысл для этих операторов. Это поведение можно включить/отключить в любой момент. Этот параметр не учитывается, если он установлен в файле конфигурации.
По умолчанию:
off
.shardman.config_uuid
(string
)Внутренний параметр, используемый инструментами Shardman для определения версии конфигурации. Никогда не следует устанавливать вручную. Игнорируется, если установлено командой shardmanctl
config update
или shardmanctlinit
.По умолчанию: не задан.
shardman.enable_limit_pushdown
(boolean
)Включает выталкивание ограничительных предложений через нижележащие присоединения. Если этот параметр включён, оптимизатор Shardman попытается передать ограничительное предложение подпутям нижележащего узла плана
Append
/MergeAppend
, если они ссылаются на сторонние таблицы postgres_fdw. Эта оптимизация работает только для плановSELECT
, когда параметр ограничения представлен в виде константы или параметра. Она также ограничена для путейAppend
, соответствующих секционированной таблице. Оптимизация не работает дляSELECT
с предложениями блокировки (SELECT FOR UPDATE
/NO KEY UPDATE
/FOR SHARE
/KEY SHARE
).По умолчанию:
on
.shardman.num_parts
(integer
)Указывает количество секций сегментированной таблицы по умолчанию.
Сегментированная таблица имеет указанное количество секций по умолчанию, если
число_секций
не указано в CREATE TABLE.Чтобы разрешить масштабирование, значение
shardman.num_parts
должно быть больше ожидаемого максимального количества узлов в кластере Shardman.Возможные значения: от
1
до1000
По умолчанию:
20
.shardman.rgid
(integer
)Указывает идентификатор группы репликации узла Shardman.
Этот параметр задаётся утилитами Shardman при добавлении узла в кластер и никогда не должен изменяться вручную.
По умолчанию:
-1
.shardman.sync_schema
(boolean
)Задаёт поведение Shardman, при котором все операторы DDL, касающиеся сегментированные и глобальные отношения, распространяются на все группы репликации.
Когда этот параметр включён, 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 прослушивает входящие соединения на этом порту. Этот параметр должен быть одинаковым для всех узлов в кластере Shardman.
По умолчанию:
8888
.shardman.silk_tracepoints
(bool
)Включает трассировку прохождения запросов через транспорт Silk. Результаты трассировки выводятся командой
EXPLAIN
со значениемON
параметраANALYZE
.По умолчанию:
off
.shardman.silk_num_workers
(integer
)Количество фоновых рабочих процессов, выделенных для распределённого выполнения. Значение этого параметра должно быть меньше, чем значение
max_worker_processes
(включая вспомогательные рабочие процессы postgres).По умолчанию:
2
.shardman.silk_stream_work_mem
(integer
)Задаёт базовый максимальный объём памяти, который будет использоваться потоком Silk (как размер буфера), прежде чем будут задействованы временные файлы на диске. Если это значение задаётся без единиц измерения, оно считается заданным в килобайтах.
Обратите внимание, что в большинстве запросов могут быть несколько одновременных операций выборки, обычно по одной на каждую удалённую секцию сегментированной таблицы, если таковые имеются. Как правило для операции выборку задействовано столько памяти, сколько задано в данном значении, по достижении которого запись начинается во временные файлы. Кроме того, несколько таких операций могут выполнятся одновременно в нескольких сеансах. Таким образом общий объём памяти, используемый для буфера Silk, может в несколько раз превышать значение
shardman.silk_stream_work_mem
и соотноситься со значением параметра shardman.num_parts. Поэтому об этом стоит помнить при выставлении значения.По умолчанию:
16МБ
.shardman.silk_scheduler_mode
(enum
)Включает дополнительные параметры планирования ЦП для процессов мультиплексора (
silkroad
иsilkworm
).Если этот параметр равен
fifo
, Shardman назначает политику планирования SCHED_FIFO для процессовsilkroad
и каждого изsilkworm
. Оно назначает статический приоритет планирования (sched_priority) значениямshardman.silkroad_sched_priority
иshardman.silkworm_sched_priority
соответственно.Этот параметр улучшает производительность транспорта silk при работе с высокой нагрузкой на процессор.
Обратите внимание, что для использования этого параметра двоичный файл postgres должен иметь мандат CAP_SYS_NICE. Если процессу не назначен соответствующий мандат, включение этого параметра не окажет никакого эффекта. Мандат должен быть назначен двоичному файлу postgres перед запуском postgres. Postgres (т. е. процессы silkroad и silkworm) применит параметры планирования один раз во время запуска службы. Чтобы изменить параметры планирования, необходимо перезапустить службу postgres.
По умолчанию:
none
.Чтобы задать мандат, необходимо выполнить следующую команду один раз после установки postgres:
$
sudo setcap cap_sys_nice+ep /opt/pgpro/sdm-14/bin/postgres
При необходимости замените
/opt/pgpro/sdm-14/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
).
В типичной и допустимой конфигурации для 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.
Чтобы задать мандат, необходимо выполнить следующую команду один раз после установки postgres:
$
sudo setcap cap_sys_nice+ep /opt/pgpro/sdm-14/bin/postgres
При необходимости замените
/opt/pgpro/sdm-14/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
)Интервал между проверками устаревших подготовленных транзакций.
Фоновый процесс Shardman monitor активируется каждые
shardman.monitor_dxact_interval
секунд и пытается проверить и разобрать все подготовленные транзакции, которые не завершились и по какой-то причине устарели. Чтобы разобрать эти транзакции, процесс Shardman monitor определяет координатора транзакции и запрашивает у него статус транзакции. В зависимости от статуса транзакции Shardman monitor либо откатывает, либо фиксирует транзакцию.Чтобы отключить логику разбора подготовленных транзакций, установите для
shardman.monitor_dxact_interval
значение0
.По умолчанию:
5
(секунд).shardman.monitor_trim_csnxid_map_interval
(integer
)Каждый узел кластера замораживает собственное значение
xmin
наcsn_snapshot_defer_time
секунд для поддержки глобальных транзакций. Большие значенияcsn_snapshot_defer_time
могут негативно сказаться на производительности. У расширения Shardman monitor есть подпрограмма, которая каждыеshardman.monitor_trim_csnxid_map_interval
секунд обновляетxmin
на всех узлах до минимально возможного значения (с учётом активных транзакций).Фоновая процедура будет выполняться только на одном узле в кластере Shardman. Учтите, что это увеличит нагрузку на этот узел.
Чтобы отключить такие изменения, установите для
shardman.monitor_trim_csnxid_map_interval
значение0
.По умолчанию:
5
(секунд).shardman.monitor_dxact_timeout
(integer
)Максимально допустимый возраст подготовленных транзакций до попытки разбора.
Во время разбора подготовленной транзакции 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
)Интервал между проверками условий распределённой взаимоблокировки.
Фоновый процесс 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
.postgres_fdw.enable_always_shippable
(boolean
) — EXPERIMENTALВсегда разрешайте удалённое выполнение некоторых выражений. На данный момент это ограничено всего несколькими функциями. Для правильной работы этой функциональности все узлы должны иметь одинаковые параметры
timezone
.Предупреждение
Не включайте этот параметр, если не все удалённые
postgres_fdw
управляются Shardman.По умолчанию:
false
.track_fdw_wait_timing
(boolean
)Статистика сетевого ожидания операций между кластерами в миллисекундах. Выводится командой
EXPLAIN
с параметромnetwork
или через представление pgpro_stats_sdm_statements pgpro_stats.По умолчанию:
on
.track_xact_time
(boolean
)Включает или отключает сбор статистики для времени, затраченного на транзакцию.
По умолчанию:
off
.enable_non_equivalence_filters
(boolean
)Позволяет оптимизатору генерировать дополнительные неэквивалентные условия с использованием классов эквивалентности.
По умолчанию:
off
.optimize_row_in_expr
(boolean
)Позволяет оптимизатору генерировать дополнительные условия из выражения
IN ()
.По умолчанию:
off
.
Примеры
Файл конфигурации для кластера с включённой аутентификацией scram-sha-256
Примечание
Исходный файл конфигурации должен быть создан с помощью следующей команды:
shardmanctl config generate > sdmspec.json
Обратите внимание, что пример ниже представлен исключительно для сведения и мог устареть.
Ниже представлен пример содержимого файла конфигурации sdmspec.json
:
{ "ConfigVersion": "1", "Repfactor": 1, "PlacementPolicy": "manual", "PGsInitialPort": 5432, "SilkInitialPort": 8000, "HTTP": { "Port": 15432, "PortMetrics": 15432 }, "Users": [ { "Name": "postgres", "Groups": [ "su"], "AuthMethod": "scram-sha-256", "Password": "changeMe" }, { "Name": "repluser", "Groups": ["repl"], "AuthMethod": "scram-sha-256", "Password": "changeMe" } ], "ShardSpec": { "synchronousReplication": true, "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" }, "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" } }
Из этого файла конфигурации видно, что кластер Shardman, инициализированный этим файлом конфигурации, имеет значение Repfactor
, равное 1 (одна реплика для каждого ведущего сервера). Файл конфигурации показывает, что в этом кластере созданы два специальных пользователя — суперпользователь postgres
и пользователь репликации repluser
с паролями ChangeMe
. Они могут быть аутентифицированы, используя метод авторизации md5
или scram-sha-256
. Одна операция выборки postgres_fdw позволяет получить до 50000 строк с удалённого сервера. Для стоимости выборки одной строки установлено достаточно большое значение, чтобы планировщик PostgreSQL рассматривал условия как привлекательные для выталкивания. Параметры pg_hba.conf
разрешают пользователю postgres
доступ из любого места с использованием протокола репликации; все остальные пользователи могут получить доступ к любой базе данных из любого места. Поскольку для defaultSUReplAccessMode
не задано значение strict
, утилиты автоматически добавляют записи, разрешающие пользователю PgSuUsername
(postgres
) доступ к любой базе данных из любого места и доступ к репликации пользователю PgReplUsername
(repluser
) из любого места.
Несколько важных параметров, специфичных для Shardman, задаются в хеш-таблице pgParameters
, а именно:
wal_level
Для правильной работы 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
Должно быть достаточно большим, так как утилиты Shardman используют протокол 2PC. Если
postgres_fdw.use_twophase
имеет значение true, postgres_fdw также использует 2PC.enable_csn_snapshot
Должна быть включена для достижения настоящего уровня изоляции
REPEATABLE READ
в распределённой системе.csn_snapshot_defer_time
Все глобальные транзакции должны начинаться на всех узлах-участниках в течение количества секунд, заданного в параметре
csn_snapshot_defer_time
, в противном случае они прерываются ошибкойcsn_snapshot_defer_time
.enable_partitionwise_aggregate
enable_partitionwise_join
Установите значение
on
, чтобы включить оптимизацию для секционированных таблиц.
Файл конфигурации для кластера с включённой аутентификацией по сертификату
Ниже представлен пример содержимого файла конфигурации 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": "repluser", "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, "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", "postgres_fdw.subplan_pushdown": "off", "shardman.query_engine_mode": "text", "shardman.silk_num_workers": "8", "shared_buffers": "4GB", "shared_preload_libraries": "postgres_fdw, shardman" }, "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" } }
Параметры pgpro_stats
pgpro_stats.track_sharded
(boolean
)Определяет, должно ли расширение pgpro_stats отслеживать и агрегировать распределённые запросы (то есть запросы к распределённой таблице).
По умолчанию:
on
.pgpro_stats.pgss_max_nodes_tracked
(integer
)Задаёт максимальное количество узлов, отслеживаемых pgpro_stats для фрагментов запроса.
Фактически устанавливает максимальное количество записей статуса, которые pgpro_stats может хранить для функции
pgpro_stats_sdm_stats_updated
. Не влияет на сбор статистики.По умолчанию:
2048
.pgpro_stats.transport_compression
(string
)Задаёт алгоритм сжатия при передаче статистики между узлами.
Если параметр указан, выбранный алгоритм используется для сжатия статистических записей, передаваемых узлами сегмента к координатору. Может принимать значения
pglz
,zlib
,lz4
,zstd
илиoff
.По умолчанию:
pglz
.pgpro_stats.enable_wait_counters
(boolean
)Включает или отключает сбор статистики для счётчиков ожидания включением или отключением функций, которые вычисляют метрики событий ожидания.
По умолчанию:
off
.pgpro_stats.enable_inval_msgs_counters
(boolean
)Включает или отключает сбор статистики для счётчиков сообщений аннулирования включением или отключением функций, которые вычисляют метрики сообщений аннулирования.
Если этот параметр отключён, представление
pgpro_stats_inval_status
будет пустым.По умолчанию:
off
.pgpro_stats.enable_rusage_counters
(boolean
)Включает или отключает сбор статистики для счётчиков использования ресурсов включением или отключением функций, которые вычисляют метрики использования ресурсов ОС.
По умолчанию:
off
.pgpro_stats.track_shardman_connections
(enum
)Включает или отключает обработку операторов Shardman. У данного параметра есть три возможных значения:
none
без обработки,normalized
(значение по умолчанию) для обработки в обобщённом виде иall
для обработки всех операторов.