• Lamab
  • 6 Фев

Postgresql 9.5

Репликация в Postgresql 9

Доброго времени суток. Хотел бы с вамии поделиться опытом как создать реплицирование для Postgresql 9
В этой статье я буду использовать ubuntu server 16.04 и postgresql 9.5

Будем считать, что пакеты у вас уже установлены.
data_directory у меня = /var/lib/postgresql/9.5/main (это можно посмотреть в postgresql.conf)
мастер 172.17.3.65
реплика 172.17.3.67

1. Настраиваем postgresql.conf (на обоих одинаково)
listen_addresses = '*'
max_connections = 100
wal_level = hot_standby
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 2
wal_keep_segments = 32
hot_standby = on

Далее открываем psql:
sudo -u postgres psql

Меняем пароль пользователя postgres:
ALTER ROLE postgres PASSWORD 'secretpass';

2. Настраиваем pg_hba.conf
host replication postgres 172.17.3.67/32 md5 (мастер)
host replication postgres 172.17.3.67/32 md5 (реплика)


Перезапускаем PostgreSQL:
sudo service postgresql restart

3. Отправляем базу с мастера на слейв.
Отключаем на реплике postgresql, после чего на мастере выполняем следующее:
su - postgres
psql -c "select pg_start_backup('initial_backup');"
rsync -cva --inplace --exclude=*pg_xlog* /etc/postgresql/9.5/main/ 172.17.3.67:/etc/postgresql/9.5/main/
psql -c "select pg_stop_backup();"

В /var/lib/postgresql/9.5/main/recovery.conf дописываем:
recovery_target_timeline = 'latest'
Когда у нас упадет мастер и мы запромоутим реплику до мастера, этот параметр позволит тянуть данные с него. Более подробна фича объяснена здесь и в официальной документации.

Запускаем PostgreSQL:
sudo service postgresql start

4. Готово!
Запускаем слейв. Если на слейве команда
ps aux | grep receiver
Показывает что-то вида
postgres 1890 0.0 0.2 301400 10612 ? Ss фев04 5:24 postgres: wal receiver process streaming 0/11080220
можно считать, что всё работает.

Так же можно проверить на мастере
ps aux | grep sender
и увидеть следующее:
postgres 30199 0.0 0.1 297256 7516 ? Ss фев04 0:15 postgres: wal sender process postgres 172.17.3.67(42408) streaming 0/11080220

5. Промоутим реплику до мастера

Остановим мастер.
sudo service postgresql stop

На реплике говорим:
sudo -u postgres /usr/lib/postgresql/9.5/bin/pg_ctl promote -D /var/lib/postgresql/9.5/main/

На мастере:
sudo -u postgres /usr/lib/postgresql/9.5/bin/pg_rewind -D /var/lib/postgresql/9.5/main/ --source-server="host=172.17.3.67 port=5432 user=postgres password=1q2w3e4r"

Типичный вывод:
servers diverged at WAL position 2/67002170 on timeline 5
rewinding from last common checkpoint at 2/67002100 on timeline 5
Done!

Перемещаем и правим recovery.conf:
sudo mv /var/lib/postgresql/9.5/main/recovery.done /var/lib/postgresql/9.5/main/recovery.conf
nano /var/lib/postgresql/9.5/main/recovery.conf

Проверяем IP мастера и наличие строчки:
recovery_target_timeline = 'latest'

Запускаем PostgreSQL:
sudo service postgresql start

6. Готово!
Теперь можете снова проверить
ps aux | grep receiver
Показывает что-то вида
postgres 1890 0.0 0.2 301400 10612 ? Ss фев04 5:24 postgres: wal receiver process streaming 0/11080220

Так же можно проверить на мастере
ps aux | grep sender
и увидеть следующее:
postgres 30199 0.0 0.1 297256 7516 ? Ss фев04 0:15 postgres: wal sender process postgres 172.17.3.65(42408) streaming 0/11080220