Перейти к содержанию

YAML Параметры конфигурации

Полная справка по параметрам и разделам конфигурации Patroni YAML.


Глобальный/Всемирный

  • thread_pool_size: размер пула потоков, используемый Patroni для выполнения асинхронных задач и обмена данными по REST API с другими участниками во время выбора лидера или проверок в аварийном режиме. Минимальное значение — 5, значение по умолчанию — 5.
  • thread_stack_size: указывает размер стека, используемый для потоков, запускаемых Patroni. Значение должно быть выровнено по 64kB. Минимальное значение — 64kB, значение по умолчанию (устанавливается Patroni) — 512kB.
  • name: имя хоста. Должно быть уникальным для кластера. Значение __patroni_strict_sync_replica_placeholder__ зарезервировано для внутреннего использования Patroni и не может использоваться в качестве имени узла.
  • namespace: путь внутри хранилища конфигурации, где Patroni будет хранить информацию о кластере. Значение по умолчанию: “/service”
  • scope: имя кластера


Журнал

  • type: задаёт формат логов. Может быть либо plain, либо json. Для использования формата json необходимо установить jsonlogger . Значение по умолчанию — plain.
  • level: устанавливает общий уровень ведения журнала. Значение по умолчанию — INFO (см. документацию по ведению журнала в Python )
  • traceback_level: задаёт уровень, на котором будут видны трассировки. Значение по умолчанию — ERROR. Установите значение DEBUG, если хотите видеть трассировки только при включённом log.level=DEBUG.
  • format: задаёт строку форматирования журнала. Если тип журнала — plain, формат журнала должен быть строкой. См. атрибуты LogRecord для получения списка доступных атрибутов. Если тип журнала — json, формат журнала может быть списком в дополнение к строке. Каждый элемент списка должен соответствовать атрибуту LogRecord. Будьте осторожны: требуется только имя поля, а обрамляющие символы %( и ) опускаются. Если необходимо вывести поле журнала с другим именем ключа, используйте словарь, где ключ словаря — это поле журнала, а значение — имя поля, которое должно быть выведено в журнале. Значение по умолчанию: %(asctime)s %(levelname)s: %(message)s
  • dateformat: устанавливает строку форматирования даты и времени. (см. документацию formatTime() )
  • static_fields: добавить дополнительные поля в лог. Этот параметр доступен только при установке типа лога в json.
  • max_queue_size: Patroni использует двухэтапное ведение журнала. Записи журнала записываются в очереди в оперативной памяти, а отдельный поток извлекает их из очереди и записывает в stderr или файл. Максимальный размер внутренней очереди по умолчанию ограничен 1000 записями, что достаточно для хранения журналов за последние 1 час 20 минут.
  • dir: Каталог для записи журналов приложения. Каталог должен существовать и быть доступен для записи пользователем, запускающим Patroni. Если задать это значение, приложение по умолчанию будет сохранять журналы 4 25MB. Значения хранения можно настроить с помощью file_num и file_size (см. ниже).
  • mode: Права доступа к файлам журнала (например, 0644). Если не указано, права будут установлены на основе текущего значения umask.
  • file_num: Количество журналов приложений, которые необходимо сохранить.
  • file_size: Размер файла patroni.log (в байтах), при достижении которого происходит смена лог-файла.
  • loggers: Этот раздел позволяет переопределять уровень ведения журнала для каждого модуля Python
    • patroni.postmaster: WARNING
    • urllib3: DEBUG
  • deduplicate_heartbeat_logs: При значении true последовательные логи heartbeat, одинаковые по содержанию, не выводятся. Значение по умолчанию — false.
Предупреждение

Время выполнения цикла высокой доступности может быть очень полезной информацией при диагностике переключений при отказе из-за нехватки ресурсов и подобных проблем. Когда deduplicate_heartbeat_logs установлен в true, журналы не будут содержать записи о выполнении цикла высокой доступности (если только не произойдёт смена лидера), и, таким образом, эта потенциально полезная информация станет недоступной в журналах.

Вот пример настройки Patroni для вывода логов в формате JSON.

log:
   type: json
   format:
      - message
      - module
      - asctime: '@timestamp'
      - levelname: level
   static_fields:
      app: patroni


Конфигурация начальной инициализации

Примечание

После того как Patroni впервые прошла начальную инициализацию кластера и настройки были сохранены в DCS, все последующие изменения в разделе bootstrap.dcs конфигурации YAML не будут иметь никакого эффекта! Чтобы изменить их, используйте либо patronictl_edit_config , либо REST API Patroni REST API .

  • начальная инициализация:
    • dcs: Этот раздел будет записан в /<namespace>/<scope>/config хранилища конфигурации после начальной инициализации нового кластера. Глобальная динамическая конфигурация кластера. Вы можете разместить любые из параметров, описанных в разделе Динамическая конфигурация , под ключом bootstrap.dcs, и после того, как Patroni завершит инициализацию (bootstrap) нового кластера, он запишет этот раздел в /<namespace>/<scope>/config хранилища конфигурации.

    • method: пользовательский скрипт для использования при первоначальной настройке этого кластера.

      См. документацию по пользовательским методам начальной инициализации для получения подробной информации. При указании initdb возвращается к команде по умолчанию initdb. initdb также запускается, если в файле конфигурации отсутствует параметр method.

    • initdb: (необязательно) список параметров, передаваемых команде initdb.

      • - data-checksums: Должен быть включён при необходимости pg_rewind на 9.3.
      • - encoding: UTF8: кодировка по умолчанию для новых баз данных.
      • - locale: UTF8: язык по умолчанию для новых баз данных.
    • post_bootstrap или post_init: Дополнительный скрипт, который будет выполнен после начальной инициализации кластера. Скрипт получает строку соединения URL (с именем суперпользователя кластера в качестве имени пользователя). Переменная PGPASSFILE устанавливается в расположение файла pgpass.


Citus

Включает интеграцию Patroni с Citus . При настройке Patroni будет отвечать за регистрацию узлов-работников Citus на координаторе. Дополнительную информацию о поддержке Citus можно найти здесь .

  • group: идентификатор группы Citus, целое число. Используйте 0 для координатора и 1, 2 и т.д. для воркеров
  • database: база данных, в которой должен быть создан расширение citus . Должна быть одинаковой на координаторе и всех воркерах. В настоящее время поддерживается только одна база данных.


Consul

Большинство параметров необязательны, но необходимо указать один из параметров host или url

  • host: хост:порт для локального агента Consul.
  • url: URL для локального агента Consul в формате: http(s)://host:port.
  • port: (необязательно) порт Consul.
  • scheme: (необязательно) http или https, по умолчанию — http.
  • token: (необязательно) токен ACL.
  • verify: (необязательно) проверять ли сертификат SSL для запросов HTTPS.
  • cacert: (необязательно) Сертификат CA. При наличии включает проверку подлинности.
  • cert: (необязательно) файл с сертификатом клиента.
  • key: (необязательно) файл с ключом клиента. Может быть пустым, если ключ содержится в cert.
  • dc: (необязательно) Дата-центр для связи. По умолчанию используется дата-центр хоста.
  • consistency: (необязательно) Выберите режим согласованности Consul. Допустимые значения: default, consistent или stale (подробнее в справочнике Consul API )
  • checks: (необязательно) список проверок состояния Consul, используемых для сессии. По умолчанию используется пустой список.
  • register_service: (необязательно) указывает, следует ли регистрировать службу с именем, определённым параметром scope, и тегом master, primary, replica или standby-leader в зависимости от роли узла. По умолчанию — false.
  • service_tags: (необязательно) дополнительные статические теги, добавляемые к сервису Consul помимо роли (primary/replica/standby-leader). По умолчанию используется пустой список.
  • service_check_interval: (необязательно) как часто выполнять проверку работоспособности для зарегистрированного URL. Значение по умолчанию — ‘5s’.
  • service_check_tls_server_name: (необязательно) переопределить хост SNI при подключении через TLS, см. также ссылку на проверку агента Consul API .

Для token необходимо наличие следующих разрешений ACL:

service_prefix "${scope}" {
    policy = "write"
}
key_prefix "${namespace}/${scope}" {
    policy = "write"
}
session_prefix "" {
    policy = "write"
}

Etcd

Большинство параметров необязательны, но необходимо указать один из параметров host, hosts, url, proxy или srv

  • host: хост:порт для конечной точки etcd.
  • hosts: список конечных точек etcd в формате host1:port1,host2:port2,и т.д. Может быть указан в виде строки, разделённой запятыми, или фактического списка YAML.
  • use_proxies: Если этот параметр установлен в значение true, Patroni будет рассматривать hosts как список прокси-серверов и не будет выполнять обнаружение топологии кластера etcd.
  • url: URL для etcd.
  • proxy: URL прокси для etcd. Если вы подключаетесь к etcd через прокси, используйте этот параметр вместо url.
  • srv: Домен для поиска записей SRV при автодиагностике кластера. Patroni будет пытаться запросить эти имена служб SRV для указанного домена (в указанном порядке до первого успешного результата): _etcd-client-ssl, _etcd-client, _etcd-ssl, _etcd, _etcd-server-ssl, _etcd-server. Если будут получены записи SRV для _etcd-server-ssl или _etcd-server, то будет использован протокол peer ETCD для запроса ETCD о доступных участниках. В противном случае будут использованы хосты из записей SRV.
  • srv_suffix: Задаёт суффикс к имени SRV, который запрашивается при обнаружении. Используйте этот флаг для различия между несколькими кластерами etcd в рамках одного домена. Работает только в сочетании с srv. Например, если установлены srv_suffix: foo и srv: example.org, выполняется следующий запрос DNS SRV:_etcd-client-ssl-foo._tcp.example.com (и так далее для каждого возможного имени службы ETCD SRV).
  • protocol: (необязательно) http или https, если не указано — используется http. Если указан url или proxy — протокол берётся из них.
  • username: (необязательно) имя пользователя для аутентификации в etcd.
  • password: (необязательно) пароль для аутентификации в etcd.
  • cacert: (необязательно) Сертификат CA. При наличии включает проверку подлинности.
  • cert: (необязательно) файл с сертификатом клиента.
  • key: (необязательно) файл с ключом клиента. Может быть пустым, если ключ содержится в cert.

Etcdv3

Если вы хотите, чтобы Patroni работал с кластером etcd через версию протокола 3, необходимо использовать раздел etcd3 в файле конфигурации Patroni. Все параметры конфигурации остаются такими же, как и для etcd.

Предупреждение

Ключи, созданные с использованием версии протокола 2, недоступны при использовании версии протокола 3, и наоборот, поэтому невозможно переключиться с etcd на etcd3 просто путём обновления файла конфигурации Patroni. Кроме того, Patroni использует gRPC-gateway (прокси) etcd для взаимодействия с V3 API, что означает, что аутентификация по общему имени TLS невозможна.


ZooKeeper

  • hosts: Список участников кластера ZooKeeper в формате: ′host1:port1′,′host2:port2′,′etc...′'host1:port1', 'host2:port2', 'etc...'.
  • use_ssl: (необязательно) Указывает, используется ли SSL или нет. Значение по умолчанию — false. Если установлено в false, игнорируются все параметры, специфичные для SSL.
  • cacert: (необязательно) Сертификат ЦС. При наличии включает проверку подлинности.
  • cert: (необязательно) Файл с сертификатом клиента.
  • key: (необязательно) Файл с ключом клиента.
  • key_password: (необязательно) Пароль ключа клиента.
  • verify: (необязательно) Указывает, проверять ли сертификат или нет. Значение по умолчанию — true.
  • set_acls: (необязательно) Если задано, настраивает Kazoo на применение по умолчанию ACL к каждому ZNode, который он создаёт. ACL могут использовать схему x509 (по умолчанию) или другие поддерживаемые схемы ZooKeeper, такие как digest. Они должны указываться как словарь, где ключ — полное имя субъекта (опционально с префиксом схемы), а значение — список разрешений. Разрешения могут быть одним или несколькими из CREATE, READ, WRITE, DELETE, ADMIN, или ALL. Например, set_acls: {CN=principal1: [CREATE, READ], digest:principal2:+pjROuBuuwNNSujKyH8dGcEnFPQ=: [ALL]}.
  • auth_data: (необязательно) Учетные данные аутентификации для использования при соединении. Должно быть словарем в формате, где scheme — ключ, а credential — значение. По умолчанию — пустой словарь.
Примечание

Необходимо установить kazoo>=2.6.0 для поддержки SSL.


Выставщик

  • hosts: начальный список узлов Exhibitor (ZooKeeper) в формате: ‘host1,host2,etc…’. Этот список обновляется автоматически при изменении топологии кластера Exhibitor (ZooKeeper).
  • poll_interval: с какой частотой следует обновлять список узлов ZooKeeper и Exhibitor из Exhibitor.
  • port: Порт выставки.


Kubernetes

  • bypass_api_service: (необязательно) При взаимодействии с Kubernetes API Patroni обычно полагается на сервис kubernetes , адрес которого экспортируется в подах через переменную окружения KUBERNETES_SERVICE_HOST. Если установлено значение bypass_api_service, равное true, Patroni будет разрешать список узлов API за этим сервисом и подключаться к ним напрямую.
  • namespace: (необязательно) пространство имён Kubernetes, в котором выполняется под Patroni. Значение по умолчанию — default.
  • labels: Метки в формате {label1: value1, label2: value2}. Эти метки будут использоваться для поиска существующих объектов (Pod’ов и либо Endpoints, либо ConfigMaps), связанных с текущим кластером. Также Patroni установит их на каждый объект (Endpoint или ConfigMap), который создаст.
  • scope_label: (необязательно) имя метки, содержащей имя кластера. Значение по умолчанию — cluster-name.
  • bootstrap_labels: (необязательно) Метки в формате {label1: value1, label2: value2}. Эти метки будут присвоены поду Patroni, когда его состояние будет равно initializing new cluster, running custom bootstrap script, starting after custom bootstrap или creating replica.
  • role_label: (необязательно) имя метки, содержащей роль (primary, replica или другое пользовательское значение). Patroni установит эту метку в поде, в котором выполняется. Значение по умолчанию — role.
  • leader_label_value: (необязательно) значение метки пода при роли Postgres primary. Значение по умолчанию — primary.
  • follower_label_value: (необязательно) значение метки пода при роли Postgres replica. Значение по умолчанию — replica.
  • standby_leader_label_value: (необязательно) значение метки пода при роли Postgres standby_leader. Значение по умолчанию — primary.
  • tmp_role_label: (необязательно) имя временной метки, содержащей роль (primary или replica). Значение этой метки всегда будет использовать значение по умолчанию, соответствующее роли. Устанавливать только при необходимости.
  • use_endpoints: (необязательно) если установлено в true, Patroni будет использовать Endpoints вместо ConfigMaps для проведения выборов лидера и хранения состояния кластера.
  • pod_ip: (необязательно) IP-адрес пода, в котором работает Patroni. Это значение необходимо, когда включён use_endpoints, и используется для заполнения подмножеств конечных точек лидера при повышении пода PostgreSQL до роли лидера.
  • ports: (необязательно) если у объекта Service указано имя порта, то это же имя должно присутствовать в объекте Endpoint, иначе сервис не будет работать. Например, если ваш сервис определён как {Kind: Service, spec: {ports: [{name: postgresql, port: 5432, targetPort: 5432}]}}, необходимо установить kubernetes.ports: [{"name": "postgresql", "port": 5432}], и Patroni будет использовать его для обновления подмножеств лидера Endpoint. Этот параметр используется только в случае, если установлено kubernetes.use_endpoints.
  • cacert: (необязательно) Указывает файл с CA_BUNDLE файлом сертификатов доверенных ЦС, используемых при проверке сертификатов Kubernetes API SSL. Если не указано, Patroni будет использовать значение, предоставленное секретом ServiceAccount.
  • retriable_http_codes: (необязательно) список кодов состояния HTTP от K8s API, при которых следует повторить попытку. По умолчанию Patroni повторяет попытку при кодах 500, 503 и 504, либо если ответ K8s API содержит заголовок retry-after HTTP.


Raft (устаревший)

  • self_addr: ip:port для прослушивания соединений Raft. self_addr должен быть доступен с других узлов кластера. Если не задан, узел не будет участвовать в согласовании.

  • bind_addr: (необязательно) ip:port для прослушивания соединений Raft. Если не указано, будет использован self_addr.

  • partner_addrs: список других узлов Patroni в кластере в формате:

    ′ip1:port′,′ip2:port′,′etc...′'ip1:port', 'ip2:port', 'etc...'
  • data_dir: каталог для хранения журнала Raft и снимков. Если не указан, используется текущий рабочий каталог.

  • password: (необязательно) Шифровать трафик Raft с помощью указанного пароля, требуется модуль cryptography python.

  • min_timeout: (необязательно) минимальный тайм-аут выборов в секундах для лежащей в основе реализации Raft pysyncobj. Должен быть больше 3 * append_entries_period. Значение по умолчанию: 0.4.

  • max_timeout: (необязательно) максимальный тайм-аут голосования в секундах для лежащей в основе реализации Raft pysyncobj. Должен быть больше, чем min_timeout. Значение по умолчанию: 1.4.

  • connection_timeout: (необязательно) время в секундах, по истечении которого соединение без полученных данных считается неработоспособным. Должно быть больше или равно max_timeout. Значение по умолчанию: 3.5.

  • append_entries_period: (необязательно) интервал в секундах для отправки команды heartbeat (append_entries). Должен быть меньше одной трети min_timeout. Значение по умолчанию: 0.1.

  • connection_retry_time: (необязательно) интервал в секундах между попытками повторного подключения к оффлайн-узлам. По умолчанию: 5.0.

  • leader_fallback_timeout: (необязательно) время в секундах, по истечении которого лидер, не получивший ответ от большинства, возвращается в состояние последователя. Должно быть больше, чем append_entries_period. Значение по умолчанию: 30.0.

Примечание

Эти параметры тайм-аута полезны в сетях с высокой задержкой, где значения тайм-аутов по умолчанию для pysyncobj слишком агрессивны. Должны выполняться следующие ограничения: min_timeout > 3 * append_entries_period, max_timeout > min_timeout, connection_timeout >= max_timeout, и leader_fallback_timeout > append_entries_period. Patroni проверяет эти условия при запуске и откажется запускаться при их нарушении. Эти значения нельзя изменить во время работы и требуют перезапуска.

[!WARNING] Эти параметры влияют только на тайм-ауты выбора и соединения в pysyncobj; они не увеличивают предельное время выполнения команд, применяемое Patroni к операциям Raft. Каждая команда Raft (обновление блокировки лидера, запись состояния кластера) должна завершиться в течение retry_timeout (по умолчанию 10). При очень высокой задержке — примерно выше нескольких секунд времени отклика — одна команда может превысить retry_timeout даже при увеличении connection_timeout значительно выше RTT, поэтому DCS может стать недоступным, и первичный сервер может быть понижен. В таких условиях необходимо также увеличить retry_timeout и ttl соответственно, сохраняя loop_wait + 2 * retry_timeout <= ttl.

Кратко о реализации Raft FAQ

  • Вопрос: Как вывести список всех узлов, обеспечивающих согласованность?

    A: syncobj_admin -conn host:port -status, где host:port — это адрес одного из узлов кластера

  • Вопрос: Узел, который участвовал в консенсусе, покинул кластер, и я не могу повторно использовать тот же IP-адрес для другого узла. Как удалить этот узел из консенсуса?

    A: syncobj_admin -conn host:port -remove host2:port2, где host2:port2 — это адрес узла, который необходимо удалить из консенсуса.

  • Q: Откуда получить утилиту syncobj_admin?

    A: Устанавливается вместе с модулем pysyncobj (реализация python RAFT), который является зависимостью Patroni.

  • Q: возможно ли запуск узла Patroni без добавления в консенсус?

    A: Да, просто закомментируйте или удалите raft.self_addr из конфигурации Patroni.

  • В: Можно ли запускать Patroni и PostgreSQL только на двух узлах?

    A: Да, на третьем узле можно запустить patroni_raft_controller (без Patroni и PostgreSQL). При таком подходе можно временно потерять один узел, не затронув первичный сервер.


PostgreSQL

  • postgresql:
    • authentication:

      • superuser:
        • username: имя суперпользователя, задаётся при инициализации (initdb) и позже используется Patroni для подключения к postgres.
        • password: пароль для суперпользователя, устанавливается во время инициализации (initdb).
        • sslmode: (необязательно) соответствует параметру соединения sslmode , позволяющему клиенту указать тип режима согласования TLS с сервером. Дополнительную информацию о работе каждого режима см. в документации PostgreSQL . Режим по умолчанию — prefer.
        • sslkey: (необязательно) соответствует параметру соединения sslkey , который указывает расположение секретного ключа, используемого с сертификатом клиента.
        • sslpassword: (необязательно) соответствует параметру соединения sslpassword , который указывает пароль для секретного ключа, указанного в sslkey.
        • sslcert: (необязательно) соответствует параметру соединения sslcert , который указывает расположение сертификата клиента.
        • sslrootcert: (необязательно) соответствует параметру соединения sslrootcert , который указывает расположение файла, содержащего один или несколько сертификатов центров сертификации (CA), которые клиент будет использовать для проверки сертификата сервера.
        • sslcrl: (необязательно) соответствует параметру соединения sslcrl , который указывает расположение файла, содержащего список отозванных сертификатов. Клиент откажет в подключении к любому серверу, сертификат которого находится в этом списке.
        • sslcrldir: (необязательно) соответствует параметру соединения sslcrldir , который указывает расположение каталога, содержащего файлы со списками отозванных сертификатов. Клиент откажет в подключении к любому серверу, сертификат которого содержится в этом списке.
        • sslnegotiation: (необязательно) соответствует параметру соединения sslnegotiation , управляющему процессом согласования SSL шифрования с сервером, если используется SSL.
        • gssencmode: (необязательно) соответствует параметру соединения gssencmode , определяющему, будет ли устанавливаться защищённое соединение GSS TCP/IP с сервером, и с какой приоритетностью
        • channel_binding: (необязательно) отображается на параметр соединения channel_binding , управляющий использованием клиентом привязки канала.
      • replication:
        • username: имя пользователя для репликации; пользователь будет создан во время инициализации. Реплики будут использовать этого пользователя для доступа к источнику репликации через потоковую репликацию
        • password: пароль репликации; пользователь будет создан во время инициализации.
        • sslmode: (необязательно) соответствует параметру соединения sslmode , позволяющему клиенту указать тип режима согласования TLS с сервером. Дополнительную информацию о работе каждого режима см. в документации PostgreSQL . Режим по умолчанию — prefer.
        • sslkey: (необязательно) соответствует параметру соединения sslkey , который указывает расположение секретного ключа, используемого с сертификатом клиента.
        • sslpassword: (необязательно) соответствует параметру соединения sslpassword , который указывает пароль для секретного ключа, указанного в sslkey.
        • sslcert: (необязательно) соответствует параметру соединения sslcert , который указывает расположение сертификата клиента.
        • sslrootcert: (необязательно) соответствует параметру соединения sslrootcert , который указывает расположение файла, содержащего один или несколько сертификатов центров сертификации (CA), которые клиент будет использовать для проверки сертификата сервера.
        • sslcrl: (необязательно) соответствует параметру соединения sslcrl , который указывает расположение файла, содержащего список отозванных сертификатов. Клиент откажет в подключении к любому серверу, сертификат которого находится в этом списке.
        • sslcrldir: (необязательно) соответствует параметру соединения sslcrldir , который указывает расположение каталога, содержащего файлы со списками отозванных сертификатов. Клиент откажет в подключении к любому серверу, сертификат которого содержится в этом списке.
        • sslnegotiation: (необязательно) соответствует параметру соединения sslnegotiation , управляющему процессом согласования SSL шифрования с сервером, если используется SSL.
        • gssencmode: (необязательно) соответствует параметру соединения gssencmode , определяющему, будет ли устанавливаться защищённое соединение GSS TCP/IP с сервером, и с какой приоритетностью
        • channel_binding: (необязательно) отображается на параметр соединения channel_binding , управляющий использованием клиентом привязки канала.
      • rewind:
        • username: (необязательно) имя пользователя для pg_rewind; пользователь будет создан при инициализации postgres 11+ и будут выданы все необходимые разрешения .
        • password: (необязательно) пароль для пользователя для pg_rewind; пользователь будет создан при инициализации.
        • sslmode: (необязательно) соответствует параметру соединения sslmode , позволяющему клиенту указать тип режима согласования TLS с сервером. Дополнительную информацию о работе каждого режима см. в документации PostgreSQL . Режим по умолчанию — prefer.
        • sslkey: (необязательно) соответствует параметру соединения sslkey , который указывает расположение секретного ключа, используемого с сертификатом клиента.
        • sslpassword: (необязательно) соответствует параметру соединения sslpassword , который указывает пароль для секретного ключа, указанного в sslkey.
        • sslcert: (необязательно) соответствует параметру соединения sslcert , который указывает расположение сертификата клиента.
        • sslrootcert: (необязательно) соответствует параметру соединения sslrootcert , который указывает расположение файла, содержащего один или несколько сертификатов центров сертификации (CA), которые клиент будет использовать для проверки сертификата сервера.
        • sslcrl: (необязательно) соответствует параметру соединения sslcrl , который указывает расположение файла, содержащего список отозванных сертификатов. Клиент откажет в подключении к любому серверу, сертификат которого находится в этом списке.
        • sslcrldir: (необязательно) соответствует параметру соединения sslcrldir , который указывает расположение каталога, содержащего файлы со списками отозванных сертификатов. Клиент откажет в подключении к любому серверу, сертификат которого содержится в этом списке.
        • sslnegotiation: (необязательно) соответствует параметру соединения sslnegotiation , управляющему процессом согласования SSL шифрования с сервером, если используется SSL.
        • gssencmode: (необязательно) соответствует параметру соединения gssencmode , определяющему, будет ли устанавливаться защищённое соединение GSS TCP/IP с сервером, и с какой приоритетностью
        • channel_binding: (необязательно) отображается на параметр соединения channel_binding , управляющий использованием клиентом привязки канала.
    • callbacks: скрипты обратного вызова, выполняемые при выполнении определённых действий. Patroni передаёт действие, роль и имя кластера. (См. scripts/aws.py как пример написания таких скриптов.)

      • on_reload: выполните этот скрипт при срабатывании перезагрузки конфигурации.
      • on_restart: запустите этот скрипт при перезапуске postgres (без изменения роли).
      • on_role_change: запустите этот скрипт при повышении или понижении уровня postgres.
      • on_start: запустите этот скрипт при запуске postgres.
      • on_stop: запустите этот скрипт при остановке postgres.
    • connect_address: IP-адрес + порт, через которые PostgreSQL доступен с других узлов и приложений.

    • proxy_address: IP-адрес + порт, через которые доступен пул соединений (e.g. PgBouncer), работающий рядом с Postgres. Значение записывается в ключ участник в DCS как proxy_url и может быть полезно для обнаружения сервисов.

    • create_replica_methods: упорядоченный список методов создания для преобразования узла Patroni в новую реплику. Метод “basebackup” используется по умолчанию; другие методы предполагают указание скриптов, каждый из которых настраивается как отдельный элемент конфигурации. Дополнительные сведения см. в документации по настраиваемым методам создания реплик .

    • data_dir: Расположение каталога данных PostgreSQL, либо существующего , либо подлежащего инициализации Patroni.

    • config_dir: Расположение каталога конфигурации PostgreSQL, по умолчанию — каталог данных. Должен быть доступен для записи Patroni.

    • bin_dir: (необязательно) Путь к исполняемым файлам PostgreSQL (pg_ctl, initdb, pg_controldata, pg_basebackup, postgres, pg_isready, pg_rewind). Если не указан или пустая строка, для поиска исполняемых файлов будет использоваться переменная среды PATH.

    • bin_name: (необязательно) Позволяет переопределить имена бинарных файлов Postgres, если используется пользовательская сборка Postgres:

      • pg_ctl: (необязательно) Пользовательское имя для бинарного файла pg_ctl.
      • initdb: (необязательно) Собственное имя для бинарного файла initdb.
      • pgcontroldata: (необязательно) Собственное имя для бинарного файла pg_controldata.
      • pg_basebackup: (необязательно) Пользовательское имя для бинарного файла pg_basebackup.
      • postgres: (необязательно) Пользовательское имя для бинарного файла postgres.
      • pg_isready: (необязательно) Пользовательское имя для бинарного файла pg_isready.
      • pg_rewind: (необязательно) Пользовательское имя для бинарного файла pg_rewind.
    • listen: IP-адрес и порт, на которых слушает PostgreSQL; должен быть доступен с других узлов кластера, если используется потоковая репликация. Разрешено несколько адресов, разделённых запятыми, при условии, что компонент порта указывается после последнего адреса через двоеточие, i.e. listen: 127.0.0.1,127.0.0.2:5432. Patroni будет использовать первый адрес из этого списка для установления локальных соединений с узлом PostgreSQL.

    • use_unix_socket: указывает, что Patroni должен предпочитать использование Unix-сокетов для подключения к кластеру. Значение по умолчанию — false. Если задано unix_socket_directories, Patroni будет использовать первое подходящее значение из него для подключения к кластеру и перейдёт на tcp, если ни одно значение не подходит. Если unix_socket_directories не указано в postgresql.parameters, Patroni предположит, что следует использовать значение по умолчанию, и опустит host из параметров соединения.

    • use_unix_socket_repl: указывает, что Patroni должен предпочитать использование Unix-сокетов для соединения с кластером пользователя репликации. Значение по умолчанию — false. Если задано unix_socket_directories, Patroni будет использовать первое подходящее значение из него для подключения к кластеру и перейдёт на tcp, если ни одно значение не подходит. Если unix_socket_directories не указано в postgresql.parameters, Patroni предположит, что следует использовать значение по умолчанию, и опустит host из параметров соединения.

    • pgpass: путь к файлу паролей .pgpass . Patroni создаёт этот файл перед выполнением pg_basebackup, скрипта post_init, а также при некоторых других обстоятельствах. Расположение должно быть доступно для записи Patroni.

    • recovery_conf: дополнительные параметры конфигурации, записываемые в recovery.conf при настройке последователя.

    • custom_conf : путь к необязательному файлу postgresql.conf, который будет использован вместо postgresql.base.conf. Файл должен существовать на всех узлах кластера, быть доступным для чтения PostgreSQL и будет включён из его расположения в реальном postgresql.conf. Обратите внимание, что Patroni не будет отслеживать изменения в этом файле, ни резервировать его. Однако его настройки всё ещё могут быть переопределены средствами конфигурации Patroni — см. динамическая конфигурация для подробностей.

    • parameters: параметры конфигурации (GUC) для Postgres в формате {ssl: "on", ssl_cert_file: "cert_file"}.

    • parameters_primary: (необязательно) переопределения параметров, специфичных для роли, для первичного сервера. Эти значения объединяются с базовыми parameters и переопределяют их.

    • parameters_replica: (необязательно) переопределения параметров, специфичных для роли реплики. Эти значения объединяются с базовыми parameters и переопределяют их.

    • parameters_standby_leader: (необязательно) переопределения параметров, специфичных для роли, для standby_leader. Эти значения объединяются с базовыми parameters и переопределяют их.

    • pg_hba: список строк, которые Patroni будет использовать для генерации pg_hba.conf. Patroni игнорирует этот параметр, если параметр PostgreSQL hba_file установлен в непо умолчанию значение. Вместе с динамической конфигурацией этот параметр упрощает управление pg_hba.conf.

      • - host all all 0.0.0.0/0 md5
      • - host replication replicator 127.0.0.1/32 md5: Такая строка обязательна для репликации.
    • pg_hba_primary: (необязательно) записи pg_hba, специфичные для роли, для первичного сервера. Они полностью заменяют pg_hba (слияние не производится). Если не определены, используется pg_hba.

    • pg_hba_replica: (необязательно) записи pg_hba, специфичные для роли, для реплики. Они полностью заменяют pg_hba (слияние не происходит). Если не определены, используется pg_hba.

    • pg_hba_standby_leader: (необязательно) записи pg_hba, специфичные для роли, для standby_leader. Они полностью заменяют pg_hba (слияние не происходит). Если не определены, используется pg_hba.

    • pg_ident: список строк, которые Patroni будет использовать для генерации pg_ident.conf. Patroni игнорирует этот параметр, если параметр PostgreSQL ident_file установлен в непо умолчанию значение. Вместе с динамической конфигурацией этот параметр упрощает управление pg_ident.conf.

      • - mapname1 systemname1 pguser1
      • - mapname1 systemname2 pguser2
    • pg_ident_primary: (необязательно) записи pg_ident, специфичные для роли, для первичного сервера. Они полностью заменяют pg_ident (слияние не происходит). Если не определены, используется pg_ident.

    • pg_ident_replica: (необязательно) записи pg_ident, специфичные для роли, для реплики. Они полностью заменяют pg_ident (слияние не происходит). Если не определены, используется pg_ident.

    • pg_ident_standby_leader: (необязательно) записи pg_ident, специфичные для роли, для standby_leader. Они полностью заменяют pg_ident (слияние не происходит). Если не определены, используется pg_ident.

    • pg_ctl_timeout: Сколько времени pg_ctl должен ждать при выполнении start, stop или restart. Значение по умолчанию — 60 секунд.

    • use_pg_rewind: попытайтесь использовать pg_rewind на бывшем лидере при его подключении к кластеру в качестве реплики. Либо кластер должен быть инициализирован с использованием data page checksums (опция --data-checksums для initdb) и/или должно быть установлено значение wal_log_hints, равное on, иначе pg_rewind не будет работать.

    • rewind: (необязательно) пользовательские параметры для передачи команде pg_rewind. Может быть указан как список строк и/или словарей с одним ключом-значением. Запрещённые параметры: target-pgdata, source-pgdata, source-server, write-recovery-conf, dry-run, restore-target-wal, config-file, no-ensure-shutdown, version, и help. Пример использования:

      postgresql:
        rewind:
          - debug
          - progress
          - sync-method: fsync
    • remove_data_directory_on_rewind_failure: Если этот параметр включён, Patroni удалит каталог данных PostgreSQL и повторно создаст реплику. В противном случае будет пытаться следовать новому лидеру. Значение по умолчанию — false.

    • remove_data_directory_on_diverged_timelines: Patroni удалит каталог данных PostgreSQL и повторно создаст реплику, если обнаружит расхождение временных шкал и прежний первичный сервер не сможет начать потоковую передачу от нового первичного сервера. Эта опция полезна, когда невозможно использовать pg_rewind. При проверке расхождения временных шкал в PostgreSQL версий 10 и ранее Patroni попытается подключиться с учётными данными репликации к базе данных «postgres». Следовательно, такой доступ должен быть разрешён в файле pg_hba.conf. Значение по умолчанию — false.

    • replica_method: для каждой create_replica_methods, кроме basebackup, следует добавить секцию конфигурации с тем же именем. В минимальном случае она должна содержать параметр “command” с полным путём к исполняемому скрипту. Остальные параметры конфигурации будут переданы скрипту в виде “параметр=значение”.

    • pre_promote: скрипт fencing, выполняемый при переключении при отказе после получения блокировки лидера, но до повышения реплики в статус лидера. Если скрипт завершается с ненулевым кодом, Patroni не повышает реплику в статус лидера и удаляет ключ лидера из DCS.

    • before_stop: скрипт, выполняемый непосредственно перед остановкой postgres. В отличие от обратного вызова, этот скрипт выполняется синхронно, блокируя завершение работы до завершения его выполнения. Код возврата этого скрипта не влияет на возможность продолжения завершения работы.


REST API

  • restapi:
    • thread_pool_size: размер пула потоков, используемого Patroni для обработки запросов REST API. Минимальное значение — 5, значение по умолчанию — 5.
    • connect_address: IP-адрес (или имя хоста) и порт для доступа к REST API Patroni REST API . Все участники кластера должны иметь возможность подключиться к этому адресу, поэтому, если настройка Patroni не предназначена для демонстрации в пределах localhost, этот адрес должен быть не “localhost” и не адресом петли (например, “localhost” или “127.0.0.1”). Он может использоваться в качестве конечной точки для проверок работоспособности HTTP (см. ниже параметр “listen” REST API), а также для запросов пользователей (напрямую или через REST API), а также для проверок работоспособности, выполняемых участниками кластера во время выборов лидера (например, для определения, продолжает ли лидер работу, или существует ли узел с WAL позицией, опережающей ту, по которой выполняется запрос; и т.д.). connect_address помещается в ключ участника в DCS, что позволяет преобразовать имя участника в адрес для подключения к его REST API.
    • listen: IP-адрес (или имя хоста) и порт, на которых Patroni будет слушать REST API — для обеспечения проверок работоспособности и обмена сообщениями между узлами кластера, как описано выше, а также для предоставления информации о работоспособности HAProxy (или любому другому балансировщику нагрузки, способному выполнять проверки HTTP «OPTION» или «GET»).
    • authentication: (необязательно)
      • username: имя пользователя для аутентификации по методу Basic-auth для защиты небезопасных конечных точек REST API.
      • password: Пароль для аутентификации Basic для защиты небезопасных конечных точек REST API.
    • certfile: (необязательно): Указывает файл с сертификатом в формате PEM. Если certfile не указан или оставлен пустым, сервер API будет работать без SSL.
    • keyfile: (необязательно): Указывает файл с секретным ключом в формате PEM.
    • keyfile_password: (необязательно): Указывает пароль для расшифровки ключевого файла.
    • cafile: (необязательно): Указывает файл с CA_BUNDLE, содержащий сертификаты доверенных ЦС, используемые при проверке сертификатов клиентов.
    • ciphers: (необязательно): указывает разрешённые наборы шифров (e.g. “ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1”)
    • verify_client: (необязательно): none (по умолчанию), optional или required. При установке none REST API проверка сертификатов клиентов не выполняется. При установке required для всех вызовов REST API требуется сертификат клиента. При установке optional для всех небезопасных конечных точек REST API требуется сертификат клиента. При использовании required аутентификация клиента считается успешной, если проверка подписи сертификата прошла успешно. Для optional сертификат клиента проверяется только для запросов PUT, POST, PATCH и DELETE.
    • allowlist: (необязательно): Задаёт набор хостов, которым разрешено вызывать небезопасные конечные точки REST API. Единственный элемент может быть именем хоста, IP-адресом или сетевым адресом в формате CIDR. По умолчанию используется allow all. Если установлены allowlist или allowlist_include_members, то всё, что не включено, отклоняется.
    • allowlist_include_members: (необязательно): если установлено в true, позволяет получать доступ к небезопасным конечным точкам REST API с других участников кластера, зарегистрированных в DCS (IP-адрес или имя хоста берётся из участников api_url). Будьте осторожны — возможно, что ОС будет использовать другой IP-адрес для исходящих соединений.
    • http_extra_headers: (необязательно): заголовки HTTP позволяют серверу REST API передавать дополнительную информацию в ответе HTTP.
    • https_extra_headers: (необязательно): заголовки HTTPS позволяют серверу REST API передавать дополнительную информацию в ответе HTTP при включённом TLS. Это также передаст дополнительную информацию, заданную в http_extra_headers.
    • request_queue_size: (необязательно): устанавливает размер очереди запросов для сокета TCP, используемого Patroni REST API. Как только очередь заполнена, последующие запросы получают ошибку «Соединение отклонено». Значение по умолчанию — 5.
    • server_tokens: (необязательно): настраивает значение заголовка Server HTTP.
      • Minimal: В заголовке будет содержаться только версия Patroni, e.g. Patroni/4.0.0.
      • ProductOnly: Заголовок будет содержать только имя продукта, e.g. Patroni.
      • Original (по умолчанию): заголовок покажет исходное поведение и отобразит версии BaseHTTP и Python, e.g. BaseHTTP/0.6 Python/3.12.3.

Вот пример как http_extra_headers, так и https_extra_headers:

restapi:
  listen: <listen>
  connect_address: <connect_address>
  authentication:
    username: <username>
    password: <password>
  http_extra_headers:
    'X-Frame-Options': 'SAMEORIGIN'
    'X-XSS-Protection': '1; mode=block'
    'X-Content-Type-Options': 'nosniff'
  cafile: <ca file>
  certfile: <cert>
  keyfile: <key>
  https_extra_headers:
    'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'

Предупреждение

  • restapi.connect_address должен быть доступен со всех узлов заданного кластера Patroni. Внутри Patroni он используется во время выбора лидера для определения узлов с минимальной задержкой репликации.
  • Если включена проверка сертификатов клиентов (значение restapi.verify_client установлено в required), также обязательно предоставить действительные сертификаты клиентов в ctl.certfile, ctl.keyfile, ctl.keyfile_password. Если они не предоставлены, Patroni будет работать некорректно.


CTL

  • ctl: (необязательно)
    • authentication:
      • username: имя пользователя для аутентификации по методу Basic-auth при доступе к защищённым конечным точкам REST API. Если не указано, patronictl будет использовать значение, указанное для параметра “username” REST API.
      • password: Пароль для аутентификации Basic-auth при доступе к защищённым конечным точкам REST API. Если не указан, patronictl будет использовать значение, указанное для параметра “password” REST API.
    • insecure: Разрешить соединения с REST API без проверки сертификатов SSL.
    • cacert: Указывает файл с CA_BUNDLE файлом или каталогом сертификатов доверенных ЦС, используемых при проверке REST API SSL сертификатов. Если не указано, patronictl будет использовать значение, заданное для параметра REST API “cafile”.
    • certfile: Указывает файл с клиентским сертификатом в формате PEM.
    • keyfile: Указывает файл с секретным ключом клиента в формате PEM.
    • keyfile_password: Указывает пароль для расшифровки ключевого файла клиента.

Сторожевой таймер

  • mode: off, automatic или required. При off сторожевой таймер отключён. При automatic сторожевой таймер будет использоваться, если доступен, но игнорируется, если недоступен. При required узел не станет лидером, если не удастся успешно включить сторожевой таймер.
  • device: Путь к устройству сторожевого таймера. По умолчанию /dev/watchdog.
  • safety_margin: Количество секунд резерва безопасности между срабатыванием сторожевого таймера и истечением срока ключа лидера.


Теги

  • clonefrom: true или false. Если установлено значение true, другие узлы могут предпочесть использовать этот узел для начальной инициализации (взять pg_basebackup из). Если несколько узлов имеют тег clonefrom, установленный в true, узел для начальной инициализации будет выбран случайным образом. Значение по умолчанию — false.
  • noloadbalance: true или false. Если установлено true, узел вернёт код состояния HTTP 503 при проверке работоспособности GET /replica REST API и потому будет исключён из балансировки нагрузки. По умолчанию — false.
  • replicatefrom: Имя другой реплики, от которой производится репликация. Используется для поддержки каскадной репликации.
  • nosync: true или false. Если установлено значение true, узел никогда не будет выбран в качестве синхронной реплики.
  • sync_priority: целое число, определяет приоритет данного узла при выборе синхронной реплики, когда synchronous_mode установлено в on. Узлы с более высоким приоритетом предпочтительнее, чем узлы с более низким приоритетом. Если sync_priority равен 0 или отрицательно — такой узел не может быть записан в параметр PostgreSQL synchronous_standby_names (аналогично nosync: true). Имейте в виду, что это параметр имеет противоположное значение по сравнению со значением sync_priority, отображаемым в представлении pg_stat_replication.
  • nofailover: true или false, управляет тем, может ли данный узел участвовать в выборе лидера и стать лидером. Значение по умолчанию — false, что означает, что данный узел может участвовать в выборе лидера.
  • failover_priority: целое число, определяет приоритет данного узла при переключении при отказе. Узлы с более высоким приоритетом предпочтительнее, чем узлы с более низким приоритетом, если они получили/воспроизвели одинаковое количество WAL. Однако узлы с более высокими значениями receive/replay LSN предпочтительнее независимо от их приоритета. Если failover_priority равен 0 или отрицательно — такой узел не может участвовать в выборе лидера и не может стать лидером (аналогично nofailover: true). Известен ограничение: failover_priority в настоящее время не работает с кворумной синхронной репликацией .
  • nostream: true или false. Если установлено значение true, узел не будет использовать протокол репликации для потоковой передачи WAL. Вместо этого он будет полагаться на восстановление из архива (если настроено restore_command) и опрос pg_wal/pg_xlog. Также отключается копирование и синхронизация постоянных слотов репликации на самом узле и всех его каскадных реплик. Установка этого тега на первичном сервере не оказывает эффекта.
Предупреждение

Укажите только один из nofailover или failover_priority. Указание nofailover: true эквивалентно указанию failover_priority: 0, а указание nofailover: false присваивает узлу приоритет 1.

Помимо этих заранее определённых тегов, вы также можете добавлять свои:

  • key1: true
  • key2: false
  • key3: 1.4
  • key4: "RandomString"

Метки видны в REST API и patronictl_list . Также можно проверить состояние экземпляра с помощью этих меток. Если метка не определена для экземпляра или значение не соответствует запрашиваемому, будет возвращён код состояния HTTP 503.