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. Спецификацию можно изменить, используя shardmanctl config 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 или shardmanctl init.

По умолчанию: не задан.

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)/3 параллельных потоков.

max_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 для обработки всех операторов.

См. также

shardmanctl