Настройка 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
Активируем bucardo на каждом из серверов:
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 webporta_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;"
Как видно репликация работает в обе стороны. 

3 комментария:

  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. А почему постгрес такой древнючий то?

    ОтветитьУдалить