Небольшой туториал для свитчеров, начинающих и неопытных, а также всех, кому ломает глаза официальная документация. Так что попрошу тех, кто собаку съел на PostgreSQL, не кидать в меня тапками за такой формат подачи материала.
Итак, что такое репликация? Простыми словами, это синхронизация данных между серверами. В данном примере рассмотрим кейс, когда у нас 2 сервера: один из них главный (master, primary), и с него мы будем реплицировать данные на второй (slave/standby).
1.На primary-сервере заходим в оболочку postgresql (psql) и там создаем пользователя, от имени которого будет выполняться репликация:
CREATE USER replicator REPLICATION LOGIN CONNECTION LIMIT 1000 ENCRYPTED PASSWORD 'password';
2. Выходим из оболочки и там же, на primary в конфигурационном файле pg_hba.conf разрешаем подключения пользователю replicator к primary:
host replication replicator айпишникstandby/32 password
Забегая наперед, скажу, что на стендбае в этом же конфиге в этой же строке тоже нужно прописать ip-адрес стендбая, и таким образом, конфигурятина на обоих серверах должна содержать айпишник стендбая.
3.Редактируем кофигурационный файл postgresql.conf на primary, настроив следующие параметры:
wal_level = logical
wal_log_hints = on
archive_mode = on
archive_command = 'cp -i %p /app/postgresql/pgdatabase/data/archive/%f'
max_wal_senders = 100
hot_standby = on
подсказка для новичков: в midnight commander можно скопировать название параметра, найти его, нажав сочетание клавиш fn+f7, а затем shift+insert
4.Создаем директорию archive в каталоге где установлен сам postgresql на primary, в данном примере каталог выглядит вот так:
mkdir -p /app/postgresql/pgdatabase/data/archive
именно эта директория прописывается выше в параметре archive_command в postgresql.conf, так что будьте внимательны. Если же у вас postgresql установлен по другому пути, укажите его, но папка archive быть должна
5. Делаем рестарт primary
pgctl stop
pgctl start
6.Заходим на Slave и там выполняем восстанoвлениe всех каталогов с данными и архивами с primary при помощи следующей команды:
pg_basebackup -h айпишникprimary -U replicator -D /app/postgresql/pgdatabase/data --write-recovery-conf
Примечание: если при выполнении данной команды система ругнётся, что папка data не пустая, удалите все данные из этой папки, сделав ее пустой, и повторите команду. И да, под айпишникprimary имело в виду не что иное, как ip-адрес primary-сервера, который надо прописать в команде
7.Старт slave:
pg_ctl start
8.Смотрим в корневом каталоге postgres на slave должен появится файл standby.signal
9.Проверяем, установилась или нет связь на Primary:
psql
select application_name, state, sync_priority, sync_state from pg_stat_replication;
select * from pg_stat_replication;
Если выдаст хоть одну строку - поздравляю, репликация удалась.
Надеюсь, кому-нибудь это поможет