Репликация Postgresql 9.0 (Master/Slave)
Добавлено: 25 авг 2011, 10:25
Почему именно master/slave (горизонтальная репликация), почему не master/master? Потому, что именно такой вид репликации как мне кажется наиболее надежен. При репликациях типа master/master велика вероятность возникновения конфликтов одновременной записи (т.е. когда например 1 сервер вносит в ячейку Х скажем значение равное 100, а второй в то же самое время пытается вписать в нее же значение равное к примеру 200, и кто тогда из них прав?). Вот чтобы не разгребать всю эту кашу мой и была выбрана именно схема master/slave (что мешает в критический момент повернуть все вспять и поднять слейв вместо мастера?
Итак, сносим все старье!
Код: Выделить всё
# yum remove postgresql postgresql-libs postgresql-server postgresql-plperl postgresql-contrib postgresql-pltcl postgresql-devel postgresql-odbc postgresql-test postgresql-docs postgresql-plpython postgresql-jdbc
Дергаем отсюда SRPM-пакетики для 6-го редхата:
Код: Выделить всё
# wget http://yum.postgresql.org/srpms/9.0/redhat/rhel-6Server-x86_64/postgresql90-9.0.4-1PGDG.rhel6.src.rpm
Код: Выделить всё
# rpmbuild --rebuild postgresql90-9.0.4-1PGDG.rhel6.src.rpm
Чтож, предположим что СУБД установлена, создана база test1. Я буду описывать процесс исходя из того, что базы pg у меня лежат в /var/lib/postgresql/, если у вас они расположены не так — используйте корректный для вас путь.
Настраиваем мастер
* Предположим, что у ip мастера 192.168.10.1, а слейва — 192.168.10.2.
Правим строку listen в postgresql.conf:
Код: Выделить всё
listen_addresses = '*'
В конец pg_hba.conf вносим такие строки:
Код: Выделить всё
host al l all 192.168.10.1/32 trust
host all all 192.168.10.2/32 trust
Код: Выделить всё
# Указываем вести журнал таким образом, чтобы слейв мог использоваться для чтения. Можно вместо [i]hot_standby[/i] поставить [i]archive[/i] и тогда он будет просто хранилищем журанала(нечитаемым).
wal_level = hot_standby
#Определим максимальное количество слейвов
max_wal_senders = 2
#Сколько кусков лога будем хранить?Если вдруг у вас большая нагрузка на запись в базу - возможно это значение нужно будет увеличить, чтобы всё успевало доезжать до реплики.
wal_keep_segments = 32
#На случай ядерной войны дублируем журнал в отдельное место(лучше чистить по крону эту локацию, удаляя всё, чему больше суток). Хотя, офф. ман говорит, что оно вообще не обязательно.
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/backup/%f'
Переносим базу на слейв
Нам потребуется что-нибудь, что умеет пересылать данные по сети. Я обошелся scp, хотя, разумеется, можно применять любое другое средство. Вырубим на слейве postgresql, сохраняем бекапы всех конфигов из папки /var/lib/postgresql, после чего на мастере выполняем следующее:
Код: Выделить всё
#su - postgres
$ psql -c "SELECT pg_start_backup('label', true)"
$ scp -rp /var/lib/postgresql root@192.168.10.2:/var/lib/postgresql
$ psql -c "SELECT pg_stop_backup()"
Настраиваем слейв
Правим postgresql.conf:
Код: Выделить всё
listen_addresses = '*'
hot_standby = on
Код: Выделить всё
standby_mode = 'on'
primary_conninfo = 'host=192.168.0.1 port=5432 user=postgres'
trigger_file = '/var/lib/postgresql/trigger'
restore_command = 'cp /var/lib/postgresql/backup/%f "%p"'
Запускаем слейв и проверяем репликацию - смотрим вывод ps aux, если там имеется процесс postgres: wal receiver process, значит мы сделали все правильно, и базы реплицируются.