DRBD Pacemaker

Материал из ALT Linux Wiki
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

В данной статье показан пример развертывания HA кластера NFS, состоящего из двух узлов. В решении используется DRBD, Pacemaker и Corosync.

Конфигурация стенда
Имя узла LVM устройство Группа томов LVM Блок данных DRBD Внешний интерфейс Внешний IP Внутренний интерфейс Внутренний IP
node01 /dev/sdb vg0 data enp0s3 192.168.0.130 enp0s8 10.110.2.20
node02 /dev/sdb vg0 data enp0s3 192.168.0.131 enp0s8 10.110.2.21

192.168.0.133 — виртуальный IP-адрес по которому будет отвечать один из узлов.

Внимание! Порты, используемые DRBD (7788) и Corosync (5404, 5405), должны быть свободны.


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

DRBD

Установить пакет drbd-utils и модуль ядра (в данном примере, тип ядра — std-def):

# apt-get install drbd-utils kernel-modules-drbd9-std-def

Активировать и включить в автозагрузку модуль ядра drbd:

# modprobe drbd
# echo drbd > /etc/modules-load.d/drbd.conf
Примечание: Так как за запуск службы DRBD будет отвечать Pacemaker, автозапуск службы DRBD должен быть отключён:
# systemctl disable drbd


На обоих узлах создать файл конфигурации ресурсов (например, /etc/drbd.d/shared.res), определяющий состав дисковых ресурсов DRBD:

resource shared {
        protocol C;
        device    /dev/drbd1;
        disk      /dev/vg0/data;
        meta-disk internal;
        on node01 {
                address   10.110.2.20:7789;
        }
        on node02 {
                address   10.110.2.21:7789;
        }
}
Примечание: В данной статье рассмотрена минимальная конфигурация.


Примечание: Проверить конфигурацию DRBD можно, выполнив команду drbdadm dump all.


Создать ресурс метаданных (на двух узлах):

# drbdadm create-md shared
initializing activity log
initializing bitmap (1280 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
Внимание! Эта команда должна завершиться без каких-либо предупреждений (warnings) — если вы получаете сообщения о том, что обнаружены данные и продолжите выполнение команды, данные будут потеряны.


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

# drbdadm up shared

# drbdadm status
shared role:Secondary
  disk:Inconsistent
  node02 role:Secondary
    peer-disk:Inconsisten

В выводе команды видно, что ресурс подключен, но находится в несогласованном состоянии. Необходимо перевести ресурс в согласованное состояние. Для этого есть два варианта:

  1. Выполнить полную синхронизацию устройств, что потенциально может занять много времени в зависимости от размера диска.
  2. Пропустить первоначальную синхронизацию.

Так как у нас новая настройка с «только что созданными» метаданными и без каких-либо существующих данных на устройстве, можно использовать вариант 2 и пропустить первоначальную синхронизацию. Для перевода ресурса в согласованное состояние следует выполнить на узле node01 следующие команды:

# drbdadm new-current-uuid --clear-bitmap shared/0

# drbdadm status
shared role:Secondary
  disk:UpToDate
  node02 role:Secondary
    peer-disk:UpToDate


Примечание: Если требуется выполнить полную синхронизацию устройств, то необходимо выбрать, какой узел будет Primary (если есть данные, то это должен быть узел, на котором они уже есть) и на нём выполнить команду:
# drbdadm primary --force shared
В этом случае следует дождаться завершения синхронизации. После завершения синхронизации состояние обоих дисков должно быть UpToDate.


Создание ФС на DRBD-устройстве

Сделать узел node01 Primary и создать файловую систему на устройстве (команды выполняются на узле node01):

# drbdadm primary shared

# drbdadm status
shared role:Primary
  disk:UpToDate
  node02 role:Secondary
    peer-disk:UpToDate

# mkfs.ext4 /dev/drbd1
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 10483383 4k blocks and 2621440 inodes
Filesystem UUID: ac6bbdb2-6672-45ed-8e26-9391f17a6b81
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624

Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done

Создать на обоих узлах каталог:

# mkdir /mnt/shared

Установка Pacemaker и Corosync

Pacemaker будет использоваться в качестве менеджера ресурсов кластера. Corosync действует как уровень обмена сообщениями, предоставляя Pacemaker информацию о состоянии узлов кластера.

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

# apt-get install corosync resource-agents pacemaker pcs drbd-utils-pacemaker

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

Примечание: Для удобства настройки, необходимо настроить между узлами ssh-подключения для root по ключу.


При установке Pacemaker автоматически будет создан пользователь hacluster. Для использования pcs, а также для доступа в веб-интерфейс нужно задать пароль пользователю hacluster (одинаковый на всех узлах):

# passwd hacluster

Запустить и добавить в автозагрузку службу pcsd:

# systemctl enable --now pcsd

Настроить аутентификацию (на одном узле):

# pcs host auth node01 node02 -u hacluster
Password:
node02: Authorized
node01: Authorized

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

Создать кластер:

# pcs cluster setup newcluster node01 addr=10.110.2.20 addr=192.168.0.130 node02 addr=10.110.2.21 addr=192.168.0.131
Destroying cluster on hosts: 'node01', 'node02'...
node01: Successfully destroyed cluster
node02: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'node01', 'node02'
node02: successful removal of the file 'pcsd settings'
node01: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'node01', 'node02'
node02: successful distribution of the file 'corosync authkey'
node02: successful distribution of the file 'pacemaker authkey'
node01: successful distribution of the file 'corosync authkey'
node01: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'node01', 'node02'
node02: successful distribution of the file 'corosync.conf'
node01: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.

Содержимое файла /etc/corosync/corosync.conf:

totem {
    version: 2
    cluster_name: newcluster
    transport: knet
    crypto_cipher: aes256
    crypto_hash: sha256
}

nodelist {
    node {
        ring0_addr: 10.110.2.20
        ring1_addr: 192.168.0.130
        name: node01
        nodeid: 1
    }

    node {
        ring0_addr: 10.110.2.21
        ring1_addr: 192.168.0.131
        name: node02
        nodeid: 2
    }
}

quorum {
    provider: corosync_votequorum
    two_node: 1
}

logging {
    to_logfile: yes
    logfile: /var/log/cluster/corosync.log
    to_syslog: yes
    timestamp: on
}

Добавить в автозапуск и запустить службы:

# systemctl enable --now pacemaker corosync

Проверка состояния кластера:

# pcs status cluster
Cluster Status:
 Cluster Summary:
   * Stack: corosync
   * Current DC: node02 (version 2.1.4-alt2-dc6eb4362) - partition with quorum
   * Last updated: Fri Oct 28 13:37:18 2022
   * Last change:  Fri Oct 28 13:35:35 2022 by hacluster via crmd on node02
   * 2 nodes configured
   * 0 resource instances configured
 Node List:
   * Online: [ node01 node02 ]

PCSD Status:
  node01: Online
  node02: Online

Дополнительные настройки кластера

Кворум определяет минимальное число работающих узлов в кластере, при котором кластер считается работоспособным. По умолчанию, кворум считается неработоспособным, если число работающих узлов меньше половины от общего числа узлов. Т.к. у нас узла всего два нужно отключить эту политику, выполнив команду (на одном узле кластера):

# pcs property set no-quorum-policy=ignore

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

# pcs property set stonith-enabled=false
Внимание! В реальной системе нельзя использовать конфигурацию с отключенным STONITH. Отключенный параметр на самом деле не отключает функцию, а только лишь эмулирует ее срабатывание при определенных обстоятельствах.


Настройка Pacemaker для HA NFS

Команда pcs cluster cib <имя файла> создаёт файл конфигурации. В этот файл будут записаны изменения конфигурации перед отправкой изменений в работающий кластер.

Настройка ресурсов DRBD

DRBD — это первый ресурс, который нужно настроить в Pacemaker. Следующие команды выполняются на узле node01. Данная команда загрузит рабочую версию информационной базы кластера (CIB), настроит примитив DRBD (p_drbd_shared) и продвигаемый клон для ресурса DRBD и, наконец, проверит и зафиксирует изменения конфигурации:

# pcs cluster cib drbdconf
# pcs -f drbdconf resource create p_drbd_shared ocf:linbit:drbd \
drbd_resource=shared \
op start interval=0s timeout=240s \
stop interval=0s timeout=100s \
monitor interval=31s timeout=20s \
role=Slave monitor interval=29s timeout=20s role=Master
# pcs -f drbdconf resource promotable p_drbd_shared \
promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify=true
# pcs cluster cib-push drbdconf
CIB updated

Запустить crm_mon для просмотра состояния кластера:

# crm_mon
Cluster Summary:
  * Stack: corosync
  * Current DC: node02 (version 2.1.4-alt2-dc6eb4362) - partition with quorum
  * Last updated: Fri Oct 28 12:47:50 2022
  * Last change:  Fri Oct 28 12:44:58 2022 by root via cibadmin on node01
  * 2 nodes configured
  * 2 resource instances configured

Node List:
  * Online: [ node01 node02 ]

Active Resources:
  * Clone Set: p_drbd_shared-clone [p_drbd_shared] (promotable):
    * Promoted: [ node01 ]
    * Unpromoted: [ node02 ]

Настройка ФС

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

# pcs -f drbdconf resource create p_fs_drbd1 ocf:heartbeat:Filesystem \
device=/dev/drbd1 directory=/mnt/shared fstype=ext4 \
options=noatime,nodiratime \
op start interval="0" timeout="60s" \
stop interval="0" timeout="60s" \
monitor interval="20" timeout="40s"
# pcs -f drbdconf constraint order promote p_drbd_shared-clone then start p_fs_drbd1
Adding p_drbd_shared-clone p_fs_drbd1 (kind: Mandatory) (Options: first-action=promote then-action=start)
# pcs -f drbdconf constraint colocation \
add p_fs_drbd1 with p_drbd_shared-clone INFINITY with-rsc-role=Promoted
# pcs cluster cib-push drbdconf
CIB updated

Просмотреть состояние кластера:

  • командой crm_mon:
    # crm_mon
    Cluster Summary:
      * Stack: corosync
      * Current DC: node01 (version 2.1.4-alt2-dc6eb4362) - partition with quorum
      * Last updated: Fri Oct 28 12:58:58 2022
      * Last change:  Fri Oct 28 12:58:48 2022 by root via cibadmin on node01
      * 2 nodes configured
      * 3 resource instances configured
    
    Node List:
      * Online: [ node01 node02 ]
    
    Active Resources:
      * Clone Set: p_drbd_shared-clone [p_drbd_shared] (promotable):
        * Promoted: [ node01 ]
        * Unpromoted: [ node02 ]
      * p_fs_drbd1  (ocf:heartbeat:Filesystem):  Started node01
    
  • командой pcs status:
    # pcs status
    Cluster name: newcluster
    Cluster Summary:
      * Stack: corosync
      * Current DC: node02 (version 2.1.4-alt2-dc6eb4362) - partition with quorum
      * Last updated: Fri Oct 28 14:09:44 2022
      * Last change:  Fri Oct 28 14:08:49 2022 by root via cibadmin on node01
      * 2 nodes configured
      * 3 resource instances configured
    
    Node List:
      * Online: [ node01 node02 ]
    
    Full List of Resources:
      * Clone Set: p_drbd_shared-clone [p_drbd_shared] (promotable):
        * Promoted: [ node01 ]
        * Unpromoted: [ node02 ]
      * p_fs_drbd1	(ocf:heartbeat:Filesystem):	 Started node01
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    
Примечание: Если сейчас попытаться выполнить команду mount /mnt/shared/ /dev/drbd1 на узле node02, она не будет выполнена.


Настройка NFS

Установить пакеты nfs-utils, rpcbind, nfs-server если они еще не установлены:

# apt-get install nfs-utils rpcbind nfs-server

Установить агент nfs:

# apt-get install resource-agents-nfs

Запустить и добавить в автозагрузку rpcbind:

# systemctl enable --now rpcbind

Необходимо установить порядок загрузки ресурсов: NFS должен запускаться на узле, где смонтирована ФС, и только после того, как она будет смонтирована.

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

# pcs -f drbdconf resource create p_nfsserver ocf:heartbeat:nfsserver \
nfs_shared_infodir=/mnt/shared/nfs_shared_infodir nfs_ip=192.168.0.133 \
op start interval=0s timeout=40s \
stop interval=0s timeout=20s \
monitor interval=10s timeout=20s
# pcs -f drbdconf constraint colocation add p_nfsserver with p_fs_drbd1 INFINITY
# pcs -f drbdconf constraint order p_fs_drbd1 then p_nfsserver
Adding p_fs_drbd1 p_nfsserver (kind: Mandatory) (Options: first-action=start then-action=start)
# pcs cluster cib-push drbdconf
CIB updated

Через некоторое время NFS-сервер будет запущен на узле node01:

# crm_mon
Cluster Summary:
  * Stack: corosync
  * Current DC:	node02 (version 2.1.4-alt2-dc6eb4362) - partition with quorum
  * Last updated: Fri Oct 28 14:31:44 2022
  * Last change:  Fri Oct 28 14:30:50 2022 by root via cibadmin on node01
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ node01 node02 ]

Active Resources:
  * Clone Set: p_drbd_shared-clone [p_drbd_shared] (promotable):
    * Promoted: [ node01 ]
    * Unpromoted: [ node02 ]
  * p_fs_drbd1  (ocf:heartbeat:Filesystem):	 Started node01
  * p_nfsserver (ocf:heartbeat:nfsserver):	 Started node01

Failed Resource Actions:
  * p_nfsserver probe on node02 returned 'error' (NFS server is up, but the locking daemons are down) at Fri Oct 28 14:30:50 2022 afte
r 95ms
  * p_nfsserver probe on node01 returned 'error' (NFS server is up, but the locking daemons are down) at Fri Oct 28 14:31:29 2022 afte
r 83ms

Создать и настроить каталог экспорта (на узле, где запущен NFS-сервер):

# mkdir -p /mnt/shared/exports/doc
# chown user:user /mnt/shared/exports/doc
# pcs -f drbdconf resource create p_exportfs_doc ocf:heartbeat:exportfs \
clientspec=192.168.0.0/24 directory=/mnt/shared/exports/doc fsid=1 \
unlock_on_stop=1 options=rw,sync \
op start interval=0s timeout=40s \
stop interval=0s timeout=120s \
monitor interval=10s timeout=20s
# pcs -f drbdconf constraint order p_nfsserver then p_exportfs_doc
Adding p_nfsserver p_exportfs_doc (kind: Mandatory) (Options: first-action=start then-action=start)
# pcs -f drbdconf constraint colocation add p_exportfs_doc with p_nfsserver INFINITY
# pcs cluster cib-push drbdconf
CIB updated

Просмотреть список экспортируемых каталогов на текущем основном узле (в примере это node01):

$ showmount -e node01
Export list for node01:
/srv/public             *
/mnt/shared/exports/doc 192.168.0.0/24

Виртуальный IP-адрес

Виртуальный IP-адрес (VIP) обеспечит постоянный доступ к экспортируемому каталогу NFS, если один из узлов кластера выйдет из строя. Ресурс VIP всегда должен запускаться на узле, где в данный момент активен NFS:

# pcs -f drbdconf resource create p_virtip_doc ocf:heartbeat:IPaddr2 \
ip=192.168.0.133 cidr_netmask=24 \
op monitor interval=20s timeout=20s \
start interval=0s timeout=20s \
stop interval=0s timeout=20s
# pcs -f drbdconf constraint order p_exportfs_doc then p_virtip_doc
Adding p_exportfs_doc p_virtip_doc (kind: Mandatory) (Options: first-action=start then-action=start)
# pcs -f drbdconf constraint colocation add p_virtip_doc with p_exportfs_doc INFINITY
# pcs cluster cib-push drbdconf

Теперь можно просмотреть список экспортируемых каталогов, указав виртуальный IP:

$ showmount -e 192.168.0.133
Export list for 192.168.0.133:
/srv/public             *
/mnt/shared/exports/doc 192.168.0.0/24

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

Имитируем отказ узла (аварийное переключение) во время копирования файла (для этого создадим «большой» файл в смонтированном каталоге с помощью утилиты dd).

На клиенте смонтировать экспортируемый каталог и создать файл write_test.out размером 1ГБ:

# mkdir /mnt/test_nfs_mount
# mount 192.168.0.133:/mnt/shared/exports/doc /mnt/test_nfs_mount
# dd if=/dev/zero of=/mnt/test_nfs_mount/write_test.out bs=1M count=1024

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

# echo b > /proc/sysrq-trigger

Узел будет немедленно перезагружен, в результате чего все ресурсы кластера будут перенесены на другой узел.

Отказ узла не должен прервать выполнение команды dd на клиентской системе, и команда должна завершить запись файла без ошибок:

# ls -lh /mnt/test_nfs_mount/
итого 1,1G
-rw-r--r-- 1 user user 1,0G окт 28 14:29 write_test.out

Просмотреть состояние DRBD на узле, который только что перезагрузился:

# drbdadm status
shared role:Secondary
  disk:UpToDate
  node02 role:Primary
    peer-disk:UpToDate

Просмотреть состояние кластера:

# pcs status
Cluster name: mycluster
Cluster Summary:
  * Stack: corosync
  * Current DC: node02 (version 2.1.4-alt2-dc6eb4362) - partition with quorum
  * Last updated: Fri Oct 28 14:34:56 2022
  * Last change:  Fri Oct 28 14:00:09 2022 by root via cibadmin on node01
  * 2 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ node01 node02 ]

Full List of Resources:
  * Clone Set: p_drbd_shared-clone [p_drbd_shared] (promotable):
    * Promoted: [ node02 ]
    * Unpromoted: [ node01 ]
  * p_fs_drbd1  (ocf:heartbeat:Filesystem):  Started node02
  * p_nfsserver (ocf:heartbeat:nfsserver):   Started node02
  * p_exportfs_doc  (ocf:heartbeat:exportfs):    Started node02
  * p_virtip_doc    (ocf:heartbeat:IPaddr2):     Started node02

Ссылки

https://linbit.com/drbd-user-guide/drbd-guide-9_0-en/