Хочу поделиться своим опытом настройки репликации 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Добавим все имеющиеся таблицы на сервере webportal1 в группу таблиц webportal_herb:
bucardo add database webportal2 dbname=webportal dbhost=192.168.2.12 dbuser=bucardo dbpass=bucardo-password
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');"А на pg2:
psql -U postgres webportal -c "INSERT INTO mytable VALUES (2, 'b');"
psql -U postgres webportal -c "SELECT * FROM mytable;"Теперь снова на pg1:
psql -U postgres webportal -c "INSERT INTO mytable VALUES (3, 'c');"
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
ОтветитьУдалитьДа, у меня была похожая ситуация, одна из баз данных была потушена неправильно (отключили свет), и после этого таблица, в которую производилась запись, была повреждена. Попробуйте сначала убедиться что Ваша таблица в базе работает исправно и что в неё можно инсертить и делать селекты.
А почему постгрес такой древнючий то?
ОтветитьУдалить