Мастер-мастер репликация длля PostgreSQL

Инструкция актуальна для 9.4, в 9.5 обещают поддержку “из коробки”.
  • Репликация настраивается для каждой базы отдельно, инстанции могут быть разными.
  • Работы с конфигами и базами проводить от пользователя postgres.

    Установка патченных бинарников

    1. Установка репозитория:
      yum install http://packages.2ndquadrant.com/postgresql-bdr94-2ndquadrant/yum-repo-rpms/postgresql-bdr94-2ndquadrant-redhat-1.0-2.noarch.rpm
    2. Установка собственно бинарников
      yum install postgresql-bdr94-bdr
      Настоятельно рекомендую добавить в PATH (системный или пользователя postgres) путь /usr/pgsql-9.4/bin

    Подготовка инстанции

    Выполнять на всех серверах, участвующих в реплике.

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

    initdb -D /opt/PostgreSQL/9.4-BDR/data -A trust -U postgres -E UTF-8

    Правка конфига:

    postgresql.conf

    shared_preload_libraries = 'bdr'
    wal_level = 'logical'
    track_commit_timestamp = on
    max_connections = 100
    max_wal_senders = 10
    max_replication_slots = 10
    max_worker_processes = 10

    Одна БД запускает 3 worker-процесса. Исходя из этого, рассчитываем и не забываем про остальные процессы (wal_writer, autovacuum, stat_collector и т.д.)

    pg_hba.conf

    Добавить на репликацию local и основные айпишники текущего сервера и сервера-репликанта

    Проверить корректность запуском инстанции:

    postgres -D /opt/PostgreSQL/9.4-BDR/data/ Если всё стартует, идём далее.

    Перевод существующей базы на BDR

    Сделать бекап нужной базы

    pg_dump -p порт_старой_инстанции имябазы -C -f /куданадо/имябазы.dump

    Восстановить

    psql -p порт_первой_инстанции < /куданадо/имябазы.dump

    Далее производим изменения в базе, развёрнутой на новой инстанции:
    psql -p порт_первой_инстанции имябазы

    Для КАЖДОЙ инстанции:
    CREATE EXTENSION btree_gist; CREATE EXTENSION bdr;

    Для ПЕРВОЙ разворачиваемой инстанции:
    SELECT bdr.bdr_group_create( local_node_name := 'mega_node_pysh_pysh1', \ node_external_dsn := 'host=ip_первого_сервера port=порт_первой_инстанции dbname=имябазы');

    Для ВТОРОЙ:
    SELECT bdr.bdr_group_join( local_node_name := 'mega_node_pysh_pysh_100500',\ node_external_dsn := 'host=ip_второго_сервера port=порт_второй_инстанции dbname=имябазы', \ join_using_dsn:='host=ip_первого_сервера port=порт_первой_инстанции dbname=имябазы');

    Для КАЖДОЙ разворачиваемой инстанции:
    SELECT bdr.bdr_node_join_wait_for_ready(); (Должно выдать 1)

    После указанных действий все изменения в скопированную базу приезжают в обоих направлениях.