Настройка резервных слотов в PostgreSQL-17

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

Failover-слоты – мощная функция, которая позволяет обеспечить бесперебойное продолжение логической репликации даже после переключения на резервный сервер. Использование failover-слотов позволяет автоматически синхронизировать логические слоты репликации между основными и резервными узлами, что значительно сокращает время простоя и уменьшает необходимость вручную вмешиваться во время сбоя.

Это руководство поможет вам настроить кластер PostgreSQL с высокой доступностью с использованием новой функции failover-слотов. В конце вы получите надежную настройку репликации, способную бесперебойно обрабатывать сбои.

Значение Failover-слотов с исторической точки зрения

Проблемы в PostgreSQL 15

  • Слоты репликации, привязанные к основному узлу: В PostgreSQL 15 слоты репликации создавались только на основном сервере. Все логические слоты репликации терялись в случае сбоя основного сервера, что приводило к значительным задержкам в репликации и потере данных.
  • Управление сбоем вручную: Во время сценариев сбоя администраторы вручную восстанавливали слоты репликации на новом основном сервере, что увеличивало сложность, вносило ошибки и продлевало время простоя.
  • Нет синхронизации слотов: Сервера резервирования не имели возможности узнать о логических слотах репликации на основном сервере. Эта нехватка синхронизации привела к полному сбросу потоков репликации в случае сбоя.

Улучшения в PostgreSQL 16

Минимальное логическое декодирование

PostgreSQL 16 представил функцию под названием минимальное логическое декодирование на резервных серверах:

  • Минимальное декодирование на резерве: Это позволило серверам резервирования декодировать журналы WAL для подготовки к логической репликации, позволяя использовать предварительно разогретые слоты в случае сбоя.
  • Быстрый переход на резервный сервер: Предварительное декодирование изменений WAL на резерве позволило уменьшить задержку репликации при продвижении резервного сервера к основному. Однако это все еще требовало некоторой ручной настройки для обеспечения плавного перехода.

PostgreSQL 17: Игрок, изменяющий правила игры – Слоты для перехода на резервный сервер

  • Слоты для перехода на резервный сервер: Введение слотов для перехода на резервный сервер в PostgreSQL 17 устраняет необходимость в ручном вмешательстве, автоматически синхронизируя логические слоты репликации между основным и резервными серверами.
  • Автоматическая синхронизация: Новый работник синхронизации слотов обеспечивает, чтобы слоты, разрешающие переход (failover = true), всегда были синхронизированы, даже когда основной узел активен.
  • Плавный переход: При переключении на резервный сервер он может стать основным без потери любых слотов репликации, обеспечивая нулевую потерю данных и непрерывную репликацию.

Функция

PostgreSQL 15

PostgreSQL 16

PostgreSQL 17

Логическая репликация

Да

Да

Да

Автоматическая синхронизация слотов

Нет

Минимальное логическое декодирование на резервном сервере

Полные слоты сбоя

Обработка переключения

Требуется ручное вмешательство

Предварительно прогретые слоты на резервном сервере

Автоматические слоты сбоя

Синхронизация слотов на резервный сервер

Не поддерживается

Минимально, требуется настройка

Автоматически с работником slotsync

Высокая доступность для логической репликации

Ограниченно

Улучшено с минимальным декодированием

Бесперебойно с резервными слотами

Создание кластера с высокой доступностью с резервными слотами

В этом разделе мы расскажем, как создать кластер PostgreSQL с высокой доступностью с резервными слотами. В нашем примере мы будем использовать следующие узлы:

  1. NodeA (Основной сервер)
  2. NodeB (Физический резервный)
  3. NodeC (Логический подписчик)

Предварительные требования

Перед началом убедитесь, что у вас есть:

Шаг 1: Настройка основного узла (NodeA)

1.1 Инициализировать кластер на NodeA

После установки PostgreSQL на основном узле, инициализируйте кластер; вы можете использовать следующие команды:

Shell

 

1.2 Настроить репликацию в файле postgresql.conf

После инициализации кластера отредактируйте файл postgresql.conf, находящийся по умолчанию в /home/pgedge/nodeA/postgresql.conf. Установите следующие значения параметров:

Shell

 

1.3 Обновить файл pg_hba.conf, разрешив доступ к репликации

Файл pg_hba.conf управляет аутентификацией клиента для сервера PostgreSQL. Добавьте следующую запись в /home/pgedge/nodeA/pg_hba.conf, чтобы обеспечить доступ для пользователя репликации:

Shell

 

Затем перезагрузите конфигурацию:

Shell

 

1.4 Создать пользователя репликации

Затем войдите в PostgreSQL и создайте пользователя репликации:

Shell

 

SQL

 

1.5 Создать таблицу и настроить публикацию

Затем вам нужно создать таблицу и создать связанную публикацию:

SQL

 

Шаг 2: Настройка физического резервного экземпляра (NodeB)

2.1 Инициализировать NodeB

После установки PostgreSQL инициализируйте NodeB:

Shell

 

2.1 Создать базовую резервную копию

Затем используйте pg_basebackup для создания резервной копии кластера:

Shell

 

2.2 Настроить postgresql.conf на Node-B

Измените файл postgresql.conf (находится в /home/pgedge/nodeB/postgresql.conf), установив:

Shell

 

2.3 Включите синхронизацию слотов отказа

Используйте клиент psql для входа на NodeB:

Shell

 

Затем используйте следующие операторы для настройки репликации для NodeB:

SQL

 

Выйдите из клиента psql и перезапустите NodeB:

Shell

 

2.4 Проверьте синхронизацию слотов

Затем подключитесь к NodeB с помощью psql и убедитесь, что слоты синхронизированы:

SQL

 

Шаг 3: Настройка логического подписчика (NodeC)

3.1 Инициализируйте кластер и настройте NodeC

После установки PostgreSQL инициализируйте кластер, вы можете использовать следующие команды:

Shell

 

Затем отредактируйте файл /home/pgedge/nodeC/postgresql.conf, установив следующие значения параметров:

Shell

 

3.2 Создайте подписку на NodeC

Используйте следующую команду для создания подписки на NodeC:

Shell

 

Шаг 4: Моделирование отказа и обеспечение непрерывности

Вы можете использовать следующие команды для моделирования отказа и подтверждения продолжения репликации и сохранения целостности данных.

4.1 Моделирование отказа

Используйте следующие команды для моделирования сбоя NodeA, за которым следует повышение NodeB из режима ожидания в основной:

Shell

 

4.2 Обновление подписки на NodeC

После продвижения узла NodeB войдите в NodeC и обновите соединение, чтобы отразить, что NodeB теперь является основным узлом:

SQL

 

4.3 Проверьте непрерывность данных

Для тестирования репликации используйте psql, чтобы войти в Node-B (теперь основной):

SQL

 

Проверьте репликацию на Node-C:

SQL

 

Заключение

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

Оптимизируя настройки и используя новые возможности PostgreSQL 17, вы можете создать устойчивую и эффективную инфраструктуру базы данных для ваших критически важных приложений.

Source:
https://dzone.com/articles/setting-up-failover-slots-in-postgresql-17