Настройка 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 должен сам добавить недостающие данные на второй сервер.

Comments are closed.