# Настройка репликации между первым и вторым серверами

Сначала создадим базу данных.

    student$ psql

    α=> CREATE DATABASE replica_usecases;

    CREATE DATABASE

    α=> \c replica_usecases

    You are now connected to database "replica_usecases" as user "student".

Слот:

    α=> 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

# Настройка репликации между вторым и третьим серверами

Слот:

    student$ psql -p 5433 -d replica_usecases

    β=> SELECT pg_create_physical_replication_slot('replica');

     pg_create_physical_replication_slot
    -------------------------------------
     (replica,)
    (1 row)

Создадим автономную резервную копию cо второго сервера, чтобы показать возможность выполнения резервного копирования с реплики. Используем созданный слот, копию записываем в каталог PGDATA будущей третьей реплики.

    postgres$ rm -rf /var/lib/postgresql/10/gamma/*

    postgres$ pg_basebackup -U student -p 5433 --pgdata=/var/lib/postgresql/10/gamma -R --slot=replica

Меняем порт и включаем режим горячего резерва:

    postgres$ echo 'port = 5434' >> /var/lib/postgresql/10/gamma/postgresql.auto.conf

    postgres$ echo 'hot_standby = on' >> /var/lib/postgresql/10/gamma/postgresql.auto.conf

Файл recovery.conf подготовлен утилитой pg_basebackup. Дополнительно устанавливаем указание целевой ветви восстановления и задержку воспроизведения:

    postgres$ echo "recovery_target_timeline = 'latest'" >> /var/lib/postgresql/10/gamma/recovery.conf

    postgres$ echo "recovery_min_apply_delay = '10s'" >> /var/lib/postgresql/10/gamma/recovery.conf

Вот что получилось:

    postgres$ cat /var/lib/postgresql/10/gamma/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'
    recovery_target_timeline = 'latest'
    recovery_min_apply_delay = '10s'

Запускаем реплику.

    student$ sudo pg_ctlcluster 10 gamma start

# Проверка работы

На первом сервере создадим таблицу и проверим, что она появилась сначала на одной реплике, а через 10 секунд - и на другой.

    α=> CREATE TABLE test(s text);

    CREATE TABLE

    α=> INSERT INTO test VALUES ('Привет, мир!');

    INSERT 0 1

Проверяем одну реплику:

    β=> SELECT * FROM test;

          s
    --------------
     Привет, мир!
    (1 row)

Проверяем другую реплику:

    student$ psql -p 5434 -d replica_usecases

    γ=> SELECT * FROM test;

    ERROR:  relation "test" does not exist
    LINE 1: SELECT * FROM test;
                          ^

Таблицы пока нет. Подождем 10 секунд...

    γ=> SELECT * FROM test;

          s
    --------------
     Привет, мир!
    (1 row)

Таблица появилась.

# Переход на второй сервер

    α=> \q

    student$ sudo pg_ctlcluster 10 alpha stop

    student$ sudo pg_ctlcluster 10 beta promote

# Проверка работы

На втором сервере добавим в таблицу строки и проверим, что они появились на третьем сервере через 10 секунд.

    β=> INSERT INTO test VALUES ('После перехода на второй сервер');

    INSERT 0 1

Проверяем:

    γ=> SELECT * FROM test;

          s
    --------------
     Привет, мир!
    (1 row)

Данных пока нет. Ждем 10 секунд...

    γ=> SELECT * FROM test;

                    s
    ---------------------------------
     Привет, мир!
     После перехода на второй сервер
    (2 rows)

Данные появились.