Настройка репликации без архива

Все нужное для 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

В итоге прежний мастер снова стал основным сервером.