Пример настройки синхронной реплики
Внимание!
В данном разделе приводится конечный пример настройки кластера баз данных с синхронной репликации. Обратите внимание, что здесь приводятся некоторые параметры, такие как ip адреса хостов или каталоги баз данных, которые могут не соответствовать вашим.
Начальные условия
Операционная система на серверах - CentOS 7.
172.31.101.70 - IP сервера, назначенного как Master.
172.31.101.71 - Соответсвенно IP Standby сервера.
СУБД установлена из RPM пакетов (см. Страница загрузки. QHB для Centos 7 и 8).
Каталог размещения БД - PG_DATA = /u01/qhb/db
/usr/local/qhb/
- путь установки QHB (по умолчанию)
Сервисы systemd сконфигурированы с учётом вышеперечисленного.
Настройка Master
- Создаем пользователя PostgreSQL для репликации
create user repluser replication password 'repluser';
- Устанавливаем необходимые параметры в файле конфигурации
vi /u01/qhb/db/qhb.conf
listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 2
max_replication_slots = 2
hot_standby = on
hot_standby_feedback = on
logging_collector = on
log_directory = './log'
synchronous_commit = on
synchronous_standby_names = '*'
- Устанавливаем параметры доступа к БД с standby машины
vi /u01/qhb/db/qhb_hba.conf
host replication repluser 172.31.101.70/32 md5
host replication repluser 172.31.101.71/32 md5
Существующую запись
host replication
не изменяем
- Производим рестарт сервиса СУБД
systemctl restart qhb && systemctl status qhb
Настройка Standby
- Останавливаем сервис СУБД на сервере реплики
systemctl stop qhb && systemctl status qhb
- Удаляем директорию с данными БД
Внимание !: Удаляя директорию, вы должны полностью осознавать необратимость данного действия, и тот факт что все данные, файлы конфигурации и логи будут утеряны без возможности восстановления.
rm -rf /u01/qhb/db/* # Я понимаю что делает эта команда
- Если объём данных в БД большой, то рекомендовано воспользоваться копией данных, при её наличии. В случае если ситуация позволяет, выполняем восстановление через бэкап.
Восстановление через утилиту бэкапирования, запускается от системного пользователя QHB:
sudo -u qhb \#
/usr/local/qhb/bin/qhb_basebackup \#Утилита бэкапа
-h 172.31.101.70 \ # IP адрес мастер сервера
-p 5432 \ # Порт по умолчанию, сменить если меняли конфигурацию
-U repluser \ # созданный на мастере ранее пользователь с правами репликации
-D /u01/qhb/db/ \ # директория размещения СУБД
-Fp -Xs -P -R # Набор ключей необходимы для репликации
Для лучшего понимания, следует ознакомиться с функционированием ключей
-Fp -Xs -P -R
утилиты, описанных в Параметры qhb_basebackup.
Если делается копия при помощи qhb_basebackup
, параметры подключения для
реплики будут указаны в файле qhb.auto.conf
.
Следует удостовериться в корректности заданной строки подключения.
Если копия БД была развёрнута через файл (или иной корректный способ, не указанный в данной инструкции), то до старта необходимо скорректировать несколько параметров:
- запуску сервера СУБД в режиме, стендбай. Для этого требуется создать файл standby.signal в директории кластера БД (рядом с qhb.conf).
sudo -u qhb touch /u01/qhb/db/standby.signal
ls -la standby.signal
#-rw------- 1 qhb qhb 0 Nov 25 15:34 standby.signal
- в файле конфигурации
qhb.conf
необходимо указать строку подключения к мастер-серверу:
primary_conninfo = 'user=repluser password=repluser host=172.31.101.70 port=5432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
Строка подключения длинная, и некоторые консольные редакторы могут применить опцию word-wrap, нарушая визуальную целостность строки.
- В обоих случаях, параметры СУБД в файле конфигурации будут скопированы с мастера, и следует изменить некоторые значения, на соответствующие реплике. \ Параметры на реплике указываем такие:
vi /u01/qhb/db/qhb.conf
listen_addresses = '*'
logging_collector = on
log_directory = 'log' # удостоверьтесь в существовани директории и наличии необходимых прав.
- Теперь и только теперь, можно запустить СУБД на втором сервере, реплике.
systemctl start qhb && systemctl status qhb
Проверка
- Проверяем на мастере:
/usr/local/qhb/bin/psql -x -c "select * from pg_stat_replication"
Должен высветится один слот:
pid | 15566
usesysid | 16385
usename | repluser
application_name | walreceiver
client_addr | 172.31.101.71
client_hostname |
client_port | 40516
backend_start | 2020-11-25 09:45:22.249802-03
backend_xmin |
state | streaming
sent_lsn | 0/30001F8
write_lsn | 0/30001F8
flush_lsn | 0/30001F8
replay_lsn | 0/30001F8
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
^^^^^^^
reply_time | 2020-11-25 09:47:22.710523-03
Причём sync_state должен быть sync
(репликация синхронная)
- Создадим таблицу на мастере:
CREATE TABLE rtest (vname VARCHAR(40));
- Заполним случайными значениями на миллион строк:
insert into rtest select substr(md5(random()::text), 0, 40) from generate_series(1,1000000);
- На слейве проверяем чтение из таблицы:
qhb=# select count(*) from rtest;
count
---------
1000000
(1 row)
Дополнительные настройки
В некоторых вариантах рекомендовано прописать явное указание слота репликации.
На реплике в файл qhb.auto.conf
добавить параметр primary_slot_name = 'standby_slot2_qhb'
.
На мастере выполнить SQL
SELECT pg_create_physical_replication_slot('standby_slot2_qhb');
Запрос по активным слотам репликации должен показывать на мастере нашу реплику
select * from pg_replication_slots where active=true;