Хочу поделиться своим опытом настройки репликации 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;"
Как видно репликация работает в обе стороны.
Добрый день.
В момент добавления синхронизации 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 Mikhail Komov
Да, у меня была похожая ситуация, одна из баз данных была потушена неправильно (отключили свет), и после этого таблица, в которую производилась запись, была повреждена. Попробуйте сначала убедиться что Ваша таблица в базе работает исправно и что в неё можно инсертить и делать селекты.
А почему постгрес такой древнючий то?
> bucardo add sync webporta_sync herd=webporta_herd dbs=webportal_servers
Замените webporta_herd на webportal_herd, а то потратил 10 минут чтобы найти неисправность.
С другой стороны "грузим дамп" только на первый сервер, при настройке этой синхронизации пока не добавил дамп на второй сервер, репликация не заработала (но возможно из-за того, что изначально некорректно создал sync)
Благодарю за комментарий, опечатку исправил.
Скорее всего проблема была в кривом sync, потому что по идее Bucardo должен сам добавить недостающие данные на второй сервер.