Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление

Информация

Данная статья является частью статьи:   Развертывание двухузлового кластера pacemaker и применима в рамках указанной статьи.

Оглавление

Информация
titleДанная статья применима начиная с:


Предупреждение

При работе с защищенной СУБД postgresql с использованием МРД (см. Уровень конфиденциальности, категории конфиденциальности и целостность: что есть что, и как с этим работать?) рекомендуется использовать специальный агент ocf:astra:pgsql. Этот агент доступен в составе:

Для работы без использования МРД и для работы в более ранних обновлениях Astra Linux следует использовать обычный для Linux агент ocf:heartbeat:pgsql.

Введение

Предполагается, что дальнейшие действия выполняются на ранее подготовленном кластере pacemaker. См. статью Развертывание двухузлового кластера pacemaker.
В рамках подготовки кластера созданы два узла кластера с адресами 192.168.23.101/32 и 192.168.23.102/32, а сам кластер имеет адрес 192.168.23.100.
Далее в созданном кластере pacemaker создается отказоустойчивая кластерная служба СУБД PostgreSQL с репликацией данных между узлами. В процессе настройки один из узлов назначается ведущим (master), второй (остальные) — подчиненным (slave). При отказе ведущего узла подчиненный узел автоматически становится ведущим.
Настройка и тестирование аутентификации пользователей и работы мандатного управления доступом (МРД) в данной статье не рассматривается и не тестируется. См.:

Установка пакетов

Информация
Установка пакетов выполняется на каждом узле кластера.

Установить метапакет postgresql

Установка пакетов

Информация
Установка пакетов выполняется на каждом узле кластера.

Установить пакеты:

Для Astra Linux Special Edition x.7:

Command
sudo apt install postgresql-11
или, в зависимости от подключенных репозиториев и установленных оперативных обновлений и при отсутствии необходимости использовать МРД

:

Command
sudo apt install postgresql

При установке метапакета postgresql:

  1. В Astra Linux Special Edition x.7 будет установлена защищенная СУБД PostgreSQL версии 11.
  2. В

    -14

    Для обновлений Astra Linux Special Edition, выпущенных до обновления x.7 и , будет установлена защищенная СУБД PostgreSQL версии 9.6.

  3. В Astra Linux Common Edition будет установлена СУБД PostgreSQL версии 9.6 без встроенной защиты.

  4. Во всех обновлениях Astra Linux:
    1. Будет создан кластер СУБД (не путать с кластером pacemaker) с именем main.
    2. Будет создан служебный пользователь postgres (далее - пользователь postgres).

Если планируется использовать специальный агент ocf:astra:pgsql, то установить пакет astra-resource-agents:

Command
sudo apt install
postgresql-astra

При работе с использованием для прохождения аутентификации локальных (не доменных) пользователей (аутентификация с использованием PAM) разрешить служебному пользователю postgres доступ к файлу /etc/shadow:

Command
sudo setfacl -m u:postgres:r /etc/shadow
astra-resource-agents

Настройка СУБД postgresql

Для настройки работы СУБД postgesql проверить указанные ниже параметры и привести их к указанным значениям (добавить в случае отсутствия):

  1. В конфигурационном файле СУБД /etc/postgresql/<номер_версии>/<имя_кластера_СУБД>/postgresql.conf:

    Блок кода
    listen_addresses = '*'
    wal_level = replica
    wal_keep_segments = 32
  2. В конфигурационный файл /etc/postgresql/<номер_версии>/<имя_кластера>/pg_hba.conf добавить строки:

    Блок кода
    host    replication     postgres         192.168.23.101/32       trust
    host    replication     postgres         192.168.23.102/32       trust

    где 192.168.23.101/32 и 192.168.23.102/32 - IP-адреса узлов ранее подготовленного кластера pacemaker.

  3. Для того, чтобы внесенные изменения вступили в силу, перезапустить службу postgresql:

    Command

    sudo systemctl restart postgresql

Далее предполагается, что узел 192.168.23.101/32 назначается ведущим (master), а узел 192.168.23.102/32 - ведомым (slave).

Якорь
SYNC
SYNC
Синхронизация узлов кластерной службы postgresql

Выполнить синхронизацию данных между узлами кластерной службы postgresql, для чего на подчиненном узле (на всех подчиненных узлах):

  1. Действуя от имени пользователя postgres удалить содержимое кластера СУБД

Подготовка данных для тестирования

Информация

Подготовка данных для тестирования выполняется на каждом узле кластера.

  1. Перейти в каталог /tmp:

    Command
    cd /tmp

    Создать базу данных cluster:

    Command
    sudo -u postgres createdb cluster

    Создать в базе данных таблицу info:

    Command

    sudo -u postgres

    psql -d cluster -c "CREATE TABLE info (text varchar(80));"
    Добавить в таблицу запись, содержащую имя сервера

    sh -c "rm -rf /var/lib/postgresql/*/main/*"

  2. Действуя от имени пользователя postgres создать резервную копию ведущего узла. При этом обращение к ведущему узлу выполняется по его адресу (в примере —192.168.23.101). Далее созданная резервная копия будет использована для создания локальной копии базы данных. Команда для создания резервной копии:
    1. При работе в Astra Linux Special Edition x.7 и Astra Linux Special Edition x.8:

      Command
      sudo -u postgres
    psql -d cluster -c "INSERT INTO info VALUES ('Test DB - $(hostname)');"Задать пароль пользователю СУБД PostgreSQL (для примера использован пароль 123)
    1. pg_basebackup -h 192.168.23.101 -D /var/lib/postgresql/<номер_версии>/<имя_кластера> -P
      Где номер версии:
      • 11 для Astra Linux Special Edition x.7;
      • 15 для Astra Linux Special Edition x.8;
      • 14 в расширенном репозитории Astra Linux Special Edition x.7.
    2. При работе в Astra Linux, выпущенных до очередного обновления x.7:

      Command
      sudo -u postgres
    psql -c "ALTER USER postgres WITH PASSWORD '123';"

    Разрешить СУБД PostgreSQL принимать внешние подключения:

    Commandsudo sed -i '/^listen_addresses/s/localhost/*/' /etc/
    1. pg_basebackup -h 192.168.23.101 -D /var/lib/postgresql/<номер_версии>/
    main/postgresql.conf
    1. <имя_кластера> -P --xlog
  3. В дальнейшем службой postgresql будет управлять кластер pacemaker. Для исключения конфликтов между кластером и службой systemd на всех узлах (включая ведущий) отключить автоматический запуск службы postgresql при перезагрузке ОС и остановить службу

    Так как в дальнейшем работой сервиса будет управлять Corosync, следует исключить агента из автоматической загрузки

    :

    Command
    sudo systemctl disable postgresql
  4. Перезапустить кластер СУБД main:

    Command
    sudo pg_ctlcluster <номер_версии> main restart

    Где <номер_версии> - 9.6, 11 или 14 в зависимости от используемой версии PostgreSQL.

Подключение ресурса

  1. sudo systemctl stop postgresql

Создание кластерного ресурса

Для создания кластерного ресурса добавить необходимо кластерную службу СУБД как ресурс с именем pgsql. Для этого на ведущем узле:

  1. Выполнить команду создания ресурса (в качестве номера версии использовать значения в соответствии с используемой версией PostgreSQL). Имя создаваемого ресурса — pgsql.

    Предупреждение
    При создании ресурса в значении параметра node_list следует использовать те же имена узлов, что использовались при создании кластера (см. Развертывание двухузлового кластера pacemaker).
    Команды для создания ресурса:
    • Для Astra Linux Special Edition x.8

    Добавить службу PostgreSQL как ресурс с именем Database:

    Для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) с установленным оперативным обновлением БЮЛЛЕТЕНЬ № 2022-1110SE17 (оперативное обновление 1.7.3):

    Command

    sudo pcs resource create Database ocf:astra:pgsql pgversion=$psql_version op monitor interval=1min

    Для более ранних обновлений или в случаях, когда поддержка МРД в кластерных службах не требуется
    • :
      Command

      sudo pcs resource create

    Database
    • pgsql ocf:

    heartbeat
    • astra:pgsql \

        pgctl
    • pgversion="

    /usr/lib/postgresql/
    • <номер_версии>

    /bin/pg_ctl
    • " \

        pgdata="/var/lib/postgresql/<номер_версии>/main" \
        config="/etc/postgresql/<номер_версии>/main/postgresql.conf" \
        socketdir="/var/run/postgresql/" \
        op monitor interval=1minГде <номер_версии> - 9.6, 11 или 14 в зависимости от используемой версии PostgreSQL;
    • rep_mode="sync" \
      master_ip="192.168.23.100" \
      node_list="pcmk-1 pcmk-2"

      Подробное описание параметров см. man pcs и man ocf_astra_pgsql. Основные параметры:
      • pgversion — номер версии postgresql (11 для Astra Linux Special Edition x.7, 15 для для Astra Linux Special Edition x.8, в расширенном репозитории 1.7 также доступна версии 14);
      • pgsql — имя (идентификатор) создаваемого виртуального ресурса;
      • ocf:astra:pgsql — название предопределенного набора параметров ресурса (агент);
  2. Установить параметры службы:
    1. Для Astra Linux Special Edition x.7 и Astra Linux Special Edition x.8:
      1. Объявить ресурс pgsql "продвигаемым" (promotable) и создать вторичный ресурс. Такие ресурсы могут переключаться между двумя режимами работы - master и slave:

        Command
        sudo pcs resource promotable pgsql promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify=true

        В примере приведена форма команды без явного указания имени вторичного ресурса. При этом будет автоматически использовано имя <имя_ресурса>-clone (в данном примере - pgsql-clone).

      2. Объявить зависимости от других кластерных ресурсов:


        1. Для Astra Linux Special Edition x.8:
          Command
          sudo pcs constraint colocation add ClusterIP with promoted pgsql-clone INFINITY
        2. Для Astra Linux Special Edition x.7
    Установить ограничения:
    1. "Ресурс Database должен работать на узле, где размещен ClusterIP":

      Command
      sudo pcs constraint colocation add Database with ClusterIP INFINITY
      "Сначала запускается ClusterIP, затем Database"
        1. :
          Command
          sudo pcs constraint
      order ClusterIP then Database

Тестирование

Тестирование должно продемонстрировать отказоустойчивость созданного кластера. Тестирование работы МРД не рассматривается.

Подготовка теста

На клиентской машине, предназначенной для тестирования:

Установить клиентский пакет СУБД PostgreSQL:

Command
sudo apt install postgresql-client

Создать сценарий test-request.sh следующего содержания:

Блок кода
languagebash
#!/bin/sh
while true ; do
 psql postgresql://postgres:123@192.168.23.100/cluster -tc "SELECT text FROM info;" | xargs echo
 sleep 1s
done

Установить созданному файлу сценария права на исполнение

Command
chmod +x test-request.sh

Запустить сценарий:

Command
./test-request.sh

После запуска сценарий будет отправлять запрос кластеру 1 раз в секунду и выводить полученное содержимое на экран.
Если в данный момент ресурс ClusterIP размещен на узле 1, то вывод сценарий будет таким:

Блок кода
Test DB - pcmk-1
Test DB - pcmk-1
Test DB - pcmk-1
Test DB - pcmk-1
Test DB - pcmk-1
Test DB - pcmk-1

Отключение узла кластера от сети

        1. colocation add ClusterIP with master pgsql-clone INFINITY
    1. Для Astra Linux, выпущенных до очередного обновления x.7:
      1. Объявить мастер-ресурс:

        Command
        sudo pcs resource master mspgsql pgsql master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

        где:

          • mspgsql — имя мастер-ресурса, предоставляющего доступ к активному ведущему серверу;

          • pgsql — ранее созданный ресурс СУБД.
      2. Объявить зависимости от других кластерных ресурсов:

        Command
        sudo pcs constraint colocation add ClusterIP with master mspgsql INFINITY
  1. Запустить кластер:

    Command

    sudo pcs cluster start --all

  2. Проверить статус службы (может понадобиться некоторое время для полного запуска службы):

    Command
    sudo pcs status

    Пример вывода команды:

    Блок кода
    Cluster name: astracluster
    Stack: corosync
    Current DC: pcmk-1 (version 2.0.1-9e909a5bdd) - partition with quorum
    Last updated: Sat Mar 11 18:40:21 2023
    Last change: Sat Mar 11 18:39:28 2023 by root via crm_attribute on pcmk-1
     
    2 nodes configured
    3 resources configured
     
    Online: [ pcmk-1 pcmk-2 ]
     
    Full list of resources:
     
     ClusterIP      (ocf::heartbeat:IPaddr2):       Started pcmk-1
     Clone Set: pgsql-clone [pgsql] (promotable)
         Masters: [ pcmk-1 ]
         Slaves: [ pcmk-2 ]
     
    Daemon Status:
      corosync: active/disabled
      pacemaker: active/disabled
      pcsd: active/enabled

Если команда проверки состояния:

Command
sudo pcs status 

сообщает об ошибке:

Блок кода
exitreason='Replication(rep_mode=async or sync) requires Master/Slave configuration.'

то для устранения ошибки остановить и запустить кластер:

Command

sudo pcs cluster stop --all
sudo pcs cluster start --all

Тестирование

Тестирование должно продемонстрировать отказоустойчивость созданного кластера. Настройка и тестирование аутентификации пользователей и работы МРД в данной статье не рассматривается и не тестируется.

Тестирование репликации

  1. На ведущем узле создать тестовую базу данных test_db:

    Command
    sudo -u postgres psql -c "create database test_db;"
  2. Убедиться, что созданная база данных появилась на ведомом сервере:

    Command
    sudo -u postgres psql -l

Тестирование отказоустойчивости

  1. Выключить действующий ведущий сервер.

  2. Проверить статус кластера на ведомом узле:

    Command
    sudo pcs status

    В выводе команды должно быть указано, что узел выводится из эксплуатации (demoting). Пример вывода команды:

    Блок кода
    Cluster name: astracluster
    Stack: corosync
    Current DC: pcmk-1 (version 2.0.1-9e909a5bdd) - partition with quorum
    Last updated: Sun Mar 12 15:17:55 2023
    Last change: Sun Mar 12 15:12:38 2023 by root via crm_attribute on pcmk-1
     
    2 nodes configured
    3 resources configured
     
    Online: [ pcmk-1 pcmk-2 ]
     
    Full list of resources:
     
     ClusterIP      (ocf::heartbeat:IPaddr2):       Started pcmk-2
     Clone Set: pgsql-clone [pgsql] (promotable)
         pgsql      (ocf::astra:pgsql):     Demoting pcmk-1
         Slaves: [ pcmk-2 ]
     
    Daemon Status:
      corosync: active/disabled
      pacemaker: active/disabled
      pcsd: active/enabled
    

    После завершения переключения кластера мастером становится второй сервер

    Найти узел кластера, на котором размещены ресурсы, выполнив команду на любом узле:

    Command
    sudo pcs status resources

    На узле с кластерными ресурсами отключить сетевое соединение:

    Command
    sudo nmcli c d path 1

    Кластерные ресурсы мигрируют на другой узел кластера и вывод сценария test-request.sh изменится. Например, если кластерные ресурсы располагались на узле 1, то после отключения узла 1 от сети, ресурсы переместятся на узел 2.

    Блок кода
    Test DB - pcmk-1
    Test DB - pcmk-1
    Test DB - pcmk-1
    Test DB - pcmk-2
    Test DB - pcmk-2

    Включить сетевое соединение на отключенном от сети узле:

    Command
    sudo nmcli c u path 1

    Дождаться возвращение узла в кластер. После возвращения узла в кластер выполненная на любом из узлов команда

    Command
    sudo pcs status

    должна вывести:

    Блок кода
    Online: [ pcmk-1 pcmk-2 ]

    Если вывод команды на разных узлах различается - значит узел еще не вернулся в кластер.

Полное выключение узла кластера

  1. 
     
    Full list of resources:
     
     ClusterIP      (ocf::heartbeat:IPaddr2):       Started pcmk-2
     Clone Set: pgsql-clone [pgsql] (promotable)
         Masters: [ pcmk-2 ]
         Stopped: [ pcmk-1 ]
     
    Daemon Status:
      corosync: active/disabled
      pacemaker: active/disabled
      pcsd: active/enabled
    

Восстановление сбойного узла

Для восстановления сбойного узла выполнить на этом узле следующие действия:

  1. Выполнить синхронизацию данных с действующим ведущим сервером. См. Синхронизация узлов кластерной службы postgresql.
  2. Удалить файл /var/lib/pgsql/tmp/PGSQL.lock:

    Command
    sudo rm /var/lib/pgsql/tmp/PGSQL.lock
  3. Запустить кластер:

    Command
    sudo pcs cluster start

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

Блок кода
Cluster name: astracluster
Stack: corosync
Current DC: pcmk-2 (version 2.0.1-9e909a5bdd) - partition with quorum
Last updated: Tue Apr 11 14:13:34 2023
Last change: Tue Apr 11 14:05:24 2023 by root via crm_attribute on pcmk-2

2 nodes configured
3 resources configured

Online: [ pcmk-1 pcmk-2 ]

Full list of resources:

 ClusterIP      (ocf::heartbeat:IPaddr2):       Started pcmk-2
 Clone Set: pgsql-clone [pgsql] (promotable)
     Masters: [ pcmk-2 ]
     Slaves: [ pcmk-1 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

Найти узел кластера, на котором размещены ресурсы, выполнив команду на любом узле:

Command
sudo pcs status resources

Выключить узел с кластерными ресурсами, перезагрузив его:

Command
sudo reboot

Кластерные ресурсы мигрируют на другой узел кластера и вывод сценария test-request.sh изменится. Если кластерные ресурсы располагались на узле 2, то после выключения узла 2 ресурсы переместятся на узел 1.

Блок кода
Test DB - pcmk-2
Test DB - pcmk-2
Test DB - pcmk-2
Test DB - pcmk-1
Test DB - pcmk-1
Test DB - pcmk-1

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

Commandsudo pcs cluster start