Перейти к основному содержанию
`Ctrl`+`K`

# Инструкция по установке и настройке кластера СУБД 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