Все нужное для pg_rewind уже настроено, как было показано в демонстрации.
Слот:
student$ psql
α=> SELECT pg_create_physical_replication_slot('replica');
pg_create_physical_replication_slot ------------------------------------- (replica,) (1 row)
Создаем автономную резервную копию, используя созданный слот, в каталоге PGDATA будущей реплики.
postgres$ rm -rf /var/lib/postgresql/10/beta/*
postgres$ pg_basebackup -U student --pgdata=/var/lib/postgresql/10/beta -R --slot=replica
Меняем порт и включаем режим горячего резерва:
postgres$ echo 'port = 5433' >> /var/lib/postgresql/10/beta/postgresql.auto.conf
postgres$ echo 'hot_standby = on' >> /var/lib/postgresql/10/beta/postgresql.auto.conf
Файл recovery.conf подготовлен утилитой pg_basebackup:
postgres$ cat /var/lib/postgresql/10/beta/recovery.conf
standby_mode = 'on' primary_conninfo = 'user=student passfile=''/var/lib/postgresql/.pgpass'' host=''/var/run/postgresql'' port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any' primary_slot_name = 'replica'
Запускаем реплику.
student$ sudo pg_ctlcluster 10 beta start
Выполним несколько команд на мастере:
α=> CREATE DATABASE replica_switchover;
CREATE DATABASE
α=> \c replica_switchover;
You are now connected to database "replica_switchover" as user "student".
α=> CREATE TABLE test(s text);
CREATE TABLE
α=> INSERT INTO test VALUES ('Привет, мир!');
INSERT 0 1
Проверим реплику:
student$ psql -p 5433 -d replica_switchover
β=> SELECT * FROM test;
s -------------- Привет, мир! (1 row)
α=> \q
student$ sudo pg_ctlcluster 10 alpha stop -m immediate --skip-systemctl-redirect
student$ sudo pg_ctlcluster 10 beta promote
Создадим на втором сервере слот для будущей реплики.
β=> SELECT pg_create_physical_replication_slot('replica');
pg_create_physical_replication_slot ------------------------------------- (replica,) (1 row)
Создаем автономную резервную копию, используя созданный слот.
postgres$ rm -rf /var/lib/postgresql/10/alpha/*
postgres$ pg_basebackup -U student -p 5433 --pgdata=/var/lib/postgresql/10/alpha -R --slot=replica
Меняем порт и включаем режим горячего резерва:
postgres$ echo 'hot_standby = on' > /var/lib/postgresql/10/alpha/postgresql.auto.conf
Файл recovery.conf подготовлен утилитой pg_basebackup:
postgres$ cat /var/lib/postgresql/10/alpha/recovery.conf
standby_mode = 'on' primary_conninfo = 'user=student passfile=''/var/lib/postgresql/.pgpass'' host=''/var/run/postgresql'' port=5433 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any' primary_slot_name = 'replica'
Запускаем новую реплику.
student$ sudo pg_ctlcluster 10 alpha start
Слот репликации инициализировался и используется:
β=> SELECT * FROM pg_replication_slots \gx
-[ RECORD 1 ]-------+----------- slot_name | replica plugin | slot_type | physical datoid | database | temporary | f active | t active_pid | 9241 xmin | catalog_xmin | restart_lsn | 0/1E000000 confirmed_flush_lsn |
Проверим еще:
β=> INSERT INTO test VALUES ('Я - бывшая реплика (новый мастер).');
INSERT 0 1
student$ psql -p 5432 -d replica_switchover
α=> SELECT * FROM test;
s ------------------------------------ Привет, мир! Я - бывшая реплика (новый мастер). (2 rows)
student$ sudo pg_ctlcluster 10 alpha promote
В итоге прежний мастер снова стал основным сервером.