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

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

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