Перейти к основному содержимому

Уровень 3.0

Предусловия:

  • Изучена лекция 10 «Обеспечение высокой доступности»

Кластер включает в себя следующие узлы:

  • Master
  • Replica
  • Arbiter

На узлах Master и Replica, помимо экземпляров Pangolin, также развернуто приложение Pangolin Manager и распределенное хранилище (DCS) etcd.

На узле Arbiter развернуто только распределенное хранилище.

Вспомним, что Pangolin Manager используется в роли агента на каждом узле для управление экземпляром Pangolin. Управление кластером выполняется путем взаимодействия компонентов Pangolin Manager посредством хранилища etcd, а также напрямую.

Узел Arbiter потребовался для протокола консенсуса RAFT, используемого в etcd. Протокол RAFT основан на определении кворума (большинства), поэтому в кластере должно быть минимум три узла с etcd.

Все действия в этой лабораторной работе выполняются на виртуальной машине Master

Анализ работы кластера Pangolin​

  1. Подключитесь к виртуальной машине через webssh, указав IP-адрес Master.

  2. В терминале запустите оболочку от имени пользователя postgres:

    [student@ServerName ~]$ sudo -iu postgres
  3. Перейдите в каталог с конфигурацией pangolin-manager:

    [postgres@ServerName ~]$ cd /etc/pangolin-manager/
  4. Посмотрите первые 30 строк файла конфигурации:

    [postgres@ServerName pangolin-manager]$ head -n 30 postgres.yml
    restapi:
    listen: 0.0.0.0:8008
    connect_address: 172.29.53.69:8008
    allowlist: []
    allowlist_include_members: true
    authentication:
    username: patroniyml
    password: dev_api_pastroni_pass!
    etcd3:
    hosts: 172.29.53.69:2379,172.29.53.148:2379
    username: patronietcd
    password: patronipass12345

    audit:
    enabled: true
    directory: /pgerrorlogs/06/audit
    filename: pangolin-manager
    rotation_age: 1d
    rotation_size: 10M

    log:
    dir: /pgerrorlogs/06/pangolin-manager
    file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log

    destination: file
    file_mode: 600
    redirect_min_size: 10

    Локальная конфигурация Pangolin Manager хранятся в файле postgres.yml. Глобальная динамическая конфигурация кластера хранится в распределенном хранилище etcd.

    Настройки сгруппированы по секциям.

    В том числе имеются настройки подключения к REST API (сeкция restapi).

    Pangolin Manager предоставляет программный интерфейс REST API для управления и мониторинга кластером. Указанный интерфейс сам использует Pangolin Manager, а также может использоваться внешними средствами, например HAProxy или администратором кластера.

    Также есть настройки для подключения к распределенному хранилищу etcd (секция etcd3).

  5. Посмотрите содержимое секции bootstrap файла конфигурации:

    [postgres@ServerName pangolin-manager]$ grep -A 27 bootstrap postgres.yml
    bootstrap:
    dcs:
    ttl: 135
    retry_timeout: 60
    loop_wait: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: true
    synchronous_mode_strict: false
    postgresql:
    parameters:
    max_connections: '110'
    max_worker_processes: '32'
    max_prepared_transactions: '3'
    wal_level: replica
    wal_log_hints: on
    track_commit_timestamp: off
    wal_keep_size: 8GB
    max_wal_senders: '10'
    max_replication_slots: '10'
    logical_decoding_work_mem: 64MB
    auth_activity_period: '60'
    authentication_max_workers: '16'
    use_pg_rewind: true
    use_slots: true
    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: en_US.UTF-8

    Секция bootstrap содержит настройки, которые применяются при инициализации кластера, то есть значения параметров в этой секции применяются один раз.

    В подсекции dcs указываются общие настройки для узлов кластера, которые сохраняются в распределенном хранилище.

    Здесь и общие значения для параметров экземпляров Pangolin. Некоторые параметры Pangolin должны совпадать на мастере и на реплике (с учетом того, что реплика может стать мастером). Поэтому их нужно настраивать только через распределенное хранилище.

    Также отдельно стоит остановиться на параметрах ttl, retry_timeout и loop_wait.

    Параметр ttl определяет время жизни ключа лидера в DCS в секундах.

    Вспомним, что DCS является хранилищем типа «ключ-значение». Информация о том, какой узел сейчас является мастером, хранится в ключе лидера.

    Каждые loop_wait секунд Pangolin Manager просыпается и выполняет некоторые действия, в числе которых обновление информации в ключе лидера.

    Если в течение ttl секунд мастер не обновил ключ лидера, то считается, что произошел сбой на мастере и инициализируются выборы нового мастера.

    Помимо этого, есть параметр retry_timeout, определяющий время, через которое выполняется повторная попытка обращения к DCS, если предыдущая была неудачной.

    Для корректной работы кластера указанные параметры должны находиться в соотношении:

    ttl >= loop_wait + 2*retry_timeout

    Также есть секция initdb, содержащая параметры для инициализации кластеров баз данных (не путайте с кластером узлов) утилитой initdb.

  6. Посмотрите содержимое секции postgresql файла конфигурации:

    [postgres@ServerName pangolin-manager]$ grep -A 33 '^postgresql' postgres.yml
    postgresql:
    pgpass: /home/postgres/.pgpass
    listen: 0.0.0.0:5433
    bin_dir: /usr/pangolin-major.minor/bin
    bin_dir_client: /usr/pangolin-dbms-client-major.minor/bin
    connect_address: 172.29.53.69:5433
    data_dir: /pgdata/06/data/
    create_replica_methods:
    - basebackup
    basebackup:
    format: plain
    wal-method: fetch
    authentication:
    replication:
    username: patroni
    password: PatroniTestPassword1029!@
    database: replication
    superuser:
    username: patroni
    password: PatroniTestPassword1029!@
    callbacks:
    on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    parameters:
    # debug_pretty_print: False
    # pgaudit.log: none
    # performance_insights.enable: False
    # pg_stat_statements.track: all
    # pg_stat_statements.max: 5000
    # pg_hint_plan.parse_messages: warning
    # pg_hint_plan.message_level: log
    # masking_mode: disabled
    # relnblocks_enable: False
    # enable_monitor_object_modification_date: False
    archive_mode: off

    В этой секции хранятся параметры, относящиеся к экземпляру Pangolin, агентом которого является Pangolin Manager.

    В том числе указан каталог данных, параметры подключения и конфигурационные параметры экземпляра.

    Важно отметить, что конфигурационные параметры экземпляра, указанные в файле postgres.yml, имеют приоритет над параметрами, указанными в DCS.

    Однако есть ряд параметров, которые должны совпадать на всех экземплярах кластера. Указание этих параметров в файле postgres.yml не даст эффекта.

    Также необходимо учитывать, что Pangolin Manager перезаписывает параметры в файлах postgresql.conf, postgresql.auto.conf и pg_hba.conf, поэтому изменение параметров на экземпляре Pangolin, например командой ALTER SYSTEM, может быть перезаписано.

    Для применения изменений, внесенных в файл postgres.yml, необходимо вызвать команду pangolin-manager-ctl reload

    Более подробно о конфигурировании Patroni (или Pangolin Manager) можно узнать из документации.

  7. Посмотрите содержимое конфигурационного файла хранилища etcd:

    [postgres@pangolin-prac-dba-3-4-rdldb7 pangolin-manager]$ cat /etc/etcd/etcd.conf
    ETCD_NAME="pangolin-prac-dba-3-4-rdldb7"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="http://172.29.53.69:2379"
    ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.29.53.69:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd"
    ETCD_INITIAL_CLUSTER="pangolin-prac-dba-3-4-gh2eru=http://172.29.53.232:2380,pangolin-prac-dba-3-4-rdldb7=http://172.29.53.69:2380,pangolin-prac-dba-3-4-n6vz6c=http://172.29.53.148:2380"
    ETCD_INITIAL_CLUSTER_STATE="new"
    ETCD_DATA_DIR="/var/lib/etcd"
    ETCD_ELECTION_TIMEOUT="5000"
    ETCD_HEARTBEAT_INTERVAL="1000"
    ETCD_ENABLE_V2="true"
    ETCD_LOG_OUTPUTS="/pgerrorlogs/06/etcd/etcd.log"
    ETCD_LOGGER="zap"

    У хранилища etcd есть свой конфигурационный файл.

    Из него, в частности, можно узнать, какие узлы входят в состав распределенного хранилища (ETCD_INITIAL_CLUSTER).

  8. Посмотрите состояние узлов кластера:

    [postgres@ServerName pangolin-manager]$ pangolin-manager-ctl -c postgres.yml list
    + Cluster:----------+-----------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------+--------------------+--------------+-----------+----+-----------+
    | 172.29.53.148 | 172.29.53.148:5433 | Sync Standby | streaming | 2 | 0 |
    | 172.29.53.69 | 172.29.53.69:5433 | Leader | running | 2 | |
    +---------------+--------------------+--------------+-----------+----+-----------+

    Утилита pangolin-manager-ctl позволяет как управлять кластером, так и получать информацию о его текущем состоянии.

    В этом случае с использованием команды list и ключа -c, указывающего на файл конфигурации, была получена информация о текущем состоянии узлов кластера.

    Видно, что мастером является узел 172.29.53.69 (Role=Leader), а синхронной репликой — узел 172.29.53.148 (Role=Sync Standby).

    Поле Lag in MB содержит информацию об отставании в MB реплики от мастера.

    Поле TL содержит номер линии времени. При переключении реплики на мастера указанный номер должен увеличиться для исключения пересечения сегментов WAL.

  9. Подключитесь в psql к базе данных postgres с ролью patroni, введя пароль, указанный в секции postgresql файла postgresql.yml:

    [postgres@pangolin-prac-dba-3-4-rdldb7 pangolin-manager]$ psql -U patroni
    Password for user patroni:
    psql (15.5)
    Type "help" for help.

    Роль patroni используется для администрирования кластера. Для администрирования экземпляра — роль postgres. Чтобы можно было с ней подключаться с учетом текущих настроек pg_hba.conf, необходимо задать пароль.

  10. В сеансе psql задайте пароль для роли postgres:

    postgres=# ALTER ROLE postgres PASSWORD 'PostgresTestPassword1029!@';
    ALTER ROLE

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

  11. В сеансе psql подключитесь базе данных postgres с ролью postgres, указав IP-адрес хоста Replica:

    postgres=# \c - postgres 172.29.53.148
    Password for user postgres:
    You are now connected to database "postgres" as user "postgres" on host "172.29.53.148" at port "5433".

    Возможность подключения к реплике от имени роли postgres подтверждает, что изменения, сделанные на мастере, до реплики дошли и применились.

  12. В сеансе psql проверьте, что экземпляр работает в режиме восстановления:

    postgres=# SELECT pg_is_in_recovery();
    pg_is_in_recovery
    -------------------
    t
    (1 row)

    Экземпляр работает в режиме восстановления, а значит, является репликой.

  13. Проверьте в сеансе psql, работает ли реплика в режиме горячего резерва, и выйдите из psql:

    postgres=# SHOW hot_standby;
    hot_standby
    -------------
    on
    (1 row)
    postgres=# \q

    Реплика работает в режиме горячего резерва, поэтому может выполнять запросы на чтение.

Перенаправление подключений​

  1. Подключитесь в psql к кластеру, указав два IP-адреса: для реплики и для мастера.

    Также в строке подключения укажите пароль для роли postgres и значение параметра target_session_attrs=read-write:

    [postgres@ServerName pangolin-manager]$ psql "host=172.29.53.148,172.29.53.69 user=postgres password='PostgresTestPassword1029\!@' dbname=postgres target_session_attrs=read-write"
    psql (15.5)
    Type "help" for help.

    Вспомним, что для подключения к кластеру необходима какая-либо точка входа, которая будет направлять клиентов на подходящий узел.

    В этом случае запросы на чтение могут выполняться как на мастере, так и на реплике, запросы на запись — только на мастере.

    В качестве точки входа будем использовать библиотеку libpq, с помощью которой в том числе организуется подключение psql.

    В строке подключения в параметре host перечисляются все хосты кластера, а в параметре target_session_attrs могут быть указаны требования к подключению. Здесь мы запросили подключение, в котором могут выполняться запросы на запись (target_session_attrs=read-write).

    libpq последовательно перебирает хосты и организует подключение с первым из них, который удовлетворяет требованиями параметра target_session_attrs.

  2. Проверьте в сеансе psql параметры подключения и выйдите из psql:

    postgres=# \conninfo
    You are connected to database "postgres" as user "postgres" on host "172.29.53.69" at port "5433".
    postgres=# \q

    Было выполнено подключение к мастеру, поскольку было указано требования выполнения запросов на запись.

  3. Снова подключитесь в psql к кластеру. На этот раз укажите значение параметра target_session_attrs=read-only:

    [postgres@pangolin-prac-dba-3-4-rdldb7 pangolin-manager]$ psql "host=172.29.53.148,172.29.53.69 user=postgres password='PostgresTestPassword1029\!@' dbname=postgres target_session_attrs=read-only"
    psql (15.5)
    Type "help" for help.
  4. Проверьте в сеансе psql параметры подключения:

    postgres=# \conninfo
    You are connected to database "postgres" as user "postgres" on host "172.29.53.148" at port "5433".

    Теперь было организовано подключение к реплике, поскольку она первой указана в списке хостов и не требовалось выполнение запросов на запись.

Настройка конфигурационных параметров​

  1. Посмотрите в сеансе psql значения параметров, относящихся к скорости выполнения очистки и автоочистки, и выйдите из psql:

    postgres=# SELECT name, setting, context FROM pg_settings WHERE name IN ('vacuum_cost_limit', 'autovacuum_vacuum_cost_limit', 'vacuum_cost_delay', 'autovacuum_vacuum_cost_delay');
    name | setting | context
    ------------------------------+---------+---------
    autovacuum_vacuum_cost_delay | 20 | sighup
    autovacuum_vacuum_cost_limit | -1 | sighup
    vacuum_cost_delay | 0 | user
    vacuum_cost_limit | 200 | user
    (4 rows)
    postgres=# \q

    Наша текущая цель — настроить один из конфигурационных параметров сразу на всех экземплярах Pangolin.

    Для этого значение параметра должно быть записано в хранилище etcd.

    Однако, стоит учитывать, что значения параметров, указанных в файле postgres.yml имеют приоритет над значениями, указанными в etcd. Поэтому мы будем менять значение параметра, которого заведомо нет в файле postgres.yml.

    Для примера будем использовать параметр autovacuum_vacuum_cost_limit, который определяет объем работы, выполняемый автоочисткой между паузами длиной autovacuum_vacuum_cost_delay.

    Можно заметить, что изменение значения параметра autovacuum_vacuum_cost_limit в текущий момент не окажет влияния на реплику, поскольку очистка на реплике не выполняется. Однако, реплика рано или поздно станет мастером, тогда этот параметр станет актуальным.

    Значение параметра autovacuum_vacuum_cost_limit по умолчанию равно -1, что означает использование значения параметра vacuum_cost_limit, которое равно 200.

    Немного увеличим скорость выполнения автоочистки, задав значение autovacuum_vacuum_cost_limit = 300.

    Обратите внимание, что параметр autovacuum_vacuum_cost_limit имеет контекст sighup: для его применения необходимо перечитать конфигурацию путем посыла сигнала SIGHUP.

  2. Измените значение параметра autovacuum_vacuum_cost_limit с использованием pangolin-manager:

    [postgres@ServerName pangolin-manager]$ pangolin-manager-ctl -c postgres.yml edit-config
    loop_wait: 10
    maximum_lag_on_failover: 1048576
    postgresql:
    parameters:
    auth_activity_period: '60'
    authentication_max_workers: '16'
    logical_decoding_work_mem: 64MB
    max_connections: '110'
    max_prepared_transactions: '3'
    max_replication_slots: '10'
    max_wal_senders: '10'
    max_worker_processes: '32'
    track_commit_timestamp: false
    wal_keep_size: 8GB
    wal_level: replica
    wal_log_hints: true
    use_pg_rewind: true
    use_slots: true
    retry_timeout: 60
    synchronous_mode: true
    synchronous_mode_strict: false
    ttl: 135

    Выполнение изменений общих параметров в etcd выполняется командой edit-config утилиты pangolin-manager-ctl.

    В ходе выполнения команды будет запущен текстовый редактор Vim с отображением общих параметров узлов кластера.

    Добавьте autovacuum_vacuum_cost_limit в список параметров:

    • Нажмите клавишу i — Vim перейдет в режим редактирования
    • Вставьте строку autovacuum_vacuum_cost_limit: 300 в конце секции parameters: (после строки wal_log_hints: true)
    • Нажмите Esc — Vim выйдет из режима редактирования
    • Наберите :wq и нажмите Enter

    Vim сохранит изменения и отдаст управление вызвавшей его команде, то есть pangolin-manager edit-config.

    В результате будет задан вопрос о необходимости применения измененного параметра:

    ---
    +++
    @@ -15,6 +15,7 @@
    wal_keep_size: 8GB
    wal_level: replica
    wal_log_hints: true
    + autovacuum_vacuum_cost_limit: 300
    use_pg_rewind: true
    use_slots: true
    retry_timeout: 60

    Apply these changes? [y/N]: y

    Введите y и нажмите Enter:

    Configuration changed
  3. Подключитесь в psql к базе данных postgres на мастере и проверьте значение параметра autovacuum_vacuum_cost_limit:

    [postgres@pangolin-prac-dba-3-4-rdldb7 pangolin-manager]$ psql "user=postgres password='PostgresTestPassword1029\!@' dbname=postgres"
    Type "help" for help.
    postgres=# SHOW autovacuum_vacuum_cost_limit;
    autovacuum_vacuum_cost_limit
    ------------------------------
    300
    (1 row)

    На мастере значение параметра успешно применилось.

    Pangolin-Manager не только изменил значение параметра в конфигурационном файле экземпляра, но и послал сигнал SIGHUP, чтобы экземпляр перечитал конфигурацию.

  4. Выйдите из psql, снова подключитесь к базе данных postgres, на этот раз указав IP-адрес хоста Replica, и проверьте значение параметра autovacuum_vacuum_cost_limit:

    postgres=# \q
    [postgres@ServerName pangolin-manager]$ psql "host={IP-Address} user=postgres password='PostgresTestPassword1029\!@' dbname=postgres"
    psql (15.5)
    Type "help" for help.
    postgres=# SHOW autovacuum_vacuum_cost_limit;
    autovacuum_vacuum_cost_limit
    ------------------------------
    300
    (1 row)

    И на реплике значение параметра успешно применилось.

  5. Выйдите из psql:

    postgres=# \q

Аварийное переключение (failover)​

  1. Проверьте состояние узлов:

    [postgres@pangolin-prac-dba-3-4-rdldb7 pangolin-manager]$ pangolin-manager-ctl -c postgres.yml list
    + Cluster: ClusterName ----------+-----------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------+--------------------+--------------+-----------+----+-----------+
    | 172.29.53.148 | 172.29.53.148:5433 | Sync Standby | streaming | 2 | 0 |
    | 172.29.53.69 | 172.29.53.69:5433 | Leader | running | 2 | |
    +---------------+--------------------+--------------+-----------+----+-----------+

    Пока все без изменений.

  2. Выйдите из оболочки, запущенной от имени пользователя postgres:

    [postgres@ServerName pangolin-manager]$ exit
    logout
  3. Посмотрите состояние сервиса pangolin-manager:

    [student@pangolin-prac-dba-3-4-rdldb7 ~]$ sudo systemctl status pangolin-manager
    ● pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQL
    Loaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; enabled; preset: disabled)
    Active: active (running) since Sun 2025-11-30 09:29:55 UTC; 3 days ago
    Main PID: 73751 (pangolin-manage)
    Tasks: 21 (limit: 10826)
    Memory: 311.3M
    CPU: 7min 39.024s
    CGroup: /system.slice/pangolin-manager.service
    ├─73751 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
    ├─93213 /usr/pangolin-major.minor/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.>
    ├─93216 "postgres: ClusterName: logger "
    ├─93217 "postgres: ClusterName: checkpointer "
    ├─93218 "postgres: ClusterName: background writer "
    ├─93220 "postgres: ClusterName: idle sessions terminator "
    ├─93221 "postgres: ClusterName: walwriter "
    ├─93222 "postgres: ClusterName: autovacuum launcher "
    ├─93223 "postgres: ClusterName: integrity check launcher "
    ├─93224 "postgres: ClusterName: license checker "
    ├─93225 "postgres: ClusterName: authproc "
    ├─93226 "postgres: ClusterName: password policy cache "
    ├─93227 "postgres: ClusterName: pg_cron launcher "
    ├─93228 "postgres: ClusterName: logical replication launcher "
    ├─93233 "postgres: ClusterName: patroni postgres 127.0.0.1(49710) idle"
    └─94079 "postgres: ClusterName: walsender patroni 172.29.53.148(50580) streaming 0/E000000"

    Сервис Pangolin Manager работает.

    Обратите внимание, что экземпляр Pangolin запускается указанным сервисом — /usr/pangolin-major.minor/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0..

  4. Остановите сервис pangolin_manager:

    [student@ServerName ~]$ sudo systemctl stop pangolin-manager
  5. Запустите оболочку от имени пользователя postgres и проверьте состояние узлов:

    [student@pangolin-prac-dba-3-4-rdldb7 ~]$ sudo -iu postgres
    ===============================================================
    You are connected to Pangolin Cluster
    - Hostname : pangolin-prac-dba-3-4-rdldb7.novalocal
    - IP Address : fe80::f816:3eff:fe50:6878%eth0 172.29.53.69
    ---------------------------------------------------------------
    - node ( master ) :
    - node ( replica ) :
    - arbiter : 172.29.53.232
    - Manager version : 2.1.8
    - Pangolin version : 06.006.00
    ===============================================================
    [postgres@ServerName ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
    + Cluster: ClusterName -----+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------+--------------------+---------+---------+----+-----------+
    | 172.29.53.148 | 172.29.53.148:5433 | Leader | running | 3 | |
    | 172.29.53.69 | 172.29.53.69:5433 | Replica | stopped | | unknown |
    +---------------+--------------------+---------+---------+----+-----------+

    Реплика быстро обнаружила отсутствие мастера, не дожидаясь истечения срока (ttl) ключа лидера в etcd.

    Дело в том, что узлы проверяют состояние друг друга не только посредством etcd, но и напрямую с использованием REST API.

    После этого реплика повысила свой статус до мастера, а бывшему мастеру был назначен статус реплики, который начнет действовать после его восстановления.

    Также обратите внимание, что увеличен на 1 номер линии времени (TL=3).

  6. Подключитесь в psql к базе данных postgres, указав IP-адрес хоста Replica:

    [postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ psql "host={IP-Address} user=postgres password='PostgresTestPassword1029\!@' dbname=postgres"

    psql (15.5)
    Type "help" for help.
  7. Проверьте, что теперь экземпляр не в режиме восстановления:

    postgres=# SELECT pg_is_in_recovery();
    pg_is_in_recovery
    -------------------
    f
    (1 row)

    Теперь бывшая реплика стала мастером.

  8. Создайте базу данных some_db и выйдите из psql:

    postgres=# CREATE DATABASE some_db;
    CREATE DATABASE
    postgres=# \q
  9. Выйдите из оболочки, запущенной от имени пользователя postgres, и запустите сервис pangolin-manager:

    [postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ exit
    logout
    [student@pangolin-prac-dba-3-4-rdldb7 ~]$ sudo systemctl start pangolin-manager
  10. Запустите оболочку от имени пользователя postgres и проверьте состояние узлов:

    [student@pangolin-prac-dba-3-4-rdldb7 ~]$ sudo -iu postgres
    ===============================================================
    You are connected to Pangolin Cluster
    - Hostname : pangolin-prac-dba-3-4-rdldb7.novalocal
    - IP Address : fe80::f816:3eff:fe50:6878%eth0 172.29.53.69
    ---------------------------------------------------------------
    - node ( master ) : 172.29.53.148
    - node ( replica ) : 172.29.53.69
    - arbiter : 172.29.53.232
    - Manager version : 2.1.8
    - Pangolin version : 06.006.00
    ===============================================================
    [postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
    + Cluster: ClusterName ----------+-----------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------+--------------------+--------------+-----------+----+-----------+
    | 172.29.53.148 | 172.29.53.148:5433 | Leader | running | 3 | |
    | 172.29.53.69 | 172.29.53.69:5433 | Sync Standby | streaming | 3 | 0 |
    +---------------+--------------------+--------------+-----------+----+-----------+

    Узел Master восстановлен после сбоя, теперь новая реплика стала активной.

  11. Подключитесь в psql к базе данных postgres на текущем хосте и получите список баз данных:

    [postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ psql " user=postgres password='PostgresTestPassword1029\!@' dbname=postgres"
    psql (15.5)
    Type "help" for help.
    postgres=# \l
    List of databases
    Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges
    -----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
    postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    some_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
    template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
    | | | | | | | postgres=CTc/postgres
    template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
    | | | | | | | postgres=CTc/postgres
    (4 rows)

    Изменения, сделанные на новом мастере, дошли до новой реплики после ее восстановления.

    Процедура failover отработана.

Завершение​

  1. Выйдите из psql:

    postgres=# \q
  2. Выйдите из оболочки, запущенной от имени пользователя postgres:

    [postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ exit
    logout

Самопроверка​

Вопрос 1

В оболочке bash выполнена следующая последовательность команд:

[postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
+ Cluster: bootcamp (7578448142890470662) ----------+-----------+----+-----------+
| Member        | Host               | Role         | State     | TL | Lag in MB |
+---------------+--------------------+--------------+-----------+----+-----------+
| 172.29.53.50  | 172.29.53.50:5433  | Sync Standby | streaming |  2 |         0 |
| 172.29.53.90  | 172.29.53.90:5433  | Sync Standby | streaming |  2 |         0 |
| 172.29.53.70  | 172.29.53.70:5433  | Leader       | running   |  2 |           |
+---------------+--------------------+--------------+-----------+----+-----------+

[postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ psql "host=172.29.53.70,172.29.53.50,172.29.53.90 user=postgres dbname=postgres target_session_attrs=read-only"
psql (15.5)
Type "help" for help.

К базе данных какого хоста было выполнено подключение в результате выполнения последней команды?

Вопрос 2

В оболочке bash выполнена следующая команда, показывающая текущее состояние настроек в кластере:

[postgres@pangolin-prac-dba-3-4-rdldb7 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml show-config
loop_wait: 10
maximum_lag_on_failover: 1048576
postgresql:
parameters:
auth_activity_period: '60'
authentication_max_workers: '16'
logical_decoding_work_mem: 64MB
maintenance_work_mem: 256MB
max_connections: '110'
max_prepared_transactions: '3'
max_replication_slots: '10'
max_wal_senders: '10'
max_worker_processes: '32'
track_commit_timestamp: false
wal_keep_size: 8GB
wal_level: replica
wal_log_hints: true
use_pg_rewind: true
use_slots: true
retry_timeout: 35
synchronous_mode: true
synchronous_mode_strict: false
ttl: 85

Через какой интервал времени (в секундах) мастер обновляет ключ лидера в DCS?

Вопрос 3

Каким способом могут изменяться конфигурационные параметры сразу на всех экземплярах кластера?

Вопрос 4

Какое минимальное количество узлов с DCS должно быть в кластере, состоящем из одного мастера и двух реплик?