Настройка master<->master репликации PostgreSQL через Bucardo

Хочу поделиться своим опытом настройки репликации PostgreSQL типа master<->master, которую мне потребовалось развернуть для уменьшения нагрузки на компьютер, на котором изначально была одна база, но со временем нагрузка на компьютер так возросла, что база перестала справляться.

Итак, что у нас есть и что нам нужно:

  • Есть 2 компьютера с чистой Debian 7 (pg1 -> 192.168.2.11 и pg2 -> 192.168.2.12)
  • Необходимость настройки репликации типа master<->master
  • Статья на хабре http://habrahabr.ru/sandbox/65312/
  • Дока с офф сайта Bucardu http://bucardo.org/wiki/Bucardo
  • Прокачка скила linux-админа

Описывать я буду систему репликации Bucardu, так как её настройка и администрирование показались мне самыми простыми из всех систем способных выполнять нужные мне задачи. К тому же её удалось настроить с первого раза, практически с ходу.

Установка необходимых пакетов

Допустим у нас есть 2 свежеустановленных системы Debian 7 редакции netinstall. Выполним установку необходимых пакетов на каждом сервере, который будет участвовать в репликации:

apt-get install postgresql postgresql-plperl-9.1 bucardo

Активируем Bucardu на каждом из серверов:

sed -i 's/ENABLED=0/ENABLED=1/' /etc/default/bucardo

Следуя совету автора статьи на хабре создадим директорию, в которой будет храниться PID запущенного сервера bucardu

mkdir -p /var/run/bucardo

Подготовительная настройка PostgreSQL

Необходимо настроить оба сервера:

mcedit /etc/postgresql/9.1/main/postgresql.conf

Находим строку:

#listen_addresses = 'localhost'

И приводим её к виду:

listen_addresses = '*'

Потом нужно указать каким хостам и как разрешено работать с базой, сначала первый хост:

root@pg1:~# mcedit /etc/postgresql/9.1/main/pg_hba.conf

host    all             all             127.0.0.1/32            trust
host    all             all             192.168.1.0/24          trust
host    all             bucardo         127.0.0.1/32            password
host    all             bucardo         192.168.2.12/32         password

Потом на втором хосте:

root@pg2:~# mcedit /etc/postgresql/9.1/main/pg_hba.conf

host    all             all             127.0.0.1/32            trust
host    all             all             192.168.1.0/24          trust
host    all             bucardo         127.0.0.1/32            password
host    all             bucardo         192.168.2.11/32         password

Далее перезагружаем сервер:

/etc/init.d/postgresql restart

Сбросим дефолтный пароль postgres:

psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'postgres-password';"

Инсталляция Bucardu в PostgreSQL

На каждом из серверов:

bucardo install

Тут мы можем выбрать хост, на который хотим установить данную систему репликации. Нажимаем английскую "P", придётся 3 раза набрать пароль пользователя postgres, поэтому рекомендую скопировать его в буфер обмена и просто делать [ctrl]+[ins], каждый раз когда это будет нужно. Давайте сбросим пароль bucardo:

psql -U postgres -c "ALTER USER bucardo WITH PASSWORD 'bucardo-password';"

Настроим файл паролей:

mcedit /root/.pgpass

Добавим строку:

localhost:5432:*:bucardo:bucardo-password

Запускаем bucardo:

bucardo start

Создадим базу:

psql -U postgres -c "CREATE DATABASE webportal;"

Далее работаем только с первым сервером, тут нам нужно импортировать дамп, если он имеется:

psql -U postgres webportal < webportal.dump

Если нет, попробуем создать тестовую таблицу:

psql -U postgres webportal -c "CREATE TABLE mytable ( num123 integer PRIMARY KEY, abc varchar(10) );"

Настройка Bucardo

Напомню, что мы работаем только с 1м сервером. Добавим базы в bucardo:

bucardo add database webportal1 dbname=webportal dbhost=127.0.0.1 dbuser=bucardo dbpass=bucardo-password
bucardo add database webportal2 dbname=webportal dbhost=192.168.2.12 dbuser=bucardo dbpass=bucardo-password

Добавим все имеющиеся таблицы на сервере webportal1 в группу таблиц webportal_herb:

bucardo add table all --db=webportal1 --herd=webportal_herd

Добавим все последовательности:

bucardo add sequence all --db=webportal1 --herd=webportal_herd

Создадим группу серверов:

bucardo add dbgroup webportal_servers
bucardo add dbgroup webportal_servers webportal1:source
bucardo add dbgroup webportal_servers webportal2:source

Теперь создадим синхронизацию:

bucardo add sync webportal_sync herd=webporta_herd dbs=webportal_servers

Посмотрим что мы тут наконфигуряли:

bucardo list all

После изменения настроек обязательно рестартовать Bucardo:

bucardo restart

Тестирование

На сервере pg1:

psql -U postgres webportal -c "INSERT INTO mytable VALUES (1, 'a');"
psql -U postgres webportal -c "INSERT INTO mytable VALUES (2, 'b');"

А на pg2:

psql -U postgres webportal -c "SELECT * FROM mytable;"
psql -U postgres webportal -c "INSERT INTO mytable VALUES (3, 'c');"

Теперь снова на pg1:

psql -U postgres webportal -c "SELECT * FROM mytable;"

Как видно репликация работает в обе стороны.

5 thoughts on “Настройка master<->master репликации PostgreSQL через Bucardo

  1. Добрый день.
    В момент добавления синхронизации bucardo виснет, в логе postgres'a -
    2016-07-04 15:10:26 MSK [11299-3] bucardo@bucardo STATEMENT: INSERT INTO bucardo.sync (herd,name,dbs) VALUES ($1,$2,$3)

    и на этом все виснет. Гугл внятного ничего не говорит. Не встречались ни с чем подобным?

  2. 2 Mikhail Komov

    Да, у меня была похожая ситуация, одна из баз данных была потушена неправильно (отключили свет), и после этого таблица, в которую производилась запись, была повреждена. Попробуйте сначала убедиться что Ваша таблица в базе работает исправно и что в неё можно инсертить и делать селекты.

  3. > bucardo add sync webporta_sync herd=webporta_herd dbs=webportal_servers

    Замените webporta_herd на webportal_herd, а то потратил 10 минут чтобы найти неисправность.

    С другой стороны "грузим дамп" только на первый сервер, при настройке этой синхронизации пока не добавил дамп на второй сервер, репликация не заработала (но возможно из-за того, что изначально некорректно создал sync)

    1. Благодарю за комментарий, опечатку исправил.

      Скорее всего проблема была в кривом sync, потому что по идее Bucardo должен сам добавить недостающие данные на второй сервер.

Добавить комментарий для Илья Рубинчик Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *