Перейти к основному содержимому

Создание реплик и инициализация

примечание

Эта страница переведена при помощи нейросети GigaChat.

Patroni позволяет настраивать создание новой реплики. Он также поддерживает определение того, что происходит при начальной загрузке нового пустого кластера. Различие между ними хорошо определено: Patroni создает реплики только в том случае, если ключ initialize присутствует в DCS для кластера. Если нет ключа initialize – Patroni вызывает начальную загрузку исключительно на первом узле, который принимает блокировку ключа инициализации.

Инициализация

PostgreSQL предоставляет команду initdb для инициализации нового кластера, и Patroni вызывает ее по умолчанию. В некоторых случаях, особенно когда создается новый кластер в виде копии существующего, необходимо заменить встроенный метод пользовательскими действиями. Patroni поддерживает выполнение сценариев, определенных пользователем, для начальной загрузки новых кластеров, предоставляя им некоторые необходимые аргументы, например имя кластера и путь к каталогу данных. Это настроено в разделе bootstrap конфигурации Patroni. Например:

bootstrap:
method: <custom_bootstrap_method_name>
<custom_bootstrap_method_name>:
command: <path_to_custom_bootstrap_script> [param1 [, ...]]
keep_existing_recovery_conf: False
no_params: False
recovery_conf:
recovery_target_action: promote
recovery_target_timeline: latest
restore_command: <method_specific_restore_command>

Каждый метод начальной загрузки должен определять хотя бы один name и один command. Специальный метод initdb доступен для запуска поведения по умолчанию, в этом случае параметр method может быть полностью опущен. Путь command может быть указан в виде абсолютного пути, либо в виде пути относительно места расположения команды patroni. Помимо фиксированных параметров, определенных в файлах конфигурации, Patroni предоставляет два специфичных для кластера параметра:

  • --scope – имя кластера, который будет загружен;
  • --datadir – путь к каталогу данных загружаемого экземпляра кластера.

Передача этих двух дополнительных флагов может быть отключена путем установки специального параметра no_params на True.

Если сценарий начальной загрузки возвращает 0, Patroni пытается настроить и запустить экземпляр PostgreSQL, созданный им. Если какой-либо из промежуточных шагов завершится сбоем или сценарий вернет ненулевое значение, Patroni предполагает, что начальная загрузка не удалась, запускает очистку и освобождает блокировку инициализации, чтобы предоставить другому узлу возможность выполнить начальную загрузку.

Если блок recovery_conf определен в том же разделе, что и метод начальной загрузки, Patroni сгенерирует recovery.conf перед запуском нового загруженного экземпляра (или установите параметры восстановления в конфигурации Postgres, если выполняется PostgreSQL & gt; = 12). Обычно такая конфигурация восстановления должна содержать по крайней мере один из параметров recovery_target_*, вместе с установленным значением recovery_target_timeline на promote.

Если keep_existing_recovery_conf определен и установлен на True, Patroni не удаляет существующий файл recovery.conf, если он существует (PostgreSQL <= 11). Аналогично, в этом случае Patroni не удаляет существующие файлы recovery.signal или standby.signal, если они существуют, и не переопределяет настроенные параметры восстановления (PostgreSQL >= 12). Это полезно при выполнении начальной загрузки из резервной копии с помощью таких инструментов, как pgBackRest, которые генерируют соответствующую конфигурацию восстановления.

Кроме того, любые дополнительные пары ключ/значение, указанные в конфигурации метода пользовательской начальной загрузки, будут переданы в качестве аргументов к command в формате --name=value. Например:

bootstrap:
method: <custom_bootstrap_method_name>
<custom_bootstrap_method_name>:
command: <path_to_custom_bootstrap_script>
arg1: value1
arg2: value2

Делает сконфигурированную команду command вызываемой дополнительно с аргументами командной строки --arg1=value1 --arg2=value2.

Примечание

Методы начальной загрузки не объединяются и не возвращаются к методу по умолчанию в случае сбоя основного метода

Создание реплик

Patroni использует проверенные и доказанные pg_basebackup для создания новых реплик. Один из недостатков является то, что он требует работающего узла-лидера. Другой недостаток – отсутствие сжатия данных резервного копирования на «лету» для резервных данных и отсутствие встроенной очистки устаревших файлов резервных копий. Некоторые предпочитают другие решения для резервного копирования, такие как WAL-E, pgBackRest, Barman и другие, или просто создают свои собственные сценарии. Чтобы удовлетворить все эти варианты использования, Patroni поддерживает выполнение пользовательских сценариев для клонирования новой реплики. Они настроены в блоке конфигурации postgresql:

postgresql:
create_replica_methods:
- <method name>
<method name>:
command: <command name>
keep_data: True
no_params: True
no_leader: 1

пример wal_e:

postgresql:
create_replica_methods:
- wal_e
- basebackup
wal_e:
command: patroni_wale_restore
no_leader: 1
envdir: {{WALE_ENV_DIR}}
use_iam: 1
basebackup:
max-rate: '100M'

пример pgbackrest:

postgresql:
create_replica_methods:
- pgbackrest
- basebackup
pgbackrest:
command: /usr/bin/pgbackrest --stanza=<scope> --delta restore
keep_data: True
no_params: True
basebackup:
max-rate: '100M'

create_replica_methods определяет доступные методы создания реплик и порядок их выполнения. Patroni остановится на первом методе, который вернет 0. Каждый метод должен определять отдельный раздел в файле конфигурации, перечисляя команду для выполнения и любые специальные параметры, которые должны быть переданы этой команде. Все параметры будут передаваться в формате --name=value. Помимо параметров, определяемых пользователем, Patroni предоставляет несколько специфичных для кластера:

  • [\--scope]{.kbd} – кластер, которому принадлежит эта реплика;
  • [\--datadir]{.kbd} – путь к каталогу данных реплики;
  • [\--role]{.kbd} – всегда «реплика»;
  • [\--connstring]{.kbd} – строка соединения для подключения к участнику кластера, с которого будет выполняться клонирование (основная или другая реплика). Пользователь в строке подключения может выполнять команды SQL и протокола репликации.

Специальный параметр no_leader , если он определен, позволяет Patroni вызывать метод создания реплики, даже если нет запущенного лидера или реплик. В этом случае в строке соединения будет передана пустая строка. Это полезно для восстановления ранее запущенного кластер из бинарной резервной копии.

Специальный параметр keep_data, если он определен, указывает Patroni не очищать папку PGDATA перед вызовом restore.

Специальный параметр no_params, если он определен, ограничивает передачу параметров в пользовательскую команду.

Метод basebackup – это особый случай: он будет использоваться, если create_replica_methods пуст, хотя его можно явно перечислить среди методов create_replica_methods. Этот метод инициализирует новую реплику с помощью pg_basebackup, базовая резервная копия берется из лидера, если только не существует реплик с меткой clonefrom, в этом случае одна из таких реплик будет использована в качестве источника для pg_basebackup. Метод работает без какой-либо конфигурации; однако можно указать раздел конфигурации basebackup. Здесь действуют те же правила, что и при конфигурировании других методов, а именно, следует указывать только длинные (с -) параметры. Не все параметры имеют смысл. Если переопределить соединение или указать опцию создания резервных копий базы в tar- или сжатом виде, patroni не сможет создать из них реплику. Никакой проверки имен или значений параметров, передаваемых в секцию basebackup, не выполняется. Также обратите внимание, что в случае использования символьных ссылок для каталога WAL, пользователю придется указать правильный путь --waldir в качестве опции, чтобы после сборки реплики или повторной инициализации символьная ссылка сохранилась. Эта опция поддерживается только с версии 10.

Параметры basebackup можно задавать в виде карты (пары ключ-значение) или списка элементов, где каждый элемент может быть как парой ключ-значение, так и одним ключом (для опций, не принимающих значений, например, --verbose). Рассмотрим эти два примера:

postgresql:
basebackup:
max-rate: '100M'
checkpoint: 'fast'

и

postgresql:
basebackup:
- verbose
- max-rate: '100M'
- waldir: /pg-wal-mount/external-waldir

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

Резервный кластер

Другой доступный вариант – запустить «резервный кластер», состоящий только из резервных узлов, реплицирующихся с какого-то удаленного узла. Этот тип кластеров имеет:

  • «резервный лидер», который ведет себя практически так же, как и обычный лидер кластера, за исключением того, что он реплицируется с удаленного узла;
  • каскадные реплики, которые реплицируются с резервного лидера.

Резервный лидер удерживает и обновляет блокировку лидера в DCS. Если срок действия блокировки лидера истекает, каскадные реплики выполняют выборы, чтобы выбрать другого лидера из резервных.

Между резервным кластером и основным кластером, с которого он реплицируется, нет никаких дополнительных отношений, в частности, они не должны использовать одну и ту же область действия DCS, если они используют один и тот же DCS. Кроме информации о репликации, они больше ничего не знают друг о друге. Кроме того, резервный кластер не отображается patronictl list или patronictl topology на первичном кластере.

Для обеспечения гибкости можно указать методы создания реплик и восстановительных WAL-записей, когда кластер находится в «режиме ожидания», указав ключ create_replica_methods в секции standby_cluster. Это отличается от создания реплик, когда кластер отсоединен и функционирует как обычный кластер, что контролируется ключом create_replica_methods в секции postgresql. И «standby», и «normal» create_replica_methods ссылаются на ключи в секции postgresql.

Чтобы настроить такой кластер, необходимо указать секцию standby_cluster в конфигурации Patroni:

bootstrap:
dcs:
standby_cluster:
host: {IP-Address}
port: 5432
primary_slot_name: patroni
create_replica_methods:
- basebackup

Обратите внимание, что эти опции будут применены только один раз во время загрузки кластера, и единственный способ изменить их впоследствии – через DCS.

Patroni ожидает найти postgresql.conf или postgresql.conf.backup в PGDATA удаленного основного сервера и не будет запускаться, если не найдет его после базового резервного копирования. Если удаленный основной сервер хранит свой postgresql.conf где-то еще, то необходимо скопировать его в PGDATA.

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