astronet-zeon

Репликация Astronet с eol на zeon

Требуется обеспечить реплицирование базы данных астронета (discovery) в режиме онлайн ( eolzeon ).

Что потребуется

  • Установленные на eol и zeon БД PostgreSQL 8.0.x с поддержкой ssl
  • Каталог /var/log/pgsql должен существовать и принадлежать пользователю postgres
  • Установленные на eol и zeon Slony-I
  • Архив astronet.tar.gz (взять можно здесь eol:~postgres/astronet.tar.gz)

Настройка кластера

  • Eol и Zeon
    • Распаковываем архив astronet.tar.gz
tar xzf astronet.tar.gz
cd astronet
    • В postgresql.conf должны присутствовать строки:
listen_addresses = '*'
ssl=on
  • Eol
    • В pg_hba.conf должны присутствовать строки:
hostssl discovery    postgres    212.192.243.85/32    trust
hostssl discovery    postgres    195.208.220.205/32   trust
  • Zeon
    • В pg_hba.conf должны присутствовать строки:
hostssl         discovery-backup postgres  195.208.220.205/32   trust

Эти строчки должны быть ниже настроек для localhost!

  • Zeon
    • Создаем базу discovery-backup
createdb -U postgres discovery-backup
    • Редактируем init.sh
DBNAME="discovery-backup"
PGHOME=/usr/local/pgsql
PGUSER='postgres'
PGPORT='5432'
    • Заливаем в discovery-backup схему. Перед этим убедитесь, что в системе установлены все необходимые contrib модули, список которых приведен в init.sh
./init.sh
  • Eol
    • Редактируем скрипт cluster.sh, устанавливая следующие значения
SLONY_USER='postgres'
SLONIK=/usr/local/pgsql/bin/slonik

CLUSTER='astronet'
CONNINFO1="dbname=discovery host=www.astronet.ru port=5433 user=$SLONY_USER sslmode=require"
CONNINFO2="dbname=discovery-backup host=zeon.sai.msu.ru port=5432 user=$SLONY_USER sslmode=require"

PREAMBLE="cluster name = $CLUSTER;
node 1 admin conninfo = '$CONNINFO1';
node 2 admin conninfo = '$CONNINFO2';
"

Инициализация кластера

  • Eol
    • Инициализируем кластер
./cluster.sh init_cluster

ВНИМАНИЕ! Все соединения с базой discovery после этого действия должны быть установлены заново - иначе могут быть проблемы с записью в базу

Добавление узла в кластер

    • Добавляем узел zeon.sai.msu.ru в кластер
./cluster.sh add_node 2

где 2 - уникальный номер узла в кластере

    • Подключаем узел 2 к узлу 1.
./cluster.sh connect_node 2 1
    • Подписываем узел 2
./cluster.sh subscribe_node 2 1

Запуск репликации

  • Zeon
    • Запускаем демон репликации из-под пользователя postgres
su postgres -c '/usr/local/pgsql/bin/slon astronet "dbname=discovery-backup port=5432 user=postgres sslmode=require" >> /var/log/pgsql/slony.log &'

Такую же строку добавляем в /etc/rc.d/rc.local

  • Eol
    • Запускаем демон репликации
su postgres -c '/usr/local/pgsql/bin/slon astronet "dbname=discovery port=5433 user=postgres sslmode=require" >> /var/log/pgsql/slony.log &'

Такую же строку добавляем в /etc/rc.d/rc.local

Остановка репликации

  • Для остановки репликации необходимо остановить демон репликации slon на дочернем узле.

Удаление узла из кластера

  • Eol
    • Удаляем подписку для узла 2
./cluster.sh unsubscribe_node 2
    • Отсоединяем узел 2
./cluster.sh disconnect_node 2
    • Удаляем узел 2 из кластера
./cluster.sh drop_node 2

Удаление кластера

  • Eol
    • Удаляем кластер
./cluster.sh drop_node 1

Пример репликации DDL

  • Eol
    • Создаем файл example_ddl.sql
alter table author_interface_map add test text;
    • Выполняем
./cluster.sh execute example_ddl.sql

Подключение дополнительного узла в кластер

Предположим, что теперь мы хотим добавить в кластер узел 3 таким образом, чтобы все изменения узел 3 получал через узел 2. Пускай узел 3 называется elizabet, имеет ip-адрес 212.192.243.99 и название базы discovery-backup

  • Elizabet
    • В postgresql.conf должны присутствовать строки:
listen_addresses = '*'
ssl=on
    • В pg_hba.conf должны присутствовать строки:
hostssl discovery-backup    postgres    212.192.243.85/32    trust
hostssl discovery-backup    postgres    195.208.220.205/32   trust
  • Eol
    • В pg_hba.conf добавляем строку
hostssl discovery           postgres    212.192.243.99/32    trust
  • Zeon
    • В pg_hba.conf добавляем строку
hostssl discovery-backup    postgres    212.192.243.99/32    trust
  • Elizabet
    • Создаем базу discovery-backup
createdb -U postgres discovery-backup
    • Редактируем init.sh
DBNAME="discovery-backup"
PGHOME=/usr/local/pgsql
PGUSER='postgres'
PGPORT='5432'
    • Заливаем в discovery-backup схему
./init.sh
  • Eol
    • Изменяем cluster.sh следующим образом
CLUSTER='astronet'
CONNINFO1="dbname=discovery host=www.astronet.ru port=5433 user=$SLONY_USER sslmode=require"
CONNINFO2="dbname=discovery-backup host=zeon.sai.msu.ru port=5432 user=$SLONY_USER sslmode=require"
CONNINFO3="dbname=discovery-backup host=elizabet.sai.msu.ru port=5432 user=$SLONY_USER sslmode=require"

PREAMBLE="cluster name = $CLUSTER;
node 1 admin conninfo = '$CONNINFO1';
node 2 admin conninfo = '$CONNINFO2';
node 3 admin conninfo = '$CONNINFO3';
"
    • Добавляем узел Elizabet в кластер
./cluster.sh add_node 3
  • Elizabet
    • Запускаем демон репликации из-под пользователя postgres
su postgres -c '/usr/local/pgsql/bin/slon astronet "dbname=discovery-backup port=5432 user=postgres sslmode=require" >> /var/log/pgsql/slony.log &'

Такую же строку добавляем в /etc/rc.d/rc.local

  • Eol
    • Подключаем узел 3 к узлам 1 и 2
./cluster.sh connect_node 3 1
./cluster.sh connect_node 3 2
    • Переподписываем узел 2 для того, чтобы он сохранял информацию об изменениях для последующего использования (узел 2 становится субпровайдером)
./cluster.sh unsubscribe_node 2
./cluster.sh subscribe_node 2 1 yes

ВНИМАНИЕ! При переподписке передается объем тот же объем данных, что и при первичной подписке

    • Подписываем узел 3 на получение изменений с узла 2
./cluster.sh subscribe_node 3 2

Примечания

  • Схемы БД и права на дочерних узлах должны совпадать со схемой БД мастера. Это связано с тем, что реплики изготавливаются при помощи команды PostgreSQL COPY.
  • Демон slon должен быть собран именно для той версии PostgreSQL, которая запущена на данном узле в данный момент. Запуск другой версии чреват различными глюками
  • Для логов slony.log необходима ротация. В случае, когда узел включен непостоянно (в нашем примере узел 3 - ноутбук), туда начинает сыпаться большое количество диагностической информации