27.3. Администрирование #
- 27.3.1. Изменение состава кластера
- 27.3.2. Изменение конфигурационных параметров
- 27.3.3. Ручное переключение узлов
- 27.3.4. Управление SSL для служебных подключений
- 27.3.5. Роли
- 27.3.6. Использование сервисного режима
- 27.3.7. Автоматическая синхронизация кластера после аварийного переключения
- 27.3.8. Восстановление узла из состояния
NODE_ERROR- 27.3.9. Механизм защиты от зависания (watchdog)
- 27.3.10. Настройка репликации
- 27.3.11. Протоколирование
- 27.3.12. Функции-обработчики
- 27.3.13. Управление расширением proxima
- 27.3.14. Восстановление из резервной копии
- 27.3.15. Миграция
- 27.3.16. Выключение расширения biha
- 27.3.17. Удаление расширения biha
- 27.3.2. Изменение конфигурационных параметров
27.3.1. Изменение состава кластера #
Состав кластера можно изменить следующим образом:
Чтобы добавить узел, используйте команду bihactl node add с соответствующими параметрами.
Чтобы добавить сегмент, используйте функцию biha.add_node.
Чтобы добавить узел в определённый сегмент или переместить узел из одного сегмента в другой, используйте функцию biha.set_parent, а затем примените изменения с помощью функции biha.apply_topology.
Чтобы удалить узел или сегмент, используйте функцию biha.remove_node.
Чтобы изменить лидера вручную, используйте функцию biha.set_leader. За подробной информацией обратитесь к разделу Ручное переключение узлов.
27.3.2. Изменение конфигурационных параметров #
Изменить параметры конфигурации кластера можно следующим образом:
Некоторые параметры конфигурации BiHA являются общими для всех узлов кластера. Они должны иметь одинаковое значение на всех узлах, а задавать их можно только на лидере с помощью специальных функций. Например, чтобы установить значение параметра biha.heartbeat_max_lost, используйте функцию biha.set_heartbeat_max_lost:
SELECT biha.set_heartbeat_max_lost(7);
Все доступные функции для настройки общих параметров конфигурации перечислены в разделе Общая конфигурация кластера.
Параметры конфигурации, критичные для GDBiHA-кластеров, хранятся в файле
pg_biha/biha.confи не могут быть изменены черезALTER SYSTEM. Чтобы их изменить, необходимо использовать специальные функции. За подробной информацией обратитесь к Подразделу 27.4.1.2.Параметры BiHA, значения которых могут различаться на разных узлах кластера, можно изменять с помощью команды
ALTER SYSTEM. Например, параметр biha.can_be_leader можно изменить черезALTER SYSTEM:ALTER SYSTEM SET biha.can_be_leader = true; SELECT pg_reload_conf();
Более подробную информацию о доступных параметрах конфигурации BiHA и способах их настройки см. в Подразделе 27.4.1.
За подробной информацией об уменьшении значений параметров конфигурации Postgres Pro обратитесь к разделу Конфигурация Postgres Pro.
27.3.3. Ручное переключение узлов #
Помимо встроенных возможностей автоматического аварийного переключения узлов, решение BiHA поддерживает ручное переключение как для стандартных BiHA-кластеров, так и для GDBiHA-кластеров. Ручное переключение можно выполнить с помощью функции biha.set_leader следующим образом:
Чтобы назначить нового лидера или главного последователя, вызовите функцию
biha.set_leaderс указанием идентификатора узла, который необходимо повысить. В зависимости от сегмента, в котором расположен назначенный узел (сегмент-лидер или сегмент-последователь), узел становится либо лидером, либо главным последователем этого сегмента.Для переключения между сегментами вызовите функцию
biha.set_leaderс указанием идентификатора сегмента, который необходимо повысить до сегмента-лидера. После переключения главный последователь повышенного сегмента становится новым лидером, а бывший лидер становится главным последователем своего сегмента.
При назначении нового лидера или главного последователя происходит следующее:
Состояние назначенного узла меняется на
FOLLOWER_OFFERED.Все попытки начать выборы блокируются.
Текущий лидер меняет своё состояние на
LEADER_RO. При переключении главного последователя его состояние остаётся неизменным (FRONT_FOLLOWER).FOLLOWER_OFFEREDищет наиболее актуальный источник репликации в своём сегменте и настраивает репликацию с этого источника.Когда узел в состоянии
FOLLOWER_OFFEREDобнаруживает, что в кластере отсутствует лидер в состоянииLEADER_RW, и при этом обладает наибольшим количеством данных в рамках сегмента, он становится новым лидером или главным последователем.Если процесс переключения не завершается в течение установленного параметром biha.no_wal_on_follower тайм-аута, назначенный узел возвращается в роль последователя, а текущий лидер или главный последователь сохраняет свою роль. Однако при отсутствии лидера или главного последователя происходят автоматические выборы нового лидера или главного последователя.
27.3.4. Управление SSL для служебных подключений #
Можно включать или отключать SSL для служебных подключений в инициализированном BiHA-кластере с помощью параметра конфигурации biha.use_ssl.
Чтобы включить SSL, на всех узлах кластера для параметра biha.use_ssl установите значение
true:ALTER SYSTEM SET biha.use_ssl = true;
Чтобы отключить SSL, установите значение
false.Остановите и запустите узлы с помощью pg_ctl.
Важно
Лидер необходимо останавливать последним, а запускать первым. Так как включение SSL в BiHA-кластере подразумевает использование стандартного процесса начального согласования TLS, рекомендуется минимизировать временной промежуток между остановкой и запуском узлов кластера.
27.3.5. Роли #
При инициализации отказоустойчивого кластера создаётся база данных biha_db, также в схеме biha базы данных biha_db создаётся расширение biha. Кроме того, создаются и используются следующие роли:
BIHA_CLUSTER_MANAGEMENT_ROLE— отвечает за выполнение всех функций расширения biha.BIHA_REPLICATION_ROLE— используется при работе pg_rewind и pg_probackup.biha_replication_user— является членом ролейBIHA_REPLICATION_ROLEиBIHA_CLUSTER_MANAGEMENT_ROLEи может совершать как клиентские подключения, так и подключения по протоколу репликации. Эта роль используется утилитой bihactl, а также при подключении узла-последователя к узлу-лидеру. Является владельцем базы данныхbiha_db. Пароль для ролиbiha_replication_userв файле паролей должен быть одинаковым на всех узлах BiHA-кластера. Пароль предлагается задать во время создания BiHA-кластера.biha_callbacks_user— по умолчанию исполняет функции-обработчики. Этот пользователь может подключаться к базе данных, но не имеет никаких прав.pg_monitor— предопределённая роль, которая используется для мониторинга состояния BiHA-кластера.
27.3.6. Использование сервисного режима #
BiHA предоставляет функциональность сервисного режима, чтобы временно приостановить работу BiHA. Это может потребоваться, если вы изменили параметры конфигурации и хотите убедиться, что изменения применились на всех узлах кластера.
Когда BiHA находится в сервисном режиме:
последователи продолжают получать WAL
выборы отменяются и ни один узел не может выставить себя кандидатом
лидера можно переключить вручную
Сервисным режимом можно управлять, вызвав функцию biha.service_mode на лидере.
С помощью функции biha.service_mode можно выполнить следующие действия:
Включить сервисный режим, установив для параметра
enableфункцииbiha.service_modeзначениеtrue:SELECT biha.service_mode(true);
Отключить сервисный режим, установив для параметра
enableфункцииbiha.service_modeзначениеfalse:SELECT biha.service_mode(false);
При отключении сервисного режима BiHA проверяет, были ли параметры, изменённые в сервисном режиме, применены на всех узлах кластера. Если найдены неприменённые параметры, сервисный режим не отключается, а функция возвращает ошибки с перечислением всех неприменённых параметров. Например:
biha _db=# SELECT biha.service_mode (false); ERROR: [BiHA] Config changes HINT: Some parameters have been changed but not applied: Node 3: max_connections To force exit service mode, use: "select * from biha.service_mode(false, true)"
При необходимости можно отключить сервисный режим, игнорируя ошибки, установив для параметра
forceфункцииbiha.service_modeзначениеtrue:SELECT biha.service_mode(false, true);
27.3.7. Автоматическая синхронизация кластера после аварийного переключения #
BiHA обеспечивает автоматическую синхронизацию кластера в случае расхождения линий времени узлов. Например, чтобы вернуть бывшего лидера в кластер после аварийного переключения.
Управлять автоматической синхронизацией в BiHA-кластере можно следующим образом:
Включите автоматическую синхронизацию (automatic rewind), установив для параметра конфигурации biha.autorewind значение
true. Автоматическая синхронизация выполняется, если она может успешно завершиться, то есть если предварительный запуск инструмента pg_rewind с параметром--dry-runпрошёл успешно.При неудачной автоматической синхронизации узел переходит в состояние
NODE_ERROR. В этом случае фактическое состояние синхронизации узла можно найти в файлеbiha.state, как описано в Подразделе 27.3.7.1.Важно
В результате синхронизации могут быть утеряны некоторые записи WAL узла.
Чтобы избежать запуска pg_rewind в тех случаях, когда расхождение WAL вызвано только лишними записями сообщений о контроле состояния, можно воспользоваться возможностью выравнивания WAL, которая управляется с помощью параметра конфигурации biha.autowaltrim. Когда алгоритм выравнивания WAL включён, он находит последнюю общую точку в журналах WAL отклонившегося узла и нового лидера, проверяет, что все последующие записи содержат только сообщения о контроле состояния, и автоматически удаляет эти лишние записи с отклонившегося узла, чтобы он мог продолжить репликацию. Это удобно в случае, когда произошло разделение кластера (split-brain) и бывший лидер возвращается в кластер в качестве последователя, но не может начать репликацию из-за того, что в его WAL содержатся записи сообщений о контроле состояния, сгенерированные, когда он ещё был лидером.
Если процедура выравнивания WAL завершается неудачно, состояние узла изменяется на
NODE_ERROR.Параметры выравнивания WAL можно посмотреть в файле
biha.state. За подробной информацией обратитесь к Подразделу 27.3.7.2.Важно
Если в процессе выравнивания WAL происходит отказ кластера и WAL изменяется некорректно, это может привести к потере записей WAL.
27.3.7.1. Мониторинг результатов синхронизации #
Результаты выполнения операции pg_rewind, т.е. состояние синхронизации узлов кластера, можно проверить в поле rewind_state файла biha.state. Оно содержит значения типа enum, которые интерпретируются следующим образом:
Таблица 27.1. Состояние синхронизации
| Значение | Интерпретация |
|---|---|
0 | Синхронизация не требуется. |
1 | Сервер остановлен, параметр конфигурации biha.autorewind включён, синхронизация будет выполнена после перезапуска сервера. |
2 | Синхронизация завершилась ошибкой. |
3 | Синхронизация выполнена. |
4 | Параметр конфигурации biha.autorewind не был включён, синхронизацию необходимо выполнить вручную, как описано в Восстановление узла из состояния NODE_ERROR. |
27.3.7.2. Мониторинг параметров выравнивания WAL #
Параметры выравнивания WAL узлов кластера можно проверить в следующих полях файла biha.state:
waltrim_state: текущее состояние выполнения процедуры выравнивания WALwaltrim_common_tli: линия времени последней общей точкиwaltrim_start_lsn: начало диапазона рассинхронизации WAL, вызванной лишними сообщениями о контроле состоянияwaltrim_end_lsn: конец диапазона рассинхронизации WAL, вызванной лишними сообщениями о контроле состояния
27.3.8. Восстановление узла из состояния NODE_ERROR #
Описанные ниже ошибки, возникающие в процессах biha или экземпляра сервера, могут привести к отказу узла, то есть он не сможет перезагрузиться и WAL будет повреждён:
Синхронизация, автоматически выполняемая расширением biha с использованием pg_rewind при расхождении линий времени узла.
Процесс walreceiver в случае расхождения линий времени. WAL узла-последователя может быть частично перезаписан WAL, полученным от узла-лидера.
Примечание
Если узел перешел в состояние
NODE_ERRORиз-за других проблем, например, по причине переполнения слота репликации, после устранения первопричины можно вызвать функцию biha.reset_node_error для сброса состоянияNODE_ERROR.Не рекомендуется изменять какие-либо параметры конфигурации кластера, пока один из узлов находится в состоянии
NODE_ERROR, так как на этом узле изменения могут не примениться.
Когда узел переходит в состояние NODE_ERROR, восстановление WAL приостанавливается и процесс walreceiver завершается. Узлы в состоянии NODE_ERROR не могут голосовать на выборах. Чтение с таких узлов запрещено. Кроме того, сведения об ошибке сохраняются в файле biha.state и проверяются при перезапуске узла, поэтому узел перейдёт в то же состояние при запуске процесса biha-background-worker.
Чтобы восстановить узел из состояния NODE_ERROR, выполните следующие шаги:
Сохраните последние файлы из каталога
pg_wal, так как некоторые уникальные для этого узла файлы будут перезаписаны утилитой pg_rewind.Чтобы сохранить файлы конфигурации biha, запустите pg_rewind с параметром
--biha, например:pg_rewind --biha --target-pgdata=
путь_к_каталогу_PGDATA_узла_в_NODE_ERROR--source-server='user=biha_replication_user host=адрес_лидераport=порт_лидераdbname=postgres'Важно
Параметр
--bihaнеобходим для сохранения файлов конфигурации расширения biha. Использование pg_rewind в BiHA-кластере без указания параметра--bihaможет вызвать несогласованность конфигурации кластера.При успешной синхронизации информация о состоянии
NODE_ERRORудаляется из файлаbiha.state. Кроме того, строка подключения, указанная в параметре--source-serverутилиты pg_rewind, автоматически сохраняется для параметра конфигурации primary_conninfo в файле postgresql.auto.conf. Это важно для того, чтобы узел продолжил восстанавливаться после перезапуска и достиг точки согласованности, которая представляет собой номер последней записи WAL исходного сервера на момент синхронизации.(Необязательно) Если узел был недоступен долгое время, на восстановленном узле установите для параметра biha.flw_ro значение
off, чтобы предотвратить повреждение данных и чтение неактуальных данных.
27.3.9. Механизм защиты от зависания (watchdog) #
BiHA предоставляет watchdog — специальный защитный механизм, который помогает предотвратить зависание узлов и проблему разделения кластера (split-brain). Механизм watchdog работает следующим образом:
Если процесс biha не отвечает, когда достигнуто значение biha.watchdog_timeout, узел прекращает принимать запросы и его состояние временно изменяется на
NODE_ERROR.Примечание
Запросы от ролей
pg_monitorи$BIHA_USERне блокируются.Следующее сообщение в журнале информирует о проблеме: «The request cannot be processed because the BiHA extension is not responding» (Невозможно обработать запрос, так как расширение BiHA не отвечает).
В зависимости от того, как быстро восстановится процесс biha, происходит следующее:
Если процесс biha восстановится быстро, узел возвращается к нормальной работе, т.е. продолжает принимать запросы и меняет своё состояние на изначальное.
Если процесс biha не восстанавливается в течение значения
biha.watchdog_timeout * 5, во время следующего запроса выполняется попытка отправить сигнал SIGKILL процессу biha. Все обслуживающие процессы перезапускаются, и функциональность узла восстанавливается.
Важно
Если лидер зависает, а другие узлы избирают нового лидера, необходимо восстановить бывшего лидера из состояния NODE_ERROR.
27.3.10. Настройка репликации #
По умолчанию BiHA-кластеры асинхронны. Однако BiHA позволяет создать кластер с кворумной синхронной репликацией.
Кворумная синхронная репликация включается с помощью параметра synchronous_standby_names, где задаётся список имён синхронных резервных узлов и количество синхронных узлов (кворум), ответа от которых должны ожидать транзакции, с методом ANY. За подробной информацией обратитесь к разделу Несколько синхронных резервных серверов. Параметр synchronous_commit используется со значением по умолчанию on.
За подробной информацией обратитесь к следующим разделам:
27.3.10.1. Синхронная репликация и рефери #
Есть несколько особенностей, которые необходимо учитывать при использовании синхронной репликации и узла-рефери. Если для параметра --mode установлено значение referee, рефери не участвует в синхронной репликации. Если установлено значение referee_with_wal, узел может синхронно получать данные. Этот режим позволяет кластеру оставаться доступным в конфигурации 2+1 с --sync-standbys=1, когда узел-последователь вышел из строя и узел-рефери начинает подтверждать транзакции для лидера. Поведение рефери зависит от значения параметра synchronous_commit. Обратите внимание, что если для этого параметра установлено значение remote_apply, рефери не подтверждает транзакции.
27.3.10.2. Включение кворумной синхронной репликации #
Включить кворумную синхронную репликацию можно как при инициализации BiHA-кластера, так и позднее в уже существующем BiHA-кластере.
Важно
Включение кворумной синхронной репликации в BiHA-кластере необратимо. После включения кворумной синхронной репликации сделать BiHA-кластер вновь асинхронным невозможно. Однако можно исключить определённые узлы из списка синхронных резервных узлов с помощью функции biha.remove_from_ssn. Исключённый узел будет работать асинхронно.
Включить кворумную синхронную репликацию можно следующим образом:
При создании BiHA-кластера с нуля или преобразовании существующего кластера включите кворумную синхронную репликацию с помощью параметра --sync-standbys команды bihactl cluster init.
Например, если для кластера из трёх узлов в качестве значения параметра --sync-standbys указать
1, synchronous_standby_names будет выглядеть следующим образом:ANY 1 (biha_node_1,biha_node_2,biha_node_3)
Чтобы включить кворумную синхронную репликацию в существующем BiHA-кластере, используйте функцию biha.set_sync_standbys.
27.3.10.3. Управление репликацией #
Управлять репликацией в BiHA-кластере можно следующим образом:
Для просмотра текущего значения параметра synchronous_standby_names используйте функцию biha.get_ssn.
Чтобы изменить кворум синхронных резервных узлов, т.е. значение, заданное для метода
ANYв параметре synchronous_standby_names, используйте функцию biha.set_sync_standbys. Как правило, это требуется сделать после того, как вы изменили состав BiHA-кластера, добавив узлы с помощью команды bihactl node add или удалив узлы с помощью функции biha.remove_node.Чтобы добавить определённый узел в список синхронных резервных узлов, используйте функцию biha.add_to_ssn.
Чтобы добавить несколько узлов в качестве списка синхронных резервных узлов, используйте функцию biha.set_ssn.
Чтобы исключить определённый узел из списка синхронных резервных узлов, используйте функцию biha.remove_from_ssn. Исключённый узел будет работать асинхронно.
27.3.10.4. Смягчение ограничений кворумной синхронной репликации #
Ограничения кворумной синхронной репликации можно смягчить, чтобы лидер мог продолжать работу, пока часть синхронных резервных узлов временно недоступна. Чтобы включить нестрогую кворумную синхронную репликацию, укажите значение в поле MIN параметра synchronous_standby_names, задающее минимальное количество синхронных резервных узлов, которые должны быть доступны, чтобы лидер продолжил работу. Параметр synchronous_standby_gap остаётся неизменным и сохраняет своё значение по умолчанию, равное 0.
Управлять нестрогой кворумной синхронной репликацией в BiHA-кластере с кворумной синхронной репликацией можно следующим образом:
Чтобы включить нестрогую кворумную синхронную репликацию при инициализации кластера с помощью команды bihactl cluster init, укажите параметр --sync-standbys-min.
Например, если для кластера из трёх узлов в качестве значения параметра--sync-standbys-min указать
0, synchronous_standby_names будет выглядеть следующим образом:ANY 1 MIN 0 (biha_node_1,biha_node_2,biha_node_3)
Чтобы включить нестрогую кворумную синхронную репликацию в существующем кластере или изменить минимальное число кворумных синхронных резервных узлов, используйте функцию biha.set_sync_standbys_min.
Чтобы отключить нестрогую кворумную синхронную репликацию, с помощью функции biha.set_sync_standbys_min установите значение
-1в качестве минимального числа синхронных резервных узлов.
27.3.10.5. Настройка каскадной репликации #
Решение BiHA предоставляет ряд параметров, предназначенных для автоматической настройки каскадной репликации. После настройки этих параметров каждый узел кластера независимо выбирает свой источник репликации. В случае обновления топологии кластера, например, изменения лидера или количества узлов, каскадная репликация устанавливается автоматически.
Каскадную репликацию можно настроить при инициализации кластера BiHA или GDBiHA с нуля с помощью утилиты bihactl. Затем можно изменить параметры каскадной репликации следующим образом:
Чтобы ограничить максимальное число подключений репликации к определённому узлу с других узлов в кластере BiHA или GDBiHA, укажите значение параметра конфигурации max_replicas с помощью функции biha.set_max_replicas.
Например, в трёхузловом кластере, состоящем из двух последователей (
F1иF2) и лидера, для параметраbiha.max_replicasлидера укажите значение1. В этом случае, если последовательF1первым начнёт репликацию, он будет реплицировать данные с лидера. ПоследовательF2установит каскадную репликацию с последователяF1(при условии, что значение параметра preferred_roles последователяF2содержитF), так как лимит подключений лидера исчерпан.Чтобы установить приоритетность узла при выборе источника репликации, укажите значение параметра конфигурации priority с помощью функции biha.set_priority.
Например, в трёхузловом кластере, состоящем из двух последователей (
F1иF2) и лидера, установите для параметраbiha.priorityпоследователяF1значение10000, а для последователяF2—20000. Если оба последователя одновременно начнут поиск источника репликации, последовательF1первым подключится к лидеру.Чтобы установить предпочтительные роли узла для репликации, укажите значение параметра конфигурации preferred_roles с помощью функции biha.set_pref_roles.
Например, если для параметра
biha.preferred_rolesпоследователяF1установлено значениеFL, этот последователь сначала выберет в качестве источника репликации другого последователя. Если попытка подключения окажется неуспешной, последовательF1подключится к лидеру.
27.3.11. Протоколирование #
BiHA записывает в журнал сообщения от своих компонентов:
Управляющий канал BiHA: управляющий канал используется для обмена служебной информацией между узлами, в журнале отмечен как
BCP.Node Controller: основной компонент расширения biha, ответственный за логику работы узла, в журнале отмечен какNC.Postgres Controller: компонент biha, необходимый для управления и мониторинга компонентов Postgres Pro, таких как настройка репликации, параметры конфигурации, процессыwalsenderиwalreceiverи т.д.Postgres Controllerдоводит Postgres Pro до состояния, необходимого для работы BiHA. В журналеPostgres Controllerпомечен какPGC.Config Controller: конфигурационный модуль, который управляет конфигурацией узла (параметры GUC иbiha.conf) и синхронизирует её на узлах кластера. В журналеConfig Controllerпомечен какBC.
Можно определить типы сообщений, которые будут вноситься в журнал, установив соответствующий уровень протоколирования. BiHA поддерживает как стандартные уровни важности сообщений Postgres Pro, так и уровни протоколирования самого расширения.
Уровни важности сообщений Postgres Pro используются расширением biha в следующих случаях:
Когда один из процессов biha завершается ошибкой (уровни
ERRORиFATAL).Когда вызывается функция ядра, которая принимает уровень протоколирования в качестве своего аргумента.
Уровни протоколирования biha соответствуют уровням важности сообщений Postgres Pro. Если в журнале должны появляться сообщения необходимого уровня, установленное для этого уровня значение должно соответствовать значению в log_min_messages. Уровни протоколирования расширения можно настроить, указав соответствующие параметры конфигурации в файле postgresql.biha.conf.
Рекомендуемая конфигурация уровней протоколирования выглядит следующим образом:
biha.BcpTransportWarn_log_level = WARNING biha.BcpTransportLog_log_level = LOG biha.BcpTransportDetails_log_level = DEBUG1 biha.BcpTransportDebug_log_level = DEBUG1 biha.NodeControllerLog_log_level = LOG biha.NodeControllerWarn_log_level = WARNING biha.NodeControllerDetails_log_level = DEBUG1 biha.NodeControllerDebug_log_level = DEBUG1
Примечание
Такая конфигурация отображает сообщения только для уровней протоколирования biha.BcpTransportLog_log_level, biha.BcpTransportWarn_log_level, biha.NodeControllerLog_log_level и biha.NodeControllerWarn_log_level. Чтобы просматривать подробные и отладочные сообщения журнала, для параметра log_min_messages задайте значение DEBUG1.
27.3.12. Функции-обработчики #
Обработчик — это SQL-функция, которая уведомляет пользователей или внешние сервисы о событиях в BiHA-кластере, например о выборах нового лидера или изменении конфигурации кластера. Как пользователь, вы создаёте SQL-функцию и регистрируете её в качестве обработчика. При определённых условиях biha вызовет эту функцию.
Своевременное оповещение помогает внешним службам правильно реагировать на события в BiHA-кластере. Например, при получении информации об изменении лидера прокси-сервер перенаправит трафик на нового лидера.
Доступны следующие типы обработчиков:
Таблица 27.2. Типы обработчиков
| Имя | Описание |
|---|---|
CANDIDATE_TO_LEADER | Вызывается на узле, выбранном в качестве нового лидера. Сигнатура: my_callback() RETURNS void |
LEADER_CHANGE_STARTED | Вызывается на всех узлах, когда старый лидер недоступен, а новый лидер ещё не избран. Эту функцию-обработчик можно использовать, чтобы изолировать старого лидера. Функция-обработчик активируется, когда число узлов достигает значения nquorum и становится возможным провести выборы. Функция-обработчик также вызывается на всех узлах кластера, когда новый лидер устанавливается вручную с помощью функции biha.set_leader. ВажноКогда вы устанавливаете нового лидера с помощью функции biha.set_leader, старый лидер немедленно перезапускается, и функция-обработчик Сигнатура: my_callback(id integer, host text, port integer) RETURNS void В этой сигнатуре biha передаёт информацию о потерянном лидере: ID, имя узла и номер порта узла. |
LEADER_CHANGED | Вызывается на каждом узле при смене лидера BiHA-кластера. Сигнатура: my_callback(id integer, host text, port integer) RETURNS void В этой сигнатуре biha передаёт информацию о новом лидере: ID, имя узла и номер порта узла. |
LEADER_STATE_IS_RW | Вызывается на лидере и других узлах, когда состояние лидера изменяется на Сигнатура: my_callback(id integer, host text, port integer) RETURNS void В этой сигнатуре biha передаёт в функцию-обработчик информацию о лидере: ID, имя узла и номер порта узла. |
LEADER_TO_FOLLOWER | Вызывается на старом лидере, который вернулся в кластер после понижения. Сигнатура: my_callback() RETURNS void |
NODE_ADDED | Вызывается на каждом узле при добавлении нового узла в BiHA-кластер. Сигнатура: my_callback(id integer, host text, port integer, mode integer) RETURNS void В этой сигнатуре biha передаёт в функцию-обработчик информацию о новом узле, такую как имя узла, номер порта узла и режим работы: |
NODE_REMOVED | Вызывается на каждом узле при удалении узла из BiHA-кластера. Сигнатура: my_callback(id integer) RETURNS void В этой сигнатуре biha передаёт в функцию-обработчик ID удалённого узла. |
OFFERED_TO_LEADER | Вызывается на узле, который был назначен лидером вручную, перед непосредственным переходом в статус лидера. Сигнатура: my_callback() RETURNS void |
STATUS_CHANGED | Вызывается на каждом узле при изменении значений в полях представления biha.status_v (кроме ПримечаниеНе рекомендуется выполнять другие обработчики во время использования Сигнатура: my_callback() RETURNS void |
TERM_CHANGED | Вызывается на узле, когда значение его параметра Сигнатура: my_callback(old_term integer, new_term integer) RETURNS void В этой сигнатуре biha передаёт старое и новое значение параметра |
27.3.12.1. Особенности и ограничения #
При наступлении события функции-обработчики исполняются последовательно. В это время biha не может изменить своё состояние, например инициировать выборы.
Если исполнение функции-обработчика длится дольше, чем указано в biha.callbacks_timeout, biha останавливает исполнение и продолжает работать в обычном режиме.
В кластерах с асинхронной репликацией функция biha.register_callback не дожидается, пока обработчики появятся на всех узлах. Это может привести к ситуации, когда обработчики на лидере есть, а на последователе — нет, так как он отстаёт.
В норме функции-обработчики не исполняются на рефери в режиме
referee. Однако, если вы зарегистрировали функции-обработчики на лидере до добавления рефери, они могут исполняться на рефери и их также нельзя с него удалить.Не рекомендуется вызывать функции BiHA во время выполнения обработчика, так как другие обработчики в очереди могут не выполниться.
Примечание
Не вызывайте функции biha внутри обработчика, так как это может вызвать непредвиденное поведение.
27.3.12.2. Управление функциями-обработчиками #
Для управления функциями-обработчиками вы можете выполнять следующие действия:
зарегистрировать один или несколько обработчиков на одно событие
просмотреть список зарегистрированных обработчиков
отменить регистрацию обработчика
Регистрация функций-обработчиков
Напишите SQL-функцию и зарегистрируйте её в качестве обработчика с помощью функции biha.register_callback.
В этом примере вы создадите несколько SQL-функций на языке PL/pgSQL и зарегистрируете их в качестве обработчиков разных типов.
Убедитесь, что лидер BiHA-кластера находится в состоянии
LEADER_RW.На лидере используйте
psqlдля подключения к базе данныхbiha_db:postgres=# \c biha_db
Создайте следующие функции-обработчики:
-- запись при смене значения term CREATE FUNCTION log_term_changed(old_term integer, new_term integer) RETURNS void AS $$ BEGIN RAISE LOG 'Callback: Term changed from % to %', old_term, new_term; END; $$ LANGUAGE plpgsql; -- запись при смене лидера CREATE FUNCTION log_leader_changed(id integer, host text, port integer) RETURNS void AS $$ BEGIN RAISE LOG 'Callback: New leader is % %:%', id, host, port; END; $$ LANGUAGE plpgsql; -- запись при понижении лидера CREATE FUNCTION log_leader_to_follower() RETURNS void AS $$ BEGIN RAISE LOG 'Callback: demote'; END; $$ LANGUAGE plpgsql;Зарегистрируйте созданные функции:
SELECT biha.register_callback('TERM_CHANGED', 'log_term_changed', 'biha_db'); SELECT biha.register_callback('LEADER_CHANGED', 'log_leader_changed', 'biha_db'); SELECT biha.register_callback('LEADER_TO_FOLLOWER', 'log_leader_to_follower', 'biha_db');Вы также можете указать пользователя, от имени которого будут исполняться функции-обработчики или определить порядок их исполнения. Подробнее читайте в описании функции biha.register_callback.
Просмотр функций-обработчиков
Зарегистрированные обработчики добавляются в таблицу biha.callbacks, которая находится в базе данных biha_db.
Для просмотра всех зарегистрированных обработчиков выполните следующую команду:
На лидере используйте
psqlдля подключения к базе данныхbiha_db:postgres=# \c biha_db
Отобразите содержимое таблицы
biha.callbacks:SELECT * FROM biha.callbacks; 1 | log_term_changed 2 | log_leader_changed 3 | log_leader_to_follower (3 rows)
Отмена регистрации функции-обработчика
Отменённый обработчик удаляется из таблицы biha.callbacks.
Убедитесь, что лидер BiHA-кластера находится в состоянии
LEADER_RW.На лидере используйте
psqlдля подключения к базе данныхbiha_db:postgres=# \c biha_db
Получите идентификатор обработчика, который вы хотите отменить, например
log_leader_changed:SELECT id FROM biha.callbacks WHERE func = 'log_leader_changed';
Возвращается идентификатор обработчика, например
2.Отменить регистрацию обработчиков:
SELECT biha.unregister_callback(2);
Регистрация обработчика отменена.
27.3.13. Управление расширением proxima #
Вы можете включать или отключать расширение proxima в существующем BiHA-кластере, а также проверять его текущий статус.
Включение и отключение расширения proxima
На лидере вызовите одну из следующих функций из базы данных
biha_db:Чтобы включить расширение proxima, вызовите функцию biha.enable_proxima:
SELECT biha.enable_proxima();
Чтобы отключить расширение proxima, вызовите функцию biha.disable_proxima:
SELECT biha.disable_proxima();
Остановите и запустите все узлы кластера, кроме рефери, с помощью pg_ctl.
Лидер необходимо останавливать последним, а запускать первым. Время между остановкой и запуском узлов должно быть минимальным.
Проверка статуса расширения proxima
На любом узле BiHA-кластера выполните следующую команду:
SHOW biha.proxima_status;
В результате отобразится текущий статус расширения proxima на этом узле. За подробной информацией о возможных статусах обратитесь к описанию параметра biha.proxima_status.
27.3.14. Восстановление из резервной копии #
Если экземпляр базы данных был восстановлен из одного из узлов кластера BiHA в отдельный узел и/или на момент времени (Point-in-Time Recovery, PITR), между восстановленным узлом и работающими узлами кластера BiHA не должно быть соединения. Чтобы предотвратить соединение, выполните следующие действия на восстановленном узле перед его запуском:
Удалите директиву включения
include 'postgresql.biha.conf'из файла конфигурации postgresql.conf.Убедитесь, что расширение biha отсутствует в shared_preload_libraries в файле postgresql.conf и, если применимо, в файле postgresql.auto.conf.
Если вы хотите добавить восстановленный узел в кластер, выполните следующие действия:
На восстановленном узле вручную настройте потоковую репликацию от лидера.
Синхронизируйте восстановленный узел с лидером.
Остановите восстановленный узел с помощью pg_ctl:
pg_ctl stop -D
каталог_PGDATA_восстановленного узлаДобавьте восстановленный узел в кластер с помощью команды bihactl node add с параметром --convert-standby.
Запустите восстановленный узел с помощью pg_ctl:
pg_ctl start -D
каталог_PGDATA_восстановленного узла
27.3.15. Миграция #
27.3.15.1. Миграция BiHA-кластера на версию 18.X #
Подсказка
Чтобы сократить время простоя при миграции BiHA-кластера с Postgres Pro Enterprise версии 17.X на версию 18.X, можно использовать приложение pg_createsubscriber. За подробной информацией о процедуре миграции обратитесь в поддержку Postgres Pro.
Чтобы обновить BiHA-кластер с версии Postgres Pro Enterprise 16.X или 17.X до версии 18.X, выполните следующие шаги:
Остановите все узлы кластера с помощью команды
pg_ctl.Обновите узлы с помощью инструкции из документации pg_upgrade.
Добавьте последователей одним из следующих способов:
Если вы использовали rsync для обновления ведомых узлов, преобразуйте ведущие узлы в последователей.
Если вы не использовали rsync, добавьте последователей с нуля.
(Необязательно) Чтобы добавить рефери:
На бывшем узле-рефери удалите каталог
PGDATA.
27.3.16. Выключение расширения biha #
Можно временно выключить расширение biha в кластере. Процедуры выключения различаются в зависимости от роли узла.
Выключение biha на последователе
Важно
При выключении расширения biha на последователе физическая репликация прекращается.
На лидере в состоянии
LEADER_RWвызовите функцию biha.remove_node, чтобы исключить из кластера узел, на котором необходимо выключить biha:SELECT biha.remove_node(
идентификатор_узла);На последователе выполните следующие действия:
Удалите директиву включения
include 'postgresql.biha.conf'из файла конфигурации postgresql.conf.Удалите расширение biha из shared_preload_libraries в файле postgresql.conf и, если применимо, в файле postgresql.auto.conf.
Остановите и запустите последователя с помощью pg_ctl.
Выключение biha на лидере
Удалите директиву включения
include 'postgresql.biha.conf'из файла конфигурации postgresql.conf.Удалите расширение biha из shared_preload_libraries в файле postgresql.conf и, если применимо, в файле postgresql.auto.conf.
Остановите и запустите узел-лидер с помощью pg_ctl.
27.3.17. Удаление расширения biha #
Можно полностью удалить расширение biha и навсегда отключить функциональность BiHA в кластере.
В зависимости от роли узла отключите расширение biha, воспользовавшись соответствующей инструкцией.
Выполните команду
DROP EXTENSION. Её необходимо выполнить на лидере в состоянииLEADER_RWи из базы данныхbiha_db:biha_db=# DROP EXTENSION biha;
Удалите все файлы из каталога
pg_bihaна всех узлах.