Создание и запуск новой реплики#

Последовательность выполнения#

  1. Подготовьтесь к резервному копированию.

  2. Создайте резервную копию.

  3. Восстановите базу данных.

  4. Запустите репликацию с позиции.

Подготовка к резервному копированию#

  1. Убедитесь, что на базе-источнике параметр wal_level установлен в logical, параметр max_wal_senders >= 2. Для этого:

    1. Проверьте значение wal_level: psql -c show wal_level;

      Если значение wal_level не logical: psql -c alter system set wal_level = logical;

    2. Проверьте значение max_wal_senders: psql -c show max_wal_senders;

      Если значение max_wal_senders < 2: psql -c alter system set max_wal_senders = 10;

    3. После изменения параметров перезапустите сервер: pg_ctl restart.

  2. Запустите модуль Capture на вкладке Графы репликации в пользовательском интерфейсе консоли управления.

Создание резервной копии#

Выполните pg_basebackup на базе-источнике. Для этого:

  1. Проверьте, есть ли разрешение на локальное подключение по протоколу репликации для роли backup_test (можно выбрать любую другую роль для проведения репликации):

    psql -c `SELECT type, database, user_name, address, auth_method FROM pg_hba_file_rules() WHERE 'replication' = ANY(database) AND user_name = '{backup_test}';`
    

    Если разрешение есть, отобразится:

    Создание резервной копии, basebackup

    Если разрешения для роли нет, добавьте в файл pg_hba.conf: echo "host replication backup_test {адрес_базы_данных} trust" >> /pgdata/06/data/pg_hba.conf.

  2. Убедитесь, что у роли backup_test есть атрибут REPLICATION, чтобы утилита pg_basebackup могла подключиться к серверу под этой ролью:

    psql -c `\du backup_test`
    

    Если атрибут есть, отобразится:

    Создание резервной копии, basebackup

    Если атрибута у роли нет, добавьте его: psql -c ALTER ROLE backup_test REPLICATION.

  3. Выполните pg_basebackup -h localhost -v -U backup_test -D /home/postgres/backup.

    Укажите в параметре -D путь к директории созданной резервной копии, если у базы-источника один tablespace.

    Укажите в параметре -D путь к директории для основного tablespace, если tablespace несколько. Для остальных tablespaces укажите маппинг:

    pg_basebackup -h localhost -v -U backup_test -D /home/postgres/backup/data --tablespace mapping=/pgdata/06/grdl_ts_data=/home/postgres/backup/grdl_ts_data --tablespace-mapping=/pgdata/06/grdl_ts_idx=/home/postgres/backup/grdl_ts_idx
    

    Маппинг можно не указывать, а выгрузить tablespaces в .tar архивах:

    pg_basebackup --format=tar -h localhost -v -U backup_test -D /home/postgres/backup.

  4. Переместите резервную копию на сервер базы-приемника.

    1. Выполните pg_basebackup на базе-приемнике.

      Убедитесь, что на базе-источнике разрешен доступ к базе-приемнику. Для этого проверьте на базе-источнике файл pg_hba.conf:

      psql -c `SELECT type, database, user_name, address, auth_method FROM pg_hba_file_rules() WHERE 'replication' = ANY(database) AND user_name = '{backup_test}';
      

      Если доступ есть, отобразится:

      Создание резервной копии, basebackup

      Если доступа нет, добавьте в файл pg_hba.conf адрес базы-приемника: echo "host replication backup_test {адрес_базы-приемника} trust" >> /pgdata/06/data/pg_hba.conf.

    2. Проверьте атрибуты роли backup_test аналогично пунктам 1,2.

    3. Выполните на базе-приемнике: pg_basebackup {адрес_базы-источника} -v -U backup_test -D /home/postgres/backup.

      Укажите в параметре -D путь к директории для основного tablespace, если tablespace несколько.

Восстановление базы данных#

  1. Убедитесь, что сервер приемника остановлен. Для этого выполните скрипт в консоли сервера базы-приемника: pg_ctl status.

    Если сервер остановлен, отобразится: pg_ctl:no server running.

    Остановите сервер, если он запущен: pg_ctl stop.

  2. Удалите файлы данных сервера приемника: sudo rm -rf /pgdata/06/.

    /pgdata/06/ — путь к директории с файлами данных базы-приемника.

  3. Скопируйте содержимое директории backup: sudo cp -r /home/postgres/backup/. /pgdata/06/.

    /home/postgres/backup/ — путь к директории, в которой находится резервная копия.

  4. Выдайте пользователю права на директорию: sudo chown -R postgres /pgdata/06.

  5. Запустите сервер: pg_ctl start.

Запуск репликации с позиции#

  1. Добавьте базу в пользовательский интерфейс консоли управления. Для этого:

    1. Создайте соединение во вкладке Соединения.

    2. Укажите в параметрах соединения в открывшемся окне Создание соединения:

      Создание соединения

    3. Нажмите Target на схеме графа во вкладке Графы репликации и значок Редактирование Target под графом:

      Редактирование Target

    4. Выберите новую базу-приемник в открывшемся окне Редактирование свойств источника/потребителя данных:

      Редактирование Target

  2. Выполните в консоли на базе-источнике sudo cat /home/postgres/backup/data/backup_manifest | jq -r '."WAL-Ranges"[0]."End-LSN"', чтобы узнать lsn для старта репликации.

  3. Преобразуйте полученный lsn в десятеричный формат: psql -c "SELECT '9/1C001730'::pg_lsn - '0/0'::pg_lsn as lsn;".

  4. Узнайте source_id на базе-источнике:

    psql -c "select system_identifier & 4294967295 # ('x' || lpad(rpad(substring(lpad(md5(case current_setting('cluster_name') when '' then 'PANGOLIN' else current_setting('cluster_name') end),32) from 25+2),16-2,'0'),16,'0'))::bit(64)::bigint # ('x'||rpad(substring(lpad(md5('slot_name'), 32, '0') from 29 for 2), 16, '0'))::bit(64)::bigint from pg_control_system();"
    
  5. Нажмите модуль Applier на схеме графа на вкладке Графы репликации и значок Графы репликации, Перезапуск графа в развернувшемся меню под модулем:

    Графы репликации, Перезапуск графа

  6. Введите lsn в поле Позиция, выберите DB как тип позиции и укажите ID базы-приемника в поле Source ID в открывшемся окне Старт модуля с заданной позиции:

Графы репликации, Перезапуск графа

  1. Нажмите Графы репликации, Перезапуск графа.