С места в карьер. Вот то, что вы получите в конце:
- Синхронный резервный сервер с использованием repmgr
- Демоны repmgr, работающие не на серверах БД
- Не нужен witness-сервер с собственным экземпляром PostgreSQL
- Auto-failover устойчивый к split-brain
- Сервер высокой доступности без дополнительных утилит, таких как HAProxy
- Сервер бэкапирования с использованием barman
- Асинхронная потоковая репликация WAL
- Которая становится синхронной, если один из БД серверов упадет. Как минимум два узла кластера работают синхронно в любой момент времени.
- Хранение бэкапов мастера и резервного сервера в одном месте, используя фичу высокой доступности. Экономим дисковое пространство.
- Использование barman как единое место хранения WAL и место восстановления кластера.
- Ansible playbook для автоматического развертывания
Часть 1. Введение.
Часть 2. Репликация. Repmgr.
Часть 3. Auto-failover. Демоны repmgr.
Часть 4. Высокая доступность. Бэкапирование. Демоны repmgr. Barman.
Часть 5. Тестирование. Ansible. Вместо послесловия.
Софт
- Debian 9.7
- PostgreSQL 11.2 (Debian 11.2-1.pgdg90+1)
- Repmgr 4.2
- Barman 2.7
- OpenVPN 2.4.0
Топология
Поехали
Для начала, добавим необходимые репозитории и установим PostgreSQL на всех серверах.
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)"-pgdg main | tee /etc/apt/sources.list.d/pgdg.list apt update apt install postgresql-11 update-rc.d postgresql enable systemctl restart postgresql
Изменим пароль юзера postgres на серверах db1 и db2. Он понадобится нам в части 3.
passwd postgres
Затем добавим репозитории 2ndQuadrant(разработчик repmgr и barman) на все серверы.
apt install curl apt-transport-https sh -c 'echo "deb https://apt.2ndquadrant.com/ $(lsb_release -cs)-2ndquadrant main" > /etc/apt/sources.list.d/2ndquadrant.list' curl https://apt.2ndquadrant.com/site/keys/9904CD4BD6BAF0C3.asc | apt-key add - apt update
Установите следующие утилиты на все серверы. barman-cli это набор скриптов, позволяющий удаленно и безопасно(в случае разрывов) архивировать и получать WAL.
apt install postgresql-11-repmgr barman-cli sudo
У становите barman на сервер backup.
apt install barman
Измените пароль юзера barman на сервере backup. Он понадобится нам в части 4.
passwd barman
Объединяем серверы в единую сеть(опционально)
Чтобы процесс репликации и бэкапирования был безопасным, мы должны объединить серверы используя безопасное соединение.
Возможно, вам не понадобится выполнять эти шаги, если ваши серверы уже объединены в сеть используя безопасную сеть вашего датацентра. Однако, я не рекомендую вам держать все яйца в одной корзине.
Как бы то ни бьыло, имейте в виду, что вы должны заменить следующие IP на ваши там, где их увидите.
10.8.1.1 10.8.2.1 10.8.3.1
ОК, давайте объединим серверы используя point-to-point соединение OpenVPN.
Для начала, установим OpenVPN и сгенерируем ключ сервера.
apt install openvpn openvpn --genkey --secret /etc/openvpn/server.key
Затем, удаленно скопируем ключи на соответственные серверы-клиенты.
С сервера db1 на db2.
scp /etc/openvpn/server.key root@db2_ip_or_host:/etc/openvpn/client.key
С сервера db2 на backup.
scp /etc/openvpn/server.key root@backup_ip_or_host:/etc/openvpn/client.key
С сервера backup на db1.
scp /etc/openvpn/server.key root@db1_ip_or_host:/etc/openvpn/client.key
Далее создадим конфиги сервера и клиента на всех серверах.
db1/etc/openvpn/server.conf
dev tun ifconfig 10.8.1.1 10.8.2.1 secret server.key cipher AES-256-CBC keepalive 3 9 ping-timer-rem
/etc/openvpn/client.conf
remote backup_ip_or_host dev tun ifconfig 10.8.1.1 10.8.3.1 secret client.key cipher AES-256-CBC keepalive 3 18 nobind
db2/etc/openvpn/server.conf
dev tun ifconfig 10.8.2.1 10.8.3.1 secret server.key cipher AES-256-CBC keepalive 3 9 ping-timer-rem
/etc/openvpn/client.conf
remote db1_ip_or_host dev tun ifconfig 10.8.2.1 10.8.1.1 secret client.key cipher AES-256-CBC keepalive 3 18 nobind
backup/etc/openvpn/server.conf
dev tun ifconfig 10.8.3.1 10.8.1.1 secret server.key cipher AES-256-CBC keepalive 3 9 ping-timer-rem
/etc/openvpn/client.conf
remote db2_ip_or_host dev tun ifconfig 10.8.3.1 10.8.2.1 secret client.key cipher AES-256-CBC keepalive 3 18 nobind
Перегрузим конфиги и рестартанем OpenVPN.
update-rc.d openvpn enable systemctl daemon-reload systemctl restart openvpn
Отлично! Теперь мы готовы к настройке репликации с использованием repmgr.