DRBD Pacemaker
В данной статье показан пример развертывания 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
Установить пакет 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
# 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;
}
}
Создать ресурс метаданных (на двух узлах):
# drbdadm create-md shared
initializing activity log
initializing bitmap (1280 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
Поднимите устройство на обоих узлах и проверьте их состояние, введя следующие команды:
# drbdadm up shared
# drbdadm status
shared role:Secondary
disk:Inconsistent
node02 role:Secondary
peer-disk:Inconsisten
В выводе команды видно, что ресурс подключен, но находится в несогласованном состоянии. Необходимо перевести ресурс в согласованное состояние. Для этого есть два варианта:
- Выполнить полную синхронизацию устройств, что потенциально может занять много времени в зависимости от размера диска.
- Пропустить первоначальную синхронизацию.
Так как у нас новая настройка с «только что созданными» метаданными и без каких-либо существующих данных на устройстве, можно использовать вариант 2 и пропустить первоначальную синхронизацию. Для перевода ресурса в согласованное состояние следует выполнить на узле node01 следующие команды:
# drbdadm new-current-uuid --clear-bitmap shared/0
# drbdadm status
shared role:Secondary
disk:UpToDate
node02 role:Secondary
peer-disk:UpToDate
# drbdadm primary --force shared
Создание ФС на 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
Создание кластера
При установке 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
Настройка 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
Настройка 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