Настройка streaming репликации в Postgresql 9.*

  • 1. Устанавливаем postgresql на мастре- и слэйв-серверах обычным образом;
  • 2. Запускаем сервер что-бы создались все структуры, необходимые для работы postgresql;
  • 3. Настраиваем соединения и авторизацию на мастре-сервере так что-бы слэйвы могли подключаться к псевдо-базе данных replication:
$ $EDITOR postgresql.conf

listen_addresses = '192.168.0.10'

$ $EDITOR pg_hba.conf

# The standby server must have superuser access privileges.
host  replication  postgres  192.168.0.20/22  trust
  • 4. Устанавливаем на мастер-сервере необходимые параметры для работы его в качестве мастер-сервера репликации:
$ $EDITOR postgresql.conf

# To enable read-only queries on a standby server, wal_level must be set to
# "hot_standby". But you can choose "archive" if you never connect to the
# server in standby mode.
wal_level = hot_standby

# Set the maximum number of concurrent connections from the standby servers.
max_wal_senders = 5

# To prevent the primary server from removing the WAL segments required for
# the standby server before shipping them, set the minimum number of segments
# retained in the pg_xlog directory. At least wal_keep_segments should be
# larger than the number of segments generated between the beginning of
# online-backup and the startup of streaming replication. If you enable WAL
# archiving to an archive directory accessible from the standby, this may
# not be necessary.
wal_keep_segments = 32

# Enable WAL archiving on the primary to an archive directory accessible from
# the standby. If wal_keep_segments is a high enough number to retain the WAL
# segments required for the standby server, this is not necessary.
archive_mode    = on
archive_command = 'cp %p /path_to/archive/%f'
  • 5. Запускаем postgresql на мастер-сервере;
  • 6. Делаем бэкап каталога данных postgresql и копируем его на слэйв-сервер:
$ psql -c "SELECT pg_start_backup('label', true)"
$ rsync -a ${PGDATA}/ standby:/srv/pgsql/standby/ --exclude postmaster.pid
$ psql -c "SELECT pg_stop_backup()"
  • 7. Устанавливаем все параметры связанные с репликацией и авторизацией на слэйв-сервере такими-же как на мастере для того что-бы слэйв сервер мог выполнять функцию мастера в случае сбоя;
  • 8. Разрешаем запросы "только для чтения" на слэйв сервере (можно использовать для балансировки нагрузки):
$ $EDITOR postgresql.conf

hot_standby = on
  • 9. Создаем файл recovery.conf в каталоге данных на слэйве и прописываем в нем все параметры необходимые для работы репликации:
$ $EDITOR recovery.conf
# Note that recovery.conf must be in $PGDATA directory.

# Specifies whether to start the server as a standby. In streaming replication,
# this parameter must to be set to on.
standby_mode          = 'on'

# Specifies a connection string which is used for the standby server to connect
# with the primary.
primary_conninfo      = 'host=192.168.0.10 port=5432 user=postgres'

# Specifies a trigger file whose presence should cause streaming replication to
# end (i.e., failover).
trigger_file = '/path_to/trigger'

# Specifies a command to load archive segments from the WAL archive. If
# wal_keep_segments is a high enough number to retain the WAL segments
# required for the standby server, this may not be necessary. But
# a large workload can cause segments to be recycled before the standby
# is fully synchronized, requiring you to start again from a new base backup.
restore_command = 'cp /path_to/archive/%f "%p"'
  • 10. Запускаем postgresql на слэйв сервере. При этом должна начаться репликация;
  • 11. Можно вычислить возможные задержки репликации с помощью команд, указывающих текущую позицию репликации:
$ psql -c "SELECT pg_current_xlog_location()" -h192.168.0.10 (primary host)
 pg_current_xlog_location 
--------------------------
 0/2000000
(1 row)

$ psql -c "select pg_last_xlog_receive_location()" -h192.168.0.20 (standby host)
 pg_last_xlog_receive_location 
-------------------------------
 0/2000000
(1 row)

$ psql -c "select pg_last_xlog_replay_location()" -h192.168.0.20 (standby host)
 pg_last_xlog_replay_location 
------------------------------
 0/2000000
(1 row)
  • 12. Так-же возможно проверить работу репликации с использованием команды ps:
# The displayed LSNs indicate the byte position that the standby server has
# written up to in the xlogs.
[primary] $ ps -ef | grep sender
postgres  6879  6831  0 10:31 ?        00:00:00 postgres: wal sender process postgres 127.0.0.1(44663) streaming 0/2000000

[standby] $ ps -ef | grep receiver
postgres  6878  6872  1 10:31 ?        00:00:01 postgres: wal receiver process   streaming 0/2000000

Последние изменения на 16:14 30 ноября 2013