ELMA365 On-Premises > Подготовка инфраструктуры > Базы данных > Отказоустойчивая инфраструктура / Кластер Hot Standby PostgreSQL

Кластер Hot Standby PostgreSQL

В дополнение к статье «Кластер PostgreSQL» для катастрофоустойчивости можно использовать отдалённый географически Standby кластер PostgreSQL, который обеспечивает высокий уровень доступности и аварийного восстановления. Standby кластер PostgreSQL содержит только резервные узлы, реплицирующиеся с какого-либо удалённого мастера https://patroni.readthedocs.io/en/latest/replica_bootstrap.html#standby-cluster

Этот тип кластеров имеет:

  • резервный лидер, который ведёт себя почти так же, как обычный лидер кластера, за исключением того, что он реплицируется с удалённого мастера;
  • каскадные реплики, которые реплицируются из резервного лидера.

Шаг 1: Настройка PostgreSQL

  1. На всех серверах баз данных добавьте в конфигурационный файл pg_hba.conf информацию о всех узлах каждого кластера, чтобы разрешить соединения с разных серверов:

#Patroni
host all all 0.0.0.0/0 md5
#Cluster hosts 1
host replication replicator 192.168.1.1/32 md5
host replication replicator 192.168.1.2/32 md5
host replication replicator 192.168.1.3/32 md5
#Standby сluster hosts 2
host replication replicator 192.168.2.1/32 md5
host replication replicator 192.168.2.2/32 md5
host replication replicator 192.168.2.3/32 md5

  1. Перезапустите PostgreSQL на всех узлах:

systemctl restart postgresql

Шаг 2: Настройка Patroni

  1. На серверах Standby кластера в конфигурационном файле /etc/patroni/config.yml поменяйте значения scope, name, которые не должны совпадать с основным кластером. Замените адреса всех серверов:

scope: postgres-cluster2 #  одинаковое значение на всех узлах Standby кластера
name: postgresql-server4 # разное значение на всех узлах Standby кластера

  1. Добавьте раздел standby_cluster в секцию bootstrap, dcs в текущий конфигурационный файл /etc/patroni/config.yml и укажите удалённого мастера, который в данном примере определяется через haproxy:

bootstrap:
dcs:
  standby_cluster:
      host: haproxy-server.your_domain
      port: 5000
      create_replica_methods:
      - basebackup

  1. На основном и Standby кластере добавьте адреса всех серверов, используемых в кластерах в раздел pg_hba в текущий конфигурационный файл /etc/patroni/config.yml:

pg_hba:
- host all all 0.0.0.0/0 md5
- host replication replicator localhost trust
#Cluster hosts 1
- host replication replicator 192.168.1.1/32 md5
- host replication replicator 192.168.1.2/32 md5
- host replication replicator 192.168.1.3/32 md5
#Cluster hosts 2
- host replication replicator 192.168.2.1/32 md5
- host replication replicator 192.168.2.2/32 md5
- host replication replicator 192.168.2.3/32 md5

  1. Запустите службу Patroni:

sudo systemctl enable --now patroni.service

Если ранее служба Patroni была запущена на Standby кластере, то на каждом узле Standby кластера остановите службу Patroni. Удалите каталог данных postgresql, очистите информацию о кластере и повторно запустите службу Patroni:

sudo systemctl stop patroni
sudo rm -rf /var/lib/postgresql/10/main
sudo etcdctl rm --recursive /service/postgres-cluster2
sudo systemctl restart patroni

  1. Проверьте состояние Standby кластера:

patronictl -c /etc/patroni/config.yml list

Идентификатор кластера должен совпадать с основным кластером, роль у лидера должна быть Standby Leader.

  1. В случае недоступности основного кластера для смены режима Standby кластера на основной удалите раздел standby_cluster из текущей конфигурации patroni с помощью команды:

patronictl edit-config --force -s standby_cluster.host='' -s standby_cluster.port='' -s standby_cluster.create_replica_methods=''

Важно не допустить работы двух мастеров, в момент восстановления вышедшего ранее основного кластера он также останется мастером.

  1. После восстановления вышедшего ранее основного кластера для смены режима с основного на Standby кластер добавьте раздел standby_cluster в текущую конфигурацию patroni с помощью команды:

patronictl edit-config --force -s standby_cluster.host=haproxy-server.your_domain -s standby_cluster.port=5000 -s standby_cluster.create_replica_methods='- basebackup'

Шаг 3: Конфигурация HAproxy (блок postgres)

Дополните конфигурацию HAproxy блока postgres указав адреса всех серверов, используемых в кластерах:

listen postgres_master
    bind haproxy-server.your_domain:5000
    option tcplog
    option httpchk OPTIONS /master
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 4 on-marked-down shutdown-sessions
    server postgres-server1 postgres-server1.your_domain:5432 check port 8008
    server postgres-server2 postgres-server2.your_domain:5432 check port 8008
    server postgres-server3 postgres-server3.your_domain:5432 check port 8008
    server postgres-server4 postgres-server4.your_domain:5432 check port 8008
    server postgres-server5 postgres-server5.your_domain:5432 check port 8008
    server postgres-server6 postgres-server6.your_domain:5432 check port 8008
 
listen postgres_replicas
    bind haproxy-server.your_domain:5001
    option tcplog
    option httpchk OPTIONS /replica
    balance roundrobin
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgres-server1 postgres-server1.your_domain:5432 check port 8008
    server postgres-server2 postgres-server2.your_domain:5432 check port 8008
    server postgres-server3 postgres-server3.your_domain:5432 check port 8008
    server postgres-server4 postgres-server4.your_domain:5432 check port 8008
    server postgres-server5 postgres-server5.your_domain:5432 check port 8008
    server postgres-server6 postgres-server6.your_domain:5432 check port 8008