Инструкция по установке и настройке кластера СУБД Postgresql

Содержание

Инструкция по установке и настройке кластера СУБД Postgresql#

Исппользуемые термины#

Термин

Значение / расшифровка (рекомендуется добавить в инструкцию)

NTP

Network Time Protocol — протокол синхронизации времени

VIP

Virtual IP — виртуальный IP-адрес

NFS

Network File System — протокол сетевых файловых систем

pgbouncer

Лёгкий пул соединений для PostgreSQL

pcsd, corosync, pacemaker, sbd

Компоненты кластерного ПО (Pacemaker stack)

CRM

Cluster Resource Manager (часть Pacemaker)

STONITH

Shoot The Other Node In The Head — механизм fencing в кластере

HACLUSTER

Системный пользователь для управления кластером

pg_stat_statements

Расширение PostgreSQL для анализа запросов

pg_basebackup

Утилита PostgreSQL для создания резервной копии

pg_probackup

Расширенная утилита для резервного копирования PostgreSQL

WAL

Write Ahead Log — журнал предзаписи PostgreSQL

sysctl

Инструмент управления параметрами ядра Linux

udevadm

Утилита управления правилами устройств (udev)

.pgpass

Файл с паролями для автоматического подключения к PostgreSQL

pg_ctl

Утилита управления экземпляром PostgreSQL

promote/demote

Повышение/понижение роли реплики в кластере

crm_mon

Мониторинг состояния ресурсов кластера

SBD

STONITH Block Device — метод fencing с использованием устройств

HA

High Availability — высокая доступность

Подготовка ОС#

Требования для установки кластера СУБД#

  • Установлена ОС ALT Linux v.10.2, подключен официальный репозиторий вендора ОС.

  • Минимальные требования для узла с ролью голосующий – 4 vCPU, 4GB RAM, 50GB Hard Drive

  • СУБД – PostgreSQL v.16.4 (или новее).

  • Сконфигурирована синхронизация времени по ntp;

  • Обеспечено беспрепятственное прохождение трафика между узлами по портам, указанным в таблице.

Таблица узлов#

Роль узла

DNS имя

IP адрес

Порты

сервер БД

alt-db-1

IP.alt-db-1

22,2224,5405,5432,6432

сервер БД

alt-db-2

IP.alt-db-2

22,2224,5405,5432,6432

голосующий

alt-voter

IP.alt-voter

22,2224,5405

nfs

alt-nfs-1

IP.alt-nfs-1

111,2049

nfs

alt-nfs-2

IP.alt-nfs-2

111,2049

Виртуальный IP

-

VIP-master

5432

Виртуальный IP

-

VIP-pgbouncer

6432

  • Имена узлов, указанных в таблицах, должны разрешаться службой DNS или вручную указаны в /etc/hosts (предпочтительнее)

  • Среднее время задержки между узлами не должно превышать 5мс

  • Пропускная способность между узлами должна быть не менее 1 Гбит/с

  • Скорость записи и чтения на сетевые папки NFS с узлов СУБД должна быть не менее 500 МБ/с

  • Смонтированы необходимые NFS разделы:

    • На узле с СУБД на основном ЦОД монтируется по NFS общая сетевая папка backup с СХД локальной площадки как /bkp-local, общая сетевая папка backup с СХД удаленной площадки как /bkp-rmt.

    • На узле с СУБД на резервном ЦОД монтируется по NFS общая сетевая папка backup с СХД локальной площадки как /bkp-local, общая сетевая папка backup с СХД удаленной площадки как /bkp-rmt.

Схема монтирования сетевых папок NFS#

Имя сетевой папки NFS

Точка монтирования на узле alt-db-1

Точка монтирования на узле alt-db-2

IP.alt-nfs-1:/backup

/bkp-local

/bkp-rmt

IP.alt-nfs-2:/backup

/bkp-rmt

/bkp-local

Пример: На alt-db-1

sudo mkdir /bkp-local
sudo mkdir /bkp-rmt
sudo mount -t nfs -o rw,hard,vers=4.2 IP.alt-nfs-1:/mnt/nfs-share/ /bkp-local
sudo mount -t nfs -o rw,hard,vers=4.2 IP.alt-nfs-2:/mnt/nfs-share/ /bkp-rmt

На alt-db-2

sudo mkdir /bkp-local
sudo mkdir /bkp-rmt
sudo mount -t nfs -o rw,hard,vers=4.2 IP.alt-nfs-2:/mnt/nfs-share/ /bkp-local
sudo mount -t nfs -o rw,hard,vers=4.2 IP.alt-nfs-1:/mnt/nfs-share/ /bkp-rmt

Создание файлов#

Создать файл /etc/security/limits.d/99-pg.conf с содержимым

(настройки приведены для случая max_connections=500)

postgres softnproc 16384
postgres hardnproc 16384
postgres softnofile 65536
postgres hardnofile 65536
postgres softstack 10240
postgres hardstack 32768

Создать файл /etc/sysctl.d/99-pg.conf с содержимым

kernel.sysrq = 1
kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t
vm.mmap_min_addr = 65536
vm.swappiness = 1
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
kernel.shmmax = 4398046511104
kernel.shmall = 1073741824
kernel.shmmni = 4096
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0
kernel.sem = 250 512000 100 2048

Применить настройки командой

sysctl -p /etc/sysctl.d/99-pg.conf

Примечание

Примечание. Приведенные настройки могут быть изменены в зависимости от нагрузки и количества подключений к СУБД.

Заполнить файл hosts#

Дополните файл hosts на каждом узле, пример содержания приведен ниже

127.0.0.1       localhost.localdomain localhost
192.168.242.200 alt-db-1
192.168.242.201 alt-db-2
192.168.242.202 alt-voter
192.168.242.203 alt-nfs-1
192.168.242.204 alt-nfs-2
::1     localhost6.localdomain localhost6

Выполнить рекомендации по использованию огромных страниц#

https://postgrespro.ru/docs/postgresql/13/kernel-resources%23LINUX-HUGE-PAGES

Для узлов в виде виртуальных машин#

Необходимо изменить значение в /sys/block/sda(b,c)/queue/rotational с текущего 1 на 0, чтобы ОС определяла диск как ssd

Для проверки значения rotational для дисков в ОС необходимо выполнить команду:

lsblk -d -o name,rota

Примерный вывод должен быть таким:

NAME ROTA
sda 0
sdb 0
...

Если параметр будет равен 1 для дисковых устройств, то необходимо изменить его на 0. Для этого необходимо выполнить следующие действия

  1. Создать файл 60-ssd.rules

    touch /etc/udev/rules.d/60-ssd.rules
    

    с содержимым

    ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}="0"
    
  2. Проверить корректность и срабатывание правила командой (указан пример для диска sda):

    udevadm test -a add $(udevadm info -q path -n /dev/sda)
    
  3. Убедиться, что значение rotational =0 командой:

    lsblk -d -o name,rota
    

Установка и настройка PostgreSQL#

Установка PostgreSQL#

Установить PostgreSQL v16 на alt-db-1 и alt-db-2:

sudo apt-get install postgresql16-server postgresql16-contrib

Далее инициализировать базу данных. Для этого на alt-db-1 выполнить команду от имени системного пользователя postgres:

sudo -u postgres initdb -D /var/lib/pgsql/data/ --lc-ctype=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --auth-host=scram-sha-256 --data-checksums

Примечание

/var/lib/pgsql/data/ - директория базы данных, может быть изменена при необходимости.

Настройка PostgreSQL#

Настройка СУБД на alt-db-1#

Отредактировать файл конфигурации postgresql.conf#

Примечание

Файл находиться по пути /var/lib/pgsql/data/postgresql.conf

Рекомендуемое содержимое конфигурационного файла postgresql.conf для конфигурации оборудования (CPU 64 core, RAM 512 GB) приведено ниже:

# - Connection Settings –
listen_addresses = '*'
port = 5432
max_connections = 1000
# - Memory –
shared_buffers = 64GB
max_prepared_transactions = 3000
temp_buffers = 32MB
work_mem = 128MB
maintenance_work_mem = 50GB
# - Asynchronous Behavior -
effective_io_concurrency = 2
# - Background Writer -
bgwriter_delay = 20ms
bgwriter_lru_multiplier = 4.0
bgwriter_lru_maxpages = 400
# WRITE AHEAD LOG
wal_level = replica
fsync = on
synchronous_commit = on
wal_compression = on
wal_log_hints = on
# - Checkpoints –
checkpoint_timeout = 1800
checkpoint_completion_target = 0.9
# - Archiving –
archive_mode = always
archive_command = 'pg_probackup-16 archive-push -B /bkp-local/backup --instance global --compress --wal-file-path %p --wal-file-name %f'
# REPLICATION
max_wal_senders = 15
wal_keep_size = 20GB
max_wal_size = 20GB
min_wal_size = 5GB
max_replication_slots = 8
hot_standby = on
hot_standby_feedback = on
tcp_keepalives_idle = 60
tcp_keepalives_interval = 5
tcp_keepalives_count = 5
track_commit_timestamp = on
# QUERY TUNING
effective_cache_size = 512GB
# ERROR REPORTING AND LOGGING
logging_collector = on
log_min_duration_statement = 0
# AUTOVACUUM PARAMETERS
autovacuum = on
log_autovacuum_min_duration = 0
autovacuum_max_workers = 32
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.001
autovacuum_vacuum_cost_delay = 10
autovacuum_vacuum_cost_limit = 1000
# LOCK MANAGEMENT
max_locks_per_transaction = 150
# ERROR HANDLING
restart_after_crash = off
# CUSTOMIZED OPTIONS
pg_stat_statements.max=10000
pg_stat_statements.track = all

Примечание

Указанные выше параметры могут быть изменены при использовании другого оборудования.

Отредактировать файл конфигурации доступов pg_hba.conf#

Примечание

Файл находиться по пути /var/lib/pgsql/data/pg_hba.conf

local   backupdb    backup                                  scram-sha-256
local   replication backup                                  scram-sha-256
host    template1   postgres        X.X.X.0/24              scram-sha-256
host    all         rewind_user     X.X.X.0/24              scram-sha-256
host    replication repl            X.X.X.0/24              scram-sha-256
host    replication backup          X.X.X.0/24              scram-sha-256
host    backupdb    backup          127.0.0.1/32            scram-sha-256
host    backupdb    backup          X.X.X.0/24              scram-sha-256
Запустить сервер PostgreSQL#
sudo -u postgres pg_ctl -D /var/lib/pgsql/data/ start

После запуска рекомендуется проверить отсутствие ошибок в лог-файле postgresql.log.

Проверить запуск СУБД можно командой:

ps auwx | grep postgres
Создать пользователей#

Подключаемся к БД

sudo -u postgres psql

Выполняем следующие команды

CREATE ROLE repl WITH LOGIN REPLICATION PASSWORD 'password';
CREATE ROLE backup WITH LOGIN REPLICATION PASSWORD 'password';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
CREATE USER rewind_user LOGIN PASSWORD 'password';
GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO rewind_user;

Из соображений безопасности для создания бекапов рекомендуется создать и использовать отдельную базу данных backupdb.

Необходимо создать БД backupdb:

CREATE DATABASE backupdb OWNER backup;

Изменить при необходимости пароль postgres:

ALTER USER postgres PASSWORD 'password';
Проинициализировать файл паролей#

В домашнем каталоге пользователя postgres (по умолчанию /var/lib/pgsql), выполнив команду на 2х узлах с СУБД:

echo 'VIP-master:5432:replication:repl:pass-for-repl' >> /var/lib/pgsql/.pgpass
echo '*:5432:backupdb:backup:pass-for-backup' >> /var/lib/pgsql/.pgpass
echo '*:5432:*:rewind_user:pass-for-rewind' >> /var/lib/pgsql/.pgpass
echo '*:5432:template1:postgres:pass-for-postgres' >> /var/lib/pgsql/.pgpass
chmod 600 /var/lib/pgsql/.pgpass
chown postgres:postgres /var/lib/pgsql/.pgpass

Установка и настройка pg_probackup#

Установка pg_probackup на alt-db-1 и alt-db-2

Установить pg_probackup на узлах с СУБД (alt-db-1 и alt-db-2):

wget https://repo.postgrespro.ru/pg_probackup/rpm/latest/altlinux-p10/x86_64/RPMS.vanilla/pg_probackup-16-2.5.15-2.ac92457c2d1cfe43fced5b1167b5c90ecdc24cbe.x86_64.rpm

sudo rpm -i pg_probackup-16-2.5.15-2.ac92457c2d1cfe43fced5b1167b5c90ecdc24cbe.x86_64.rpm

Инициализация pg_probackup на alt-db-1

sudo -u postgres pg_probackup-16 init -B /bkp-local/backup
sudo -u postgres pg_probackup-16 add-instance -B /bkp-local/backup -D /var/lib/pgsql/data/ --instance global
sudo -u postgres pg_probackup-16 set-config -B /bkp-local/backup --instance global --log-filename=pg_probackup-global-%d.log

Проверка успешности инициализации pg_probackup

sudo -u postgres pg_probackup-16 backup -B /bkp-local/backup --instance global -b FULL -U backup –d backupdb --compress --stream -j 6
sudo -u postgres pg_probackup-16 show -B /bkp-local/backup --instance global

Инициализация pg_probackup на alt-db-2

sudo -u postgres pg_probackup-16 init -B /bkp-local/backup
sudo -u postgres pg_probackup-16 add-instance -B /bkp-local/backup -D /var/lib/pgsql/data/ --instance global
sudo -u postgres pg_probackup-16 set-config -B /bkp-local/backup --instance global --log-filename=pg_probackup-global-%d.log

Создание копии БД на alt-db-2#

С использованием утилиты pg_basebackup.

Выполнить команду:

sudo -u postgres pg_basebackup -D /var/lib/pgsql/data/ -h alt-db-1 -U repl -X stream -c fast

Восстановить из резервной копии с помощью pg_probackup.

Перед восстановлением необходимо узнать идентификатор полного бэкапа (backup_id):

sudo -u postgres pg_probackup-16 show -B /bkp-rmt/backup --instance global

Выполняем восстановление:

sudo -u postgres pg_probackup-16 restore -B /bkp-rmt/backup --instance global -i backup_id

Скопировать с помощью pg_probackup+catchup.

Выполнить команду (потребуется ввести пароль пользователя postgres):

sudo -u postgres pg_probackup-16 catchup 
--source-pgdata /var/lib/pgsql/data/ \
--destination-pgdata /var/lib/pgsql/data/ \
-p 5432 -d backupdb -U backup \
--stream \
--backup-mode=FULL \
--remote-host=hostname1 \
--remote-user=postgres \
--remote-path=/usr/bin/ \
-j 6

Установка и настройка pgbouncer#

Установка#

Выполнить на узлах alt-db-1 и alt-db-2:

sudo apt-get install pgbouncer

Настройка#

Необходимо повысить лимиты для сервиса pgbouncer.

sudo systemctl edit pgbouncer

Дописать в начало файла

[Service]
LimitNOFILE=10240

Примечание

10240 – максимальное число открытых файлов (при необходимости можно изменить)

Перечитать конфигурацию systemd:

sudo systemctl daemon-reload

Изменить конфигурационный файл /etc/pgbouncer/pgbouncer.ini в соответствии с требуемыми настройками pgbouncer.

[databases]
* = host=localhost port=5432 auth_user=postgres
[pgbouncer]
listen_addr = *
listen_port = 6432

Установка и настройка кластерного ПО#

Установка#

Выполнить команду

sudo apt-get install pcs corosync pacemaker sbd

Добавить в файл /etc/bashrc.d/ruby.sh если он пуст:

export PATH=$PATH:/var/cache/ruby/gemie/bin:/usr/lib/ruby/bin
export GEM_VENDOR=/var/cache/ruby/gemie
export GEM_HOME=/var/cache/ruby/gemie
export GEM_PATH=/var/cache/ruby/gemie:/usr/lib/ruby/gemie:/usr/lib64/ruby/gemie:/usr/lib/ruby/gems/2.7.0/:/usr/lib/ruby/gems/2.5.0/

Настройка watchdog в кластере#

Примечание

Рекомендуется с помощью среды виртуализации эмулировать аппаратный watchdog i6300esb для виртуальных машин кластера СУБД. Если нет возможности эмулировать аппаратный watchdog, то необходимо использовать программный - softdog.

Внимание

Одновременно использовать и аппаратный и программный watchdog нельзя!

Использование аппаратного watchdog#

Создать на всех узлах файл /etc/rc.d/rc.local с содержимым:

#!/bin/sh
/sbin/modprobe i6300esb

Сделать файл /etc/rc.d/rc.local исполняемым:

chmod +x /etc/rc.d/rc.local

Затем перезагрузить все узлы и проверить загрузку модуля ядра i6300esb командой:

lsmod | grep i6300esb

Проверить на всех узлах, что в ОС появилось устройство /dev/watchdog:

ls /dev/watchdog

Использование программного watchdog#

Создать на всех узлах файл /etc/rc.d/rc.local с содержимым:

#!/bin/sh
/sbin/modprobe softdog

Сделать файл /etc/rc.d/rc.local исполняемым:

chmod +x /etc/rc.d/rc.local

Затем перезагрузить все узлы и проверить загрузку модуля ядра softdog командой:

lsmod | grep softdog

Проверить на всех узлах, что в ОС появилось устройство /dev/watchdog:

ls /dev/watchdog

Настройка основных ресурсов#

Подготовка ОС к использованию кластерного ПО#

На всех узлах кластера включить автозапуск сервиса pcsd

sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service

На всех узлах кластера выключить автозапуск сервиса postgresql (для узлов с СУБД), corosync и pacemaker (для всех узлов):

sudo systemctl disable postgresql
sudo systemctl disable corosync.service pacemaker.service

На всех узлах кластера задать пароль пользователя hacluster:

sudo passwd hacluster

Конфигурация кластера#

Примечание

Далее все команды выполняются на 1 узле, к примеру alt-voter

Выполнить команду авторизации узлов в кластере:

sudo pcs host auth -u hacluster alt-db-1 alt-db-2 alt-voter

Выполнить предварительную настройку кластера.

sudo pcs cluster setup global-cluster alt-db-1 alt-db-2 alt-voter

Запустить кластер:

sudo pcs cluster start --all --wait=60

Создать конфигурационный файл кластера:

sudo pcs cluster cib cluster.cfg

Изменить свойства кластера:

sudo pcs -f cluster.cfg resource defaults update resource-stickiness="1000"
sudo pcs -f cluster.cfg resource defaults update migration-threshold="3"

Создать ресурсы виртуальных IP:

sudo pcs -f cluster.cfg resource create vip-master ocf:heartbeat:IPaddr2 cidr_netmask=24 ip=<VIP-master>
sudo pcs -f cluster.cfg resource create vip-pgbouncer ocf:heartbeat:IPaddr2 cidr_netmask=24 ip=<VIP-pgbouncer>

Создать ресурс pgbouncer:

sudo pcs -f cluster.cfg resource create pgbouncer systemd:pgbouncer

Создать ресурс pgsql:

sudo pcs -f cluster.cfg resource create pgsql \
ocf:heartbeat:pgsql \
master_ip=<VIP-master> \
node_list="alt-db-1 alt-db-2" \
rep_mode=sync \
primary_conninfo_opt="keepalives_idle=60 keepalives_interval=5 keepalives_count=5" \
repuser=repl \
restore_command='pg_probackup-16 archive-get -B /bkp-rmt/backup --instance global --wal-file-path=%p --wal-file-name=%f'

Указать ресурсу pgsql параметры клонирования и промоута:

sudo pcs -f cluster.cfg resource promotable pgsql promoted-max=1 promoted-node-max=1 clone-max=2 notify=true clone-node-max=1

Запретить ресурсам стартовать на голосующем узле:

sudo pcs -f cluster.cfg constraint location pgsql-clone avoids alt-voter
sudo pcs -f cluster.cfg constraint location vip-master avoids alt-voter
sudo pcs -f cluster.cfg constraint location pgbouncer avoids alt-voter
sudo pcs -f cluster.cfg constraint location vip-pgbouncer avoids alt-voter

Указать совместное расположение ресурсов pgsql, pgbouncer, vip-pgbouncer и vip-master:

sudo pcs -f cluster.cfg constraint colocation add vip-master with master pgsql-clone INFINITY
sudo pcs -f cluster.cfg constraint colocation add vip-pgbouncer with master pgsql-clone INFINITY
sudo pcs -f cluster.cfg constraint colocation add pgbouncer with master pgsql-clone INFINITY

Определить порядок запуска ресурсов

sudo pcs -f cluster.cfg constraint order promote pgsql-clone then vip-master score=INFINITY symmetrical=false
sudo pcs -f cluster.cfg constraint order demote pgsql-clone then stop vip-master score=0 symmetrical=false
sudo pcs -f cluster.cfg constraint order promote pgsql-clone then vip-pgbouncer score=INFINITY symmetrical=false
sudo pcs -f cluster.cfg constraint order demote pgsql-clone then stop vip-pgbouncer score=0 symmetrical=false

Загрузить конфигурационный файл ресурсов в кластер

sudo pcs cluster cib-push cluster.cfg

Настройка фенсинга в кластере СУБД#

Для настройки фенсинга в кластере необходимо выполнить последовательность команд:

sudo pcs stonith sbd enable SBD_STARTMODE=clean

Далее потребуется рестарт кластера:

sudo pcs cluster stop --all
sudo pcs cluster start --all --wait=60

Далее выполнить команды:

sudo pcs property set stonith-timeout="12s"
sudo pcs property set stonith-watchdog-timeout="6s"
sudo pcs property set cluster-recheck-interval="1m"
sudo pcs property set fence-reaction="panic"
sudo pcs property set no-quorum-policy=suicide

Проверка кластера#

Для проверки состояния кластера

sudo crm_mon -Afr

Примерный вывод должен быть таким:

Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: alt-voter (version 2.1.9-alt1-2.1.9) - partition with quorum
  * Last updated: Tue Aug 12 10:38:15 2025 on alt-voter
  * Last change:  Tue Aug 12 10:38:13 2025 by root via root on alt-db-2
  * 3 nodes configured
  * 5 resource instances configured

Node List:
  * Online: [ alt-db-1 alt-db-2 alt-voter ]

Full List of Resources:
  * vip-master  (ocf:heartbeat:IPaddr2):         Started alt-db-1
  * vip-pgbouncer       (ocf:heartbeat:IPaddr2):         Started alt-db-1
  * pgbouncer   (systemd:pgbouncer):     Started alt-db-1
  * Clone Set: pgsql-clone [pgsql] (promotable):
    * Promoted: [ alt-db-1 ]
    * Unpromoted: [ alt-db-2 ]

Node Attributes:
  * Node: alt-db-1:
    * master-pgsql                      : 1000
    * pgsql-data-status                 : LATEST
    * pgsql-master-baseline             : 00000000101B4E08
    * pgsql-status                      : PRI

  * Node: alt-db-2:
    * master-pgsql                      : 100
    * pgsql-data-status                 : STREAMING|SYNC
    * pgsql-status                      : HS:sync

Migration Summary:

Если у вас статус одной из нод HS:alone и disconected, то проверьте содержимое файла /var/lib/pgsql/tmp/recovery.conf на всех нода с СУБД.

Пример содержания на alt-db-1:

primary_conninfo = 'host=192.168.242.205 port=5432 user=repl application_name=alt-db-1 keepalives_idle=60 keepalives_interval=5 keepalives_count=5'
restore_command = 'pg_probackup-16 archive-get -B /bkp-rmt/backup --instance global --wal-file-path=%p --wal-file-name=%f'
recovery_target_timeline = 'latest'

Если не хватает данных, то допишите их.

Дополнительная информация#

Создание резервных копий виртуальных машин кластера#

После успешного запуска кластера необходимо создать резервные копии виртуальных машин кластера в виде образов ВМ на случай катастрофы ДЦ1 или ДЦ2.

  1. Для выполнения данной задачи необходимо сначала остановить кластер:

    sudo pcs cluster stop --all
    
  2. Остановить виртуальные машины кластера.

  3. Выполнить на всех гипервизорах кластера резервное копирование виртуальных машин без хранилищ с БД.

  4. Сохранить образы виртуальных машин на всех NFS-серверах.

  5. Запустить виртуальные машины кластера.

  6. Удалить файл блокировки на мастере:

    sudo rm /var/lib/pgsql/tmp/PGSQL.lock
    
  7. Запустить кластер командой:

    sudo pcs cluster start --all
    
  8. В консоли любого узла проконтролировать состояние кластера командой crm_mon:

    sudo crm_mon -Afr
    

Изменение каких-либо параметров ресурса кластера#

При необходимости можно изменить или добавить необходимые параметры ресурса кластера. Например, при необходимости изменить параметр restore_command ресурса pgsql выполнить следующие шаги и команды.

  1. Деактивировать ресурс pgsql:

    sudo pcs resource disable pgsql
    
  2. Выполнить команду обновления нужного параметра, например, restore_command:

    sudo pcs resource update pgsql restore_command='новая команда'
    
  3. Удалить файл блокировки на мастере:

    sudo rm /var/lib/pgsql/tmp/PGSQL.lock
    
  4. Активировать ресурс pgsql:

    sudo pcs resource enable pgsql
    
  5. Убедиться с помощью монитора кластера, что в кластере появился мастер и реплика

    sudo crm_mon -Afr
    

Удаление (разбор) кластера#

Внимание

Внимание. Кластер будет разобран, сервис СУБД будет недоступен.

Для удаления кластерной конфигурации необходимо выполнить следующие шаги.

  1. Остановить кластер:

    sudo pcs cluster stop --all
    
  2. Затем удалить кластер:

    sudo pcs cluster destroy --all
    

Статусы ресурсов кластера#

В различных состояниях кластера ресурсы могут иметь разные статусы.

  • Ресурс pgsql

    • Unpromoted – статус указывает на работу данного узла в режиме реплики.

    • Promoted – статус указывает на работу данного узла в режиме мастера.

    • Disabled – статус указывает на заблокированное (неактивное) состояние ресурса.

    • Stopped – ресурс остановлен.

Также состояние ресурса pgsql указано по каждому узлу более подробно в секции Node Attributes:

  • master-pgsql

    • 1000 – score соответствует состоянию мастера

    • 100 – score соответствует синхронной реплике

    • -INFINITY – score соответствует асинхронной реплике или реплике без мастера Примечание. Значение -INFINITY («минус бесконечность») у асинхронной реплики не дает кластеру в случае сбоя на мастере переключиться на асинхронную реплику.

  • pgsql-status

    • PRI – соответствует состоянию мастера

    • HS:sync – соответствует синхронной реплике

    • HS:async – соответствует асинхронной реплике

    • HS:alone – соответствует режиму реплики без подключения к мастеру

  • pgsql-data-status

    • LATEST – соответствует состоянию мастера

    • STREAMING|SYNC – соответствует синхронной реплике

    • STREAMING|ASYNC – соответствует синхронной реплике

    • DISCONNECT – реплика не подключена к мастеру или остановлен postgres на узле

  • vip-master vip-pgbouncer pgbouncer

    • Started – ресурс запущен

    • Stoped – ресурс остановлен

Вспомогательные команды для кластера#

Некоторые вспомогательные команды для кластера, которые помогут при разборе инцидентов:

  • Очистка счетчика сбоев для ресурса pgsql-clone на узле hostname1:

    sudo pcs resource cleanup pgsql node=hostname1
    
  • Деактивация ресурса pgsql:

    sudo pcs resource disable pgsql
    
  • Активация ресурса pgsql:

    sudo pcs resource enable pgsql
    
  • Остановка ресурса pgsql:

    sudo pcs resource stop pgsql
    
  • Запуск ресурса pgsql:

    sudo pcs resource start pgsql
    
  • Остановка кластера на текущем узле:

    sudo pcs cluster stop
    
  • Посмотреть конфигурацию кластера:

    sudo pcs config show
    
  • Посмотреть веса (очки score) ресурсов:

    sudo pcs resource scores
    
  • Посмотреть состояние кворума:

    sudo corosync-quorumtool -s