Thank you for reading this post, don't forget to subscribe!
Рассмотри настройку потоковой репликации данных.
Когда вы изменяете данные в базе, все изменения пишутся во Write-Ahead Log, или WAL. После записи в WAL СУБД делает системный вызов fsync, благодаря чему данные попадают сразу на диск, а не висят в где-то в кэше файловой системы. Таким образом, если взять и обесточить сервер, при следующей загрузке СУБД прочитает последние записи из WAL и применит к базе данных соответствующие изменения.
Потоковая репликация (streaming replication) в сущности является передачей записей из WAL от мастера к репликам. Писать при этом можно только в мастер, но читать можно как с мастера, так и с реплик. Если с реплики разрешено читать, она называется hot standby, иначе — warm standby. Поскольку во многих приложениях 90% запросов являются запросами на чтение, репликация позволяет масштабировать базу данных горизонтально. Потоковая репликация бывает двух видов — синхронная и асинхронная.
При асинхронной репликации запрос тут же выполняется на мастере, а соответствующие данные из WAL доезжают до реплик отдельно, в фоне. Недостаток асинхронной репликации заключается в том, что при внезапном падении мастера (например, из-за сгоревшего диска) часть данных будет потеряна, так как они не успели доехать до реплик.
При использовании синхронной репликации данные сначала записываются в WAL как минимум одной реплики, после чего транзакция выполняется уже на мастере. Запросы на запись выполняются медленнее в результате возникающих сетевых задержек (которые, однако, внутри одного ДЦ обычно меньше типичного времени планирования запроса). Кроме того, чтобы запросы на запись не встали колом в результате падения одной из реплик, при использовании синхронной репликации рекомендуется использовать по крайней мере две реплики. Зато потерять данные становится намного сложнее.
Заметьте, что синхронная репликация не предотвращает возможности считать с реплики старые данные, так как потоковая репликация — она только про передачу WAL, а не то, что видно в базе с точки зрения пользователя. По крайней мере, так синхронная репликация работает конкретно в PostgreSQL.
В контексте репликации нельзя также не отметить еще один интересный термин. Если одна из реплик в свою очередь является мастером для другой реплики, такую конфигурацию называют каскадной репликацией.
Потоковая репликация в PostgreSQL не работает между разными версиями PostgreSQL, а также если на серверах используется разная архитектура CPU, например, x86 и x64. В частности, это означает, что обновить PostgreSQL до следующей версии при использовании потоковой репликации без даунтайма нельзя
Помимо потоковой репликации в последнее время выделяют еще и так называемую логическую репликацию (logical replication). Реализаций логической репликации в PostgreSQL существует несколько, например, slony и pglogical. Пожалуй, наиболее существенное отличие логической репликации от потоковой заключается в возможности реплицировать часть баз данных и таблиц на одни реплики, а часть — на другие. Платить за это приходится скоростью. И хотя pglogical в плане скорости выглядит многообещающе, на момент написания этих строк это очень молодое, сырое решение. В рамках этой заметки логическая репликация не рассматривается.
В PostgreSQL 10 добавили логическую репликацию, теперь она есть из коробки.
Установка
имеется 2 сервера
192.168.1.170 - master
192.168.1.171 - slave
Отключаем selinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
производим установку на оба сервера:
yum -y install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
или так
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install postgresql96 postgresql96-server postgresql96-lib
Инициализируем базы:
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Добавляем в автозагрузку и стартуем:
systemctl enable postgresql-9.6
systemctl start postgresql-9.6
Ставим пароль на пользователя postgres
[root@master ~]# su - postgres
-bash-4.2$ psql
psql (9.6.13)
Type "help" for help.
postgres=# \password
Enter new password:
Enter it again:
postgres=# \q
[root@slave ~]# su - postgres
-bash-4.2$ psql
psql (9.6.13)
Type "help" for help.
postgres=# \password
Enter new password:
Enter it again:
postgres=# \q
Настройка репликации
на мастере:
vim /var/lib/pgsql/9.6/data/pg_hba.conf
host replication postgres 192.168.1.171/32 md5
host all postgres 192.168.1.171/32 md5
Первая строчка нужна для работы утилиты pg_basebackup. Без второй не будет работать pg_rewind. Если хотим, чтобы в базу по сети мог ходить не только пользователь postgres, в последней строке можно написать вместо его имени all.
правим основной конфиг
vim /var/lib/pgsql/9.6/data/postgresql.conf
# какие адреса слушать, замените на IP сервера
listen_addresses = 'localhost, 192.168.1.170'
wal_level = hot_standby
# это нужно, чтобы работал pg_rewind
wal_log_hints = on
max_wal_senders = 2
wal_keep_segments = 64
hot_standby = on
max_replication_slots = 2
hot_standby_feedback = on
* где
- 192.168.1.170 — IP-адрес сервера, на котором он будем слушать запросы Postgre;
- wal_level указывает, сколько информации записывается в WAL (журнал операций, который используется для репликации) — hot_standby указывает на хранение дополнительной информации, она нужна для выполнения запросов на резервном сервере в режиме только для чтения;
- max_wal_senders — количество планируемых слейвов;
- max_replication_slots — максимальное число слотов репликации;
- hot_standby — определяет, можно или нет подключаться к postgresql для выполнения запросов в процессе восстановления;
- hot_standby_feedback — определяет, будет или нет сервер slave сообщать мастеру о запросах, которые он выполняет.
Далее открываем psql:
systemctl start postgresql-9.6
Меняем пароль пользователя postgres:
Перезапускаем PostgreSQL:
на слейве
Останавливаем PostgreSQL
[root@slave ~]# systemctl stop postgresql-9.6
Становимся пользователем postgres:
rm -rf /var/lib/pgsql/9.6/data/*
Password:
вводим пароль который задавали для пользователя postgres
-bash-4.2$ ls /var/lib/pgsql/9.6/data/
backup_label pg_dynshmem pg_notify pg_subtrans postgresql.conf
base pg_hba.conf pg_replslot pg_tblspc recovery.conf
global pg_ident.conf pg_serial pg_twophase
log pg_log pg_snapshots PG_VERSION
pg_clog pg_logical pg_stat pg_xlog
pg_commit_ts pg_multixact pg_stat_tmp postgresql.auto.conf
Данная команда сделала реплику базы от мастера и создала конфигурационный файл recovery.conf, в котором указаны параметры репликации.
Редактируем конфигурационный файл postgresql.conf.
[root@slave ~]# vim /var/lib/pgsql/9.6/data/postgresql.conf
Редактируем следующие параметры:
listen_addresses = 'localhost, 192.168.1.171'
* где 192.168.1.171 — IP-адрес нашего вторичного сервера.
так же можно указать просто звёздочку "*"
Редактируем файл recovery.conf и добавляем в него строку recovery_target_timeline = 'latest'
[root@slave ~]# cat /var/lib/pgsql/9.6/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=postgres password=postgres host=192.168.1.170 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
так же правим
/var/lib/pgsql/9.6/data/pg_hba.conf
host replication postgres 192.168.1.170/32 md5
host all postgres 192.168.1.170/32 md5
Снова запускаем сервис postgresql:
[root@slave ~]# systemctl start postgresql-9.6
СОЗДАЁМ replication_slots НА МАСТЕРЕ И СЛЕЙВЕ
На мастере
SELECT pg_create_physical_replication_slot('standby_slot');
На слейве
SELECT pg_create_physical_replication_slot('standby_1_slot');
Проверяем:
select * from pg_replication_slots;
Добавляем primary_slot_name = 'standby_slot' в recovery.conf на слейве,
а на мастере он будет выглядеть:
primary_slot_name = 'standby_1_slot'
по итогу на слейве recovery.conf :
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=IP_MATERa port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
primary_slot_name = 'standby_slot'
trigger_file = '/postgres/9.6/trigger'
на мастере recovery.doney
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=IP_SLAVEa port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
primary_slot_name = 'standby_1_slot'
trigger_file = '/postgres/9.6/trigger'
Проверка репликации
на слейве:
[root@slave ~]# ps aux | grep receiver
postgres 2406 0.2 0.1 362144 3160 ? Ss 18:39 0:02 postgres: wal receiver process streaming 0/30003E0
на мастере:
[root@master ~]# ps aux | grep sender
postgres 11487 0.0 0.1 355824 3004 ? Ss 18:39 0:00 postgres: wal sender process postgres 192.168.1.171(45747) streaming 0/30003E0
На мастере:
[root@master ~]# su - postgres
Last login: Wed Jun 5 18:07:00 KGT 2019 on pts/0
-bash-4.2$ psql
postgres=# select * from pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location |
write_location | flush_location | replay_location | sync_priority | sync_state
-------+----------+----------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+---------------+-
---------------+----------------+-----------------+---------------+------------
11487 | 10 | postgres | walreceiver | 192.168.1.171 | | 45747 | 2019-06-05 18:39:50.459205+06 | | streaming | 0/30004C0 |
0/30004C0 | 0/30004C0 | 0/30004C0 | 0 | async
(1 row)
Создаем новую базу данных:
postgres=# CREATE DATABASE repltest ENCODING='UTF8';
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
repltest | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
На слейве:
Last login: Wed Jun 5 19:15:35 KGT 2019 on pts/0
-bash-4.2$ psql
psql (9.6.13)
Type "help" for help.
postgres=# select * from pg_stat_wal_receiver;
pid | status | receive_start_lsn | receive_start_tli | received_lsn | received_tli | last_msg_send_time | last_msg_receipt_time | latest_end_lsn |
latest_end_time | slot_name | conninfo
-------+-----------+-------------------+-------------------+--------------+--------------+-------------------------------+-------------------------------+----------------+--
-----------------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------
11928 | streaming | 0/3000000 | 1 | 0/3001730 | 1 | 2019-06-05 19:24:29.285547+06 | 2019-06-05 19:24:28.979799+06 | 0/3001730 | 2
019-06-05 19:22:29.085126+06 | | user=postgres password=******** dbname=replication host=192.168.1.170 port=5432 fallback_application_name=walreceiver sslmode=pref
er sslcompression=1 krbsrvname=postgres
(1 row)
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+----------------------
-
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
repltest | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/postgres
(4 rows)
как видим тестовая база repltest создана и на слейве.
при попытке создать базу на слейве возникнет следующая ошибка:
CREATE DATABASE repltest2 ENCODING='UTF8';
ERROR: cannot execute CREATE DATABASE in a read-only transaction
Изменим Роли. Master => Slave а Salve => Master
Промоутим реплику до мастера
Остановим мастер:
systemctl stop postgresql-9.6
На слейве(из которого делаем мастера) говорим:
[root@slave ~]# sudo -u postgres /usr/pgsql-9.6/bin/pg_ctl promote -D /var/lib/pgsql/9.6/data/
could not change directory to "/root": Permission denied
server promoting
При этом в каталоге /var/lib/pgsql/9.6/data/ файл recovery.conf автоматически будет переименован в recovery.done.
[root@slave ~]# ll /var/lib/pgsql/9.6/data/recovery.done
-rw-r--r--. 1 postgres postgres 190 Jun 5 19:11 /var/lib/pgsql/9.6/data/recovery.done
В реплику теперь можно писать. Реплику и можно промоутнуть до мастера без перезапуска PostgreSQL, на практике вы, вероятно, все же захотите его перезапустить по следующей причине. Дело в том, что приложение, которое ранее подключилось к этой реплике, так и будет использовать ее в качестве реплики даже после промоута. Перезапустив PostgreSQL, вы порвете все сетевые соединения, а значит приложению придется подключиться заново, проверить, подключился ли он к мастеру или реплике (запрос SELECT pg_is_in_recovery();
вернет false на мастере и true на репликах)
Используем утилиту pg_rewind которая находит точку в WAL, начиная с которой WAL мастера и WAL реплики начинают расходиться. Затем она «перематывает» (отсюда и название) WAL реплики на эту точку и накатывает недостающую историю с мастера. Таким образом, реплика и местер всегда приходят к консистентному состоянию. Плюс к этому pg_rewind синхронизирует файлы мастера и реплики намного быстрее, чем pg_basebackup или rsync.
на мастере (из которого делаем слейв)говорим:
systemctl stop postgresql-9.6
[root@master 9.6]# sudo -u postgres /usr/pgsql-9.6/bin/pg_rewind -D /var/lib/pgsql/9.6/data/ --source-server="host=192.168.1.171 port=5432 user=postgres password=postgres"
servers diverged at WAL position 0/30000D0 on timeline 1
no rewind required
создаём
recovery.conf
[root@master 9.6]# cat /var/lib/pgsql/9.6/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=postgres password=postgres host=192.168.1.171 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
[root@master data]# chown postgres:postgres /var/lib/pgsql/9.6/data/recovery.conf
Запускаем:
[root@master data]# systemctl start postgresql-9.6
смотрим в логи. Там обязательно должно быть:
< 2019-06-05 23:38:52.217 KGT > LOG: database system is ready to accept read only connections
Если вдруг видим что-то вроде:
… значит реплика слишком отстала от мастера, и нужно перенести файлы с мастера при помощи pg_basebackup, как было описано в начале этой статьи.
проверяем, теперь "сервер мастер" у нас реплика а "сервер слейв" теперь мастер, следовательно на сервере мастер нельзя вносить изменения в базе.
[root@slave 9.6]# ps aux | grep sender
postgres 13964 0.0 0.1 355856 3104 ? Ss 23:38 0:00 postgres: wal sender process postgres 192.168.1.170(41249) streaming 0/3000480
[root@master data]# ps aux | grep receiver
postgres 12624 0.3 0.1 362176 3164 ? Ss 23:38 0:00 postgres: wal receiver process streaming 0/3000480
[root@master data]# sudo -u postgres psql
psql (9.6.13)
Type "help" for help.
postgres=# CREATE DATABASE repltest45 ENCODING='UTF8';
ERROR: cannot execute CREATE DATABASE in a read-only transaction
на "сервере слейв" всё ок
[root@slave 9.6]# sudo -u postgres psql
psql (9.6.13)
Type "help" for help.
postgres=# CREATE DATABASE repltest55 ENCODING='UTF8';
CREATE DATABASE
Вернём всё как было т.е. master=>master а slave => slave
Промоутим до мастера
Остановим мастер(postgres):
[root@slave ~]# systemctl stop postgresql-9.6
На "мастер сервере"(из которого делаем мастера(postgres)) говорим:
[root@master ~]# sudo -u postgres /usr/pgsql-9.6/bin/pg_ctl promote -D /var/lib/pgsql/9.6/data/
could not change directory to "/root": Permission denied
server promoting
При этом в каталоге /var/lib/pgsql/9.6/data/ файл recovery.conf автоматически будет переименован в recovery.done.
[root@master ~]# ll /var/lib/pgsql/9.6/data/recovery.done
-rw-r--r--. 1 postgres postgres 191 Jun 5 23:37 /var/lib/pgsql/9.6/data/recovery.done
В реплику теперь можно писать. Реплику и можно промоутнуть до мастера без перезапуска PostgreSQL, на практике вы, вероятно, все же захотите его перезапустить по следующей причине. Дело в том, что приложение, которое ранее подключилось к этой реплике, так и будет использовать ее в качестве реплики даже после промоута. Перезапустив PostgreSQL, вы порвете все сетевые соединения, а значит приложению придется подключиться заново, проверить, подключился ли он к мастеру или реплике (запрос SELECT pg_is_in_recovery();
вернет false на мастере и true на репликах)
Используем утилиту pg_rewind которая находит точку в WAL, начиная с которой WAL мастера и WAL реплики начинают расходиться. Затем она «перематывает» (отсюда и название) WAL реплики на эту точку и накатывает недостающую историю с мастера. Таким образом, реплика и местер всегда приходят к консистентному состоянию. Плюс к этому pg_rewind синхронизирует файлы мастера и реплики намного быстрее, чем pg_basebackup или rsync.
на "слейв сервере"(из которого делаем слейв)говорим:
systemctl stop postgresql-9.6
[root@slave ~]# sudo -u postgres /usr/pgsql-9.6/bin/pg_rewind -D /var/lib/pgsql/9.6/data/ --source-server="host=192.168.1.170 port=5432 user=postgres password=postgres"
could not change directory to "/root": Permission denied
servers diverged at WAL position 0/3002C08 on timeline 2
no rewind required
так как recovery.conf создавался ранее то просто переименуем его:
[root@slave ~]# mv /var/lib/pgsql/9.6/data/recovery.done /var/lib/pgsql/9.6/data/recovery.conf
[root@slave ~]# cat /var/lib/pgsql/9.6/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=postgres password=postgres host=192.168.1.170 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
Запускаем:
[root@slave ~]# systemctl start postgresql-9.6
смотрим в логи. Там обязательно должно быть:
< 2019-06-05 23:27:05.175 KGT > LOG: database system is ready to accept read only connections
Если вдруг видим что-то вроде:
… значит реплика слишком отстала от мастера, и нужно перенести файлы с мастера при помощи pg_basebackup, как было описано в начале этой статьи.
проверяем, теперь "сервер мастер" у нас мастер(postgres ) а "сервер слейв" теперь реплика.
[root@master ~]# ps aux | grep sender
postgres 12763 0.0 0.1 355856 3092 ? Ss 02:17 0:00 postgres: wal sender process postgres 192.168.1.171(46672) streaming 0/3002DF8
[root@slave ~]# ps aux | grep receiver
postgres 14251 0.3 0.1 362176 3172 ? Ss 02:17 0:00 postgres: wal receiver process streaming 0/3002DF8
всё ок
Если необходимо чтобы репликация производилась под определённым пользователем, например repluser то добавляем в файл:
Создаём пользователя:
CREATE USER repluser REPLICATION LOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'repluser';
cat /var/lib/pgsql/9.6/data/pg_hba.conf
host replication repluser 192.168.1.170/32 md5
host all postgres 192.168.1.170/32 md5
на втором сервере:
host replication repluser 192.168.1.171/32 md5
host all postgres 192.168.1.171/32 md5
На мастере
cat /var/lib/pgsql/9.6/data/recovery.done
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=192.168.1.171 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
На слейве:
cat /var/lib/pgsql/9.6/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=192.168.1.170 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
Команды будут выполнятся соответсвенно от этого пользователя:
sudo -u postgres pg_basebackup -h 192.168.1.170 -U repluser -D /var/lib/pgsql/9.6/data --xlog-method=stream --write-recovery-conf
Если необходимо изменить расположение базы то:
vim /usr/lib/systemd/system/postgresql-9.6.service
Редактируем путь:
c
Environment=PGDATA=/var/lib/pgsql/9.6/data/
на
Environment=PGDATA=/postgres/9.6/
после
systemctl daemon-reload
mkdir /postgres/9.6
chown -R postgres:postgres /postgres/
правим домашнюю директорию:
cat /etc/passwd | grep postges
postgres:x:26:26:PostgreSQL Server:/postgres:/bin/bash
Инициируем базу
su - postgres
/usr/pgsql-9.6/bin/initdb -D /postgres/9.6/
=================================================
Репликация с использованием triger файла
Процесс такой же как и при настройке обычной репликации, инициируем базу, создаём пользователя repluser даём права в pg_hba.conf
Копируем базу на слейв:
sudo -u postgres pg_basebackup -h -U repluser -D /postgres/9.6/ --xlog-method=stream --write-recovery-conf
СОЗДАЁМ replication_slots НА МАСТЕРЕ И СЛЕЙВЕ
На мастере
SELECT pg_create_physical_replication_slot('standby_slot');
На слейве
SELECT pg_create_physical_replication_slot('standby_1_slot');
Проверяем:
select * from pg_replication_slots;
Добавляем primary_slot_name = 'standby_slot' в recovery.conf на слейве,
а на мастере он будет выглядеть:
primary_slot_name = 'standby_1_slot'
====================
На слейве recovery conf выглядит следующим образом:
cat /postgres/9.6/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=IP-master port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
primary_slot_name = 'standby_slot'
trigger_file = '/postgres/9.6/trigger'
Мы добавили строку trigger_file = '/postgres/9.6/trigger' для того, чтобы при создании файла /postgres/9.6/trigger слейв база становилась мастером и могла производить запись
На мастере recovery конф нет, но заранее создадим recovery.done
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=IP-slave port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
primary_slot_name = 'standby_1_slot'
trigger_file = '/postgres/9.6/trigger'
==========================
Переключим слейв в мастер
Остановим мастер:
systemctl stop postgresql-9.6
На слейве проверим наличие файла recovery.conf и создадим файл triger
[root@btc-vsrv-mpaydb2 9.6]# cat /postgres/9.6/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=repluser password=repluser host=IP-master port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
recovery_target_timeline = 'latest'
primary_slot_name = 'standby_slot'
trigger_file = '/postgres/9.6/trigger'
[root@btc-vsrv-mpaydb2 9.6]# touch /postgres/9.6/trigger
Проверяем логи:
[root@btc-vsrv-mpaydb2 9.6]# tail /postgres/9.6/pg_log/postgresql-Thu.log
< 2019-06-20 13:29:23.672 +06 > LOG: trigger file found: /postgres/9.6/trigger
< 2019-06-20 13:29:23.672 +06 > LOG: redo done at 0/1A000E50
< 2019-06-20 13:29:23.682 +06 > LOG: selected new timeline ID: 7
< 2019-06-20 13:29:23.784 +06 > LOG: archive recovery complete
< 2019-06-20 13:29:23.807 +06 > LOG: MultiXact member wraparound protections are now enabled
< 2019-06-20 13:29:23.809 +06 > LOG: database system is ready to accept connections
< 2019-06-20 13:29:23.810 +06 > LOG: autovacuum launcher started
Строка database system is ready to accept connections показывает, что сервер перешёл в режим записи
Файл /postgres/9.6/trigger при этом с бывшего слейва удаляется, а recovery.conf автоматически переименовывается в recovery.done
Чтобы мастер перешёл в режим read only нам необходмо переименовать recovery.conf
mv recovery.done recovery.conf
И стартануть базу
systemctl start postgresql-9.6
Проверяем:
[root@btc-vsrv-mpaydb1 9.6]# ps aux | grep rec
postgres 3837 0.0 0.0 362620 2536 ? Ss 13:35 0:00 postgres: startup process recovering 00000006000000000000001A
postgres 3841 0.0 0.0 369412 3264 ? Ss 13:35 0:00 postgres: wal receiver process idle
root 4037 0.0 0.0 112708 980 pts/0 S+ 13:38 0:00 grep --color=auto rec
Бывший мастер теперь выступает как слейв
=================================
Чтобы вернуть как было мастер - мастер слейв- слейв.
Осанавливаем базу
[root@btc-vsrv-mpaydb2 9.6]# systemctl stop postgresql-9.6
переименовываем
[root@btc-vsrv-mpaydb2 9.6]# mv recovery.done recovery.conf
На мастере создаём файл trigger
[root@btc-vsrv-mpaydb1 9.6]# touch trigger
(на данном сервере файл recovery.conf автоматические переименовался в recovery.done)
Стартуем на слейве:
[root@btc-vsrv-mpaydb2 9.6]# systemctl start postgresql-9.6
Проверяем:
[root@btc-vsrv-mpaydb2 9.6]# ps aux | grep rec
postgres 7688 0.0 0.0 362620 2524 ? Ss 15:08 0:00 postgres: startup process recovering 0000000F000000000000001E
postgres 7692 0.3 0.0 369260 3256 ? Ss 15:08 0:00 postgres: wal receiver process streaming 0/1E000A80
[root@btc-vsrv-mpaydb1 9.6]# ps aux | grep send
postgres 10459 0.0 0.0 362924 3048 ? Ss 15:08 0:00 postgres: wal sender process repluser IP-master(56130) streaming 0/1E000A80
[root@btc-vsrv-mpaydb2 9.6]# su - postgres
Last login: Thu Jun 20 12:45:09 +06 2019 on pts/0
-bash-4.2$ psql
psql (9.2.24, server 9.6.13)
WARNING: psql version 9.2, server version 9.6.
Some psql features might not work.
Type "help" for help.
postgres=# select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
----------------+--------+-----------+--------+----------+--------+------------+------+--------------+-------------+---------------------
standby_1_slot | | physical | | | f | | 1773 | | 0/1E0008C8 |
(1 row)
[root@btc-vsrv-mpaydb1 9.6]# su - postgres
Last login: Thu Jun 20 14:42:01 +06 2019 on pts/0
-bash-4.2$ psql
psql (9.2.24, server 9.6.13)
WARNING: psql version 9.2, server version 9.6.
Some psql features might not work.
Type "help" for help.
postgres=# select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
--------------+--------+-----------+--------+----------+--------+------------+------+--------------+-------------+---------------------
standby_slot | | physical | | | t | 10459 | 1773 | | 0/1E000B60 |
(1 row)