# Инструкция по установке и настройке КУК Postgresql ## 1. Подготовка ОС ### 1.1. Требования для установки КУК - Установлена ОС 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` ```bash 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` ```bash 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 ``` ### 1.2 Подготовка ОС #### Создать файл `/etc/security/limits.d/99-pg.conf` с содержимым (настройки приведены для случая max_connections=500) ```bash postgres softnproc 16384 postgres hardnproc 16384 postgres softnofile 65536 postgres hardnofile 65536 postgres softstack 10240 postgres hardstack 32768 ``` #### Создать файл `/etc/sysctl.d/99-pg.conf` с содержимым ```bash 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 ``` Применить настройки командой ```bash sysctl -p /etc/sysctl.d/99-pg.conf ``` ```{note} Примечание. Приведенные настройки могут быть изменены в зависимости от нагрузки и количества подключений к СУБД. ``` #### Заполнить файл `hosts` Дополните файл `hosts` на каждом узле, пример содержания приведен ниже ```text 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 ``` #### Выполнить рекомендации по использованию огромных страниц #### Для узлов в виде виртуальных машин Необходимо изменить значение в /sys/block/sda(b,c)/queue/rotational с текущего 1 на 0, чтобы ОС определяла диск как ssd Для проверки значения rotational для дисков в ОС необходимо выполнить команду: ```bash lsblk -d -o name,rota ``` Примерный вывод должен быть таким: ```bash NAME ROTA sda 0 sdb 0 ... ``` Если параметр будет равен 1 для дисковых устройств, то необходимо изменить его на 0. Для этого необходимо выполнить следующие действия 1) Создать файл 60-ssd.rules ```bash touch /etc/udev/rules.d/60-ssd.rules ``` с содержимым ```bash ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}="0" ``` 2) Проверить корректность и срабатывание правила командой (указан пример для диска sda): ```bash udevadm test -a add $(udevadm info -q path -n /dev/sda) ``` 3) Убедиться, что значение rotational =0 командой: ```bash lsblk -d -o name,rota ``` ## 2. Установка и настройка PostgreSQL ### 2.1 Установка PostgreSQL Установить PostgreSQL v16 на `alt-db-1` и `alt-db-2`: ```bash sudo apt-get install postgresql16-server postgresql16-contrib ``` Далее инициализировать базу данных. Для этого на `alt-db-1` выполнить команду от имени системного пользователя `postgres`: ```bash 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 ``` ```{note} /var/lib/pgsql/data/ - директория базы данных, может быть изменена при необходимости. ``` ### 2.2 Настройка PostgreSQL #### Начальная настройка СУБД на `alt-db-1` ##### Отредактировать файл конфигурации `postgresql.conf` ```{note} Файл находиться по пути /var/lib/pgsql/data/postgresql.conf ``` Рекомендуемое содержимое конфигурационного файла postgresql.conf для конфигурации оборудования (CPU 64 core, RAM 512 GB) приведено ниже: ```text # - 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 ``` ```{note} Указанные выше параметры могут быть изменены при использовании другого оборудования. ``` ##### Отредактировать файл конфигурации доступов `pg_hba.conf` ```{note} Файл находиться по пути /var/lib/pgsql/data/pg_hba.conf ``` ```text 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 ```bash sudo -u postgres pg_ctl -D /var/lib/pgsql/data/ start ``` После запуска рекомендуется проверить отсутствие ошибок в лог-файле postgresql.log. Проверить запуск СУБД можно командой: ```bash ps auwx | grep postgres ``` ##### Создание пользователей Подключаемся к БД ```bash sudo -u postgres psql ``` Выполняем следующие команды ```sql 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`: ```sql CREATE DATABASE backupdb OWNER backup; ``` Изменить при необходимости пароль `postgres`: ```sql ALTER USER postgres PASSWORD 'password'; ``` ##### Проинициализировать файл паролей В домашнем каталоге пользователя `postgres` (по умолчанию /var/lib/pgsql), выполнив команду на 2х узлах с СУБД: ```bash 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 ``` ### 2.3 Установка и настройка `pg_probackup` #### Установка `pg_probackup` на `alt-db-1` и `alt-db-2` Установить `pg_probackup` на узлах с СУБД (`alt-db-1` и `alt-db-2`): ```bash 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` ```bash 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` ```bash 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` ```bash 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 ``` ### 2.4 Создание копии БД на `alt-db-2` #### Вариант 1 – с использованием утилиты pg_basebackup Выполнить команду: ```bash sudo -u postgres pg_basebackup -D /var/lib/pgsql/data/ -h alt-db-1 -U repl -X stream -c fast ``` #### Вариант 2 – восстановить из резервной копии с помощью pg_probackup Перед восстановлением необходимо узнать идентификатор полного бэкапа (`backup_id`): ```bash sudo -u postgres pg_probackup-16 show -B /bkp-rmt/backup --instance global ``` Выполняем восстановление: ```bash sudo -u postgres pg_probackup-16 restore -B /bkp-rmt/backup --instance global -i backup_id ``` #### Вариант 3 – скопировать с помощью pg_probackup+catchup Выполнить команду (потребуется ввести пароль пользователя postgres): ```bash 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 ``` ### 2.5 Установка и настройка `pgbouncer` #### Установка `pgbouncer` Выполнить на узлах `alt-db-1` и `alt-db-2`: ```bash sudo apt-get install pgbouncer ``` #### Настройка `pgbouncer` Необходимо повысить лимиты для сервиса pgbouncer. ```bash sudo systemctl edit pgbouncer ``` Дописать в начало файла ```text [Service] LimitNOFILE=10240 ``` ```{note} 10240 – максимальное число открытых файлов (при необходимости можно изменить) ``` Перечитать конфигурацию systemd: ```bash sudo systemctl daemon-reload ``` Изменить конфигурационный файл `/etc/pgbouncer/pgbouncer.ini` в соответствии с требуемыми настройками `pgbouncer`. ```text [databases] * = host=localhost port=5432 auth_user=postgres [pgbouncer] listen_addr = * listen_port = 6432 ``` ## 3. Установка и настройка кластерного ПО ### 3.1 Установка кластерного ПО Выполнить команду ```bash sudo apt-get install pcs corosync pacemaker sbd ``` Добавить в файл `/etc/bashrc.d/ruby.sh` если он пуст: ```bash 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/ ``` ### 3.2 Настройка watchdog в кластере ```{note} Рекомендуется с помощью среды виртуализации эмулировать аппаратный watchdog i6300esb для виртуальных машин КУК. Если нет возможности эмулировать аппаратный watchdog, то необходимо использовать программный - softdog. ``` ```{attention} Одновременно использовать и аппаратный и программный watchdog нельзя! ``` #### Использование аппаратного watchdog Создать на всех узлах файл `/etc/rc.d/rc.local` с содержимым: ```bash #!/bin/sh /sbin/modprobe i6300esb ``` Сделать файл `/etc/rc.d/rc.local` исполняемым: ```bash chmod +x /etc/rc.d/rc.local ``` Затем перезагрузить все узлы и проверить загрузку модуля ядра `i6300esb` командой: ```bash lsmod | grep i6300esb ``` Проверить на всех узлах, что в ОС появилось устройство `/dev/watchdog`: ```bash ls /dev/watchdog ``` #### Использование программного watchdog Создать на всех узлах файл `/etc/rc.d/rc.local` с содержимым: ```bash #!/bin/sh /sbin/modprobe softdog ``` Сделать файл `/etc/rc.d/rc.local` исполняемым: ```bash chmod +x /etc/rc.d/rc.local ``` Затем перезагрузить все узлы и проверить загрузку модуля ядра `softdog` командой: ```bash lsmod | grep softdog ``` Проверить на всех узлах, что в ОС появилось устройство `/dev/watchdog`: ```bash ls /dev/watchdog ``` ### 3.3 Настройка основных ресурсов #### Подготовка ОС к использованию кластерного ПО На всех узлах кластера включить автозапуск сервиса `pcsd` ```bash sudo systemctl enable pcsd.service sudo systemctl start pcsd.service ``` На всех узлах кластера выключить автозапуск сервиса `postgresql` (для узлов с СУБД), `corosync` и `pacemaker` (для всех узлов): ```bash sudo systemctl disable postgresql sudo systemctl disable corosync.service pacemaker.service ``` На всех узлах кластера задать пароль пользователя hacluster: ```bash sudo passwd hacluster ``` #### Конфигурация кластера ```{note} Далее все команды выполняются на 1 узле, к примеру alt-voter ``` Выполнить команду авторизации узлов в кластере: ```bash sudo pcs host auth -u hacluster alt-db-1 alt-db-2 alt-voter ``` Выполнить предварительную настройку кластера. ```bash sudo pcs cluster setup global-cluster alt-db-1 alt-db-2 alt-voter ``` Запустить кластер: ```bash sudo pcs cluster start --all --wait=60 ``` Создать конфигурационный файл кластера: ```bash sudo pcs cluster cib cluster.cfg ``` Изменить свойства кластера: ```bash sudo pcs -f cluster.cfg resource defaults update resource-stickiness="1000" sudo pcs -f cluster.cfg resource defaults update migration-threshold="3" ``` Создать ресурсы виртуальных IP: ```bash sudo pcs -f cluster.cfg resource create vip-master ocf:heartbeat:IPaddr2 cidr_netmask=24 ip= sudo pcs -f cluster.cfg resource create vip-pgbouncer ocf:heartbeat:IPaddr2 cidr_netmask=24 ip= ``` Создать ресурс pgbouncer: ```bash sudo pcs -f cluster.cfg resource create pgbouncer systemd:pgbouncer ``` Создать ресурс pgsql: ```bash sudo pcs -f cluster.cfg resource create pgsql \ ocf:heartbeat:pgsql \ master_ip= \ 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 параметры клонирования и промоута: ```bash sudo pcs -f cluster.cfg resource promotable pgsql promoted-max=1 promoted-node-max=1 clone-max=2 notify=true clone-node-max=1 ``` Запретить ресурсам стартовать на голосующем узле: ```bash 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: ```bash 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 ``` Определить порядок запуска ресурсов ```bash 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 ``` Загрузить конфигурационный файл ресурсов в кластер ```bash sudo pcs cluster cib-push cluster.cfg ``` #### Настройка фенсинга в КУК Для настройки фенсинга в кластере необходимо выполнить последовательность команд: ```bash sudo pcs stonith sbd enable SBD_STARTMODE=clean ``` Далее потребуется рестарт кластера: ```bash sudo pcs cluster stop --all sudo pcs cluster start --all --wait=60 ``` Далее выполнить команды: ```bash 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 ``` ## 4. Проверка кластера Для проверки состояния кластера ```bash sudo crm_mon -Afr ``` Примерный вывод должен быть таким: ```text 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`: ```text 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' ``` Если не хватает данных, то допишите их. ## 5. Дополнительная информация ### Создание резервных копий виртуальных машин кластера После успешного запуска кластера необходимо создать резервные копии виртуальных машин кластера в виде образов ВМ на случай катастрофы ДЦ1 или ДЦ2. 1. Для выполнения данной задачи необходимо сначала остановить кластер: ```bash sudo pcs cluster stop --all ``` 2. Остановить виртуальные машины кластера. 3. Выполнить на всех гипервизорах кластера резервное копирование виртуальных машин без хранилищ с БД. 4. Сохранить образы виртуальных машин на всех NFS-серверах. 5. Запустить виртуальные машины кластера. 6. Удалить файл блокировки на мастере: ```bash sudo rm /var/lib/pgsql/tmp/PGSQL.lock ``` 7. Запустить кластер командой: ```bash sudo pcs cluster start --all ``` 8. В консоли любого узла проконтролировать состояние кластера командой crm_mon: ```bash sudo crm_mon -Afr ``` ### Изменение каких-либо параметров ресурса кластера При необходимости можно изменить или добавить необходимые параметры ресурса кластера. Например, при необходимости изменить параметр `restore_command` ресурса `pgsql` выполнить следующие шаги и команды. 1. Деактивировать ресурс `pgsql`: ```bash sudo pcs resource disable pgsql ``` 2. Выполнить команду обновления нужного параметра, например, `restore_command`: ```bash sudo pcs resource update pgsql restore_command='новая команда' ``` 3. Удалить файл блокировки на мастере: ```bash sudo rm /var/lib/pgsql/tmp/PGSQL.lock ``` 4. Активировать ресурс `pgsql`: ```bash sudo pcs resource enable pgsql ``` 5. Убедиться с помощью монитора кластера, что в кластере появился мастер и реплика ```bash sudo crm_mon -Afr ``` ### Удаление (разбор) кластера ```{attention} Внимание. Кластер будет разобран, сервис СУБД будет недоступен. ``` Для удаления кластерной конфигурации необходимо выполнить следующие шаги. 1. Остановить кластер: ```bash sudo pcs cluster stop --all ``` 2. Затем удалить кластер: ```bash 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: ```bash sudo pcs resource cleanup pgsql node=hostname1 ``` - Деактивация ресурса pgsql: ```bash sudo pcs resource disable pgsql ``` - Активация ресурса pgsql: ```bash sudo pcs resource enable pgsql ``` - Остановка ресурса pgsql: ```bash sudo pcs resource stop pgsql ``` - Запуск ресурса pgsql: ```bash sudo pcs resource start pgsql ``` - Остановка кластера на текущем узле: ```bash sudo pcs cluster stop ``` - Посмотреть конфигурацию кластера: ```bash sudo pcs config show ``` - Посмотреть веса (очки score) ресурсов: ```bash sudo pcs resource scores ``` - Посмотреть состояние кворума: ```bash sudo corosync-quorumtool -s ```