| Секция | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Введение
В статье описано создание iSCSI-хранилища данных на основе двухузлового кластера Pacemaker. Главная цель кластера, чтобы iSCSI-хранилище всегда было доступно для клиентовКластер используется для минимизации времени недоступности iSCSI-хранилища.
Архитектура кластера
Кластер состоит из двух узлов: ведущего и подчинённого. Роль ведущего может выполнять любой узел (на рисунке ниже ведущим является узел pcmk-1 и , а подчинённым – pcmk-2.).
| Примечание |
|---|
Термины "ведущий узел кластера" и "подчинённый узел кластера" используются только в рамках описываемого кластера iSCSI-хранилища. Сам по себе кластер Pacemaker не делит узлы на ведущие и подчинённые, для него все узлы равноправны. |
На каждом На каждом узле:
- есть диск
/dev/vdb(на компьютере и в виртуальной машине VirtualBox это будет диск/dev/sdb); - поверх диска
/dev/vdbработает DRBD-устройство; - поверх DRBD-устройства работает iSCSI-сервер.
Кластер запускает и останавливает на узлах управляет: виртуальным IP-адресом, запуском и остановкой DRBD-устройства , и iSCSI-серверы, а также управляет виртуальным IP-адресом.
Один узел кластера является ведущим, второй – подчинённым.
сервера.
На ведущем узле: DRBD-устройство является ведущим, работает iSCSI-сервер. На подчинённом узле: DRBD-устройство является подчинённым, iSCSI-сервер остановлен.
iSCSI-клиенты подключаются к виртуальному IP-адресу кластера. Аутентификация iSCSI-клиентов не используется.
Рисунок 1. Архитектура iSCSI-хранилища на основе двухузлового кластера
...
| Название узла | IP-адрес | Назначение | ||
|---|---|---|---|---|
| 10.192.1.100/16 | Виртуальный IP-адрес кластера | |||
| pcmk-1 | 10.192.6.74/16 | Первый узел кластера | ||
| pcmk-2 | 10.192.6.75/16 | Второй узел кластера | 10.192.1.100/16 | Виртуальный IP-адрес кластера |
Предварительная настройка
Разрешение имён
...
Задать имена узлов и настроить разрешение имён в соответствии со статьёй "Настройка разрешения имен и статических IP-адресов".
При тестовом создании кластера можно настроить разрешение имён с помощью файла /etc/hosts:
- На каждом узле – добавить в файл
/etc/hostsстроки:Блок кода 10.192.6.74 pcmk-1 10.192.6.75 pcmk-2 - На первом узле – установить
...
- имя узла pcmk-1:
Command sudo hostnamectl hostname pcmk-1 - На втором узле – установить
...
- имя узла pcmk-2:
Command sudo hostnamectl hostname pcmk-2
Сетевой экран
Если используется сетевой экран, то должно быть обеспечено прохождение пакетовПри использовании сетевого экрана должны быть открыты порты:
- 7789/TCP – для работы DRBD-устройства;
- 3260/TCP – для работы iSCSI-сервера;
- 5405/UDP, 2224/TCP – для работы кластера Pacemaker + Сorosync.
Двухузловой кластер Pacemaker
...
Настроить кластер в соответствии со статьёй "Развертывание двухузлового кластера pacemaker".
...
Настроить DRBD-устройство в соответствии со статьёй "Стандартная настройка DRBD (Astra Linux 1.6)".
При настройке учесть:
- Для установки DRBD-пакетов используется команда:
Command sudo apt install drbd-utils "drbd-$(uname -r)"
- DRBD-устройство настраивается на узлах pcmk-DRBD-устройство настраивается на узлах pcmk-1 и pcmk-2 с IP-адресами, указанными в разделе "Архитектура кластера".
- Для создания DRBD-устройства используется блочное устройство
/dev/vdb. - Настраиваются глобальные настройки в файле
/etc/drbd.d/global_common.conf:Блок кода global { usage-count no; } - Настраивается Необходимо настроить ресурс "dvolume" , используя конфигурационный файл с помощью конфигурационного файла
/etc/drbd.d/dvolume.res:Блок кода resource "dvolume" { device minor 1; meta-disk internal; net { protocol C; fencing resource-only; } handlers { fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh"; unfence-peer "/usr/lib/drbd/crm-unfence-peer.9.sh"; } on "pcmk-1" { node-id 0; disk "/dev/vdb"; } on "pcmk-2" { node-id 1; disk "/dev/vdb"; } connection { host "pcmk-1" address 10.192.6.74:7789; host "pcmk-2" address 10.192.6.75:7789; } } - Для запуска DRBD-устройства – вместо команды "
sudo /etc/init.d/drbd start" использовать командуиспользуется команда:Command sudo drbdadm up dvolume
- Для назначения ведущим DRBD-устройством на текущем узле – вместо команды "
sudo drbdadm -- --overwrite-data-of-peer primary all" использовать командуиспользуется команда:Command sudo drbdadm primary --force all
Предупреждение Не создавать файловую систему и не монтировать DRBD-устройство.
- После окончания синхронизации DRBD-устройств команда на ведущем узле:
должна выводить:Command sudo drbdadm status
Блок кода dvolume role:Primary disk:UpToDate pcmk-2 role:Secondary peer-disk:UpToDate
iSCSIiSCSI-сервер
Для проверки настроек SCSI-сервера установить пакет:
...
- Создать ресурсного агента "p_DRBD" для управления DRBD-устройством:
Command sudo pcs resource create "p_DRBD" ocf:linbit:drbd \
drbd_resource="dvolume" \
op monitor interval=29s role="Promoted" \
op monitor interval=31s role="Unpromoted" \
promotable promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify="true" - Проверить настройки ресурсного агента "p_DRBD":
Вывод команды:Command sudo pcs resource status p_DRBD
Блок кода * Clone Set: p_DRBD-clone [p_DRBD] (promotable): * Promoted: [ pcmk-1 ] * Unpromoted: [ pcmk-2 ]
iSCSI-ресурс
| Примечание |
|---|
iSCSI-сервер будет доступен iSCSI-клиентам без аутентификации. |
На ведущем узле кластера (т. На ведущем узле кластера (т. е. на узле с ведущим DRBD -устройством):
- iSCSI-сервер будет иметь имя "iqn.2025-08.iscsi.pcmk12" и принимать запросы на порту 3260 IP-адреса 10.192.1.100.
- Создать ресурсного агента "p_iSCSITarget" для управления iSCSI-сервером:
Command sudo pcs resource create "p_iSCSITarget" ocf:heartbeat:iSCSITarget \
iqn="iqn.2025-08.iscsi.pcmk12" portals="10.192.1.100:3260" \
op monitor interval="10s" - Настроить Создать ресурсного агента "p_iSCSI_lun1" для управления экспортируемым LUN- диском
/dev/drbd1:Command sudo pcs resource create "p_iSCSI_lun1" ocf:heartbeat:iSCSILogicalUnit \
target_iqn="iqn.2025-08.iscsi.pcmk12" lun="1" path="/dev/drbd1" \
op monitor interval="10s" - Проверить настройки ресурсного агента "p_iSCSITarget":
Вывод команды:Command sudo pcs resource status p_iSCSITarget
Проверить настройки ресурсного агента "p_iSCSI_lun1:Блок кода ... * p_iSCSI_lun1 iSCSITarget (ocf:heartbeat:iSCSILogicalUnitiSCSITarget): Started pcmk-1 * p_iSCSITarget 2
Вывод команды:Command sudo pcs resource status p_iSCSI_lun1
Блок кода * p_iSCSI_lun1 (ocf:heartbeat:iSCSITargetiSCSILogicalUnit): Started pcmk-12
Ограничения на запуск ресурсов
На любом работающем узле кластера:
- отключить Отключить (если уже не отключеноотключён) режим работы STONITH, которое используется для физического отключения (обесточивания) неисправного физического дискапри котором неисправное оборудование физически отключается (обесточивается):
Command sudo pcs property set stonith-enabled="false"
- предотвратить Предотвратить перераспределение ресурсов между узлами после того, как кластер восстановил работу в нормальном режиме после аварийного режима:
при восстановлении нормального режима работы кластера после аварии:
Проверить настройки:Command Command sudo pcs resource defaults update resource-stickiness=100
Вывод команды:Command sudo pcs property
Блок кода Cluster Properties: cluster-infrastructure: corosync cluster-name: astracluster dc-version: 3.0.0-3.0.0 have-watchdog: false no-quorum-policy: ignore stonith-enabled: false
Вывод команды:Command sudo pcs resource defaults
Блок кода Meta Attrs: rsc_defaults-meta_attributes resource-stickiness=100
Все ресурсы кластера должны работать на одном узле и запускаться по порядку: первичный "p_DRBD", "ClusterIP", "p_iSCSITarget", "p_iSCSI_lun1".
...
Все ресурсы кластера должны работать на одном узле и запускаться по порядку: ведущий "p_DRBD", "ClusterIP", "p_iSCSITarget", "p_iSCSI_lun1".
Для этого на любом работающем узле кластера:
- Задать ограничения на запуск ресурса "ClusterIP":
Command sudo pcs constraint colocation add "ClusterIP" with Promoted "p_DRBD-clone"
Command sudo pcs constraint order promote "p_DRBD-clone" then start "ClusterIP"
- Задать ограничения на запуск ресурса "ClusterIPp_iSCSITarget":
Command sudo pcs constraint colocation add "ClusterIPp_iSCSITarget" with Promoted "p_DRBD-clone"
Задать ограничения на запуск ресурса "p_iSCSITarget":Command sudo pcs constraint order promote "p_DRBD-clone" then start "ClusterIP"
Command sudo pcs constraint colocation add "p_iSCSITarget" with "ClusterIP" INFINITY
Command sudo pcs constraint order "ClusterIP" then start "p_iSCSITarget"
- Задать ограничения на запуск ресурса "p_iSCSI_lun1":
Command sudo pcs constraint colocation add "p_iSCSI_lun1" with "p_iSCSITarget" INFINITY
Command sudo pcs constraint order "p_iSCSITarget" then "p_iSCSI_lun1"
- Проверить созданные ограничения:
Command sudo pcs constraint
:Раскрыть title Вывод команды ... Блок кода Location Constraints: Ordering Constraints: promote p_DRBD-clone then start ClusterIP (kind:Mandatory) start ClusterIP then start p_iSCSITarget (kind:Mandatory) start p_iSCSITarget then start p_iSCSI_lun1 (kind:Mandatory) Colocation Constraints: ClusterIP with p_DRBD-clone (score:INFINITY) (rsc-role:Started) (with-rsc-role:Promoted) p_iSCSITarget with ClusterIP (score:INFINITY) p_iSCSI_lun1 with p_iSCSITarget (score:INFINITY) Ticket Constraints:
Проверка работоспособности кластера при отказе одного из узлов
Перед использованием кластера необходимо проверить его работоспособность при отказе одного из узлов.
...
- Перезапустить кластер, чтобы ограничения вступили в силу:
Command sudo pcs cluster stop --all
Command sudo pcs cluster start --all
- Проверить, что все ресурсы запущены на каком-то одном узле кластера:
Command sudo pcs status
...
В выводе команды ведущий узел отобразится в строке с ресурсом ClusterIP после слова "Started":
...
Раскрыть title Вывод команды... Блок кода Cluster name: astracluster Cluster Summary: * Stack: corosync (Pacemaker is running) * Current DC: pcmk-2 (version 3.0.0-3.0.0) - partition with quorum * Last updated: Sun Aug 24 19:37:05 2025 on pcmk-1 * Last change: Sun Aug 24 19:32:28 2025 by root via root on pcmk-1 * 2 nodes configured * 5 resource instances configured Node List: * Online: [ pcmk-1 pcmk-2 ] Full List of Resources: * ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-2 * Clone Set: p_DRBD-clone [p_DRBD] (promotable): * Promoted: [ pcmk-2 ] * Unpromoted: [ pcmk-1 ] * p_iSCSITarget (ocf:heartbeat:iSCSITarget): Started pcmk-2 * p_iSCSI_lun1 (ocf:heartbeat:iSCSILogicalUnit): Started pcmk-2 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled
Проверка работоспособности кластера при отказе ведущего узла
Все ресурсы кластера запускаются на каком-то одном узле – на ведущем узле кластера.
Когда отключается ведущий узел, ресурсы запускаются на втором узле. Второй узел становится ведущим узлом кластера. При восстановлении работы первого узла ресурсы остаются работать на втором узле.
Порядок проверки работоспособности кластера при отказе ведущего узла:
- Определить, на каком узле запущены ресурсы, т.е. какой узел кластера является ведущим:
Command sudo pcs status
Раскрыть title Вывод команды... Блок кода Cluster name: astracluster Cluster Summary: * Stack: corosync (Pacemaker is running) * Current DC: pcmk-1 (version 3.0.0-3.0.0) - partition with quorum * Last updated: Thu Aug 28 13:07:33 2025 on pcmk-2 * Last change: Thu Aug 28 10:21:57 2025 by root via root on pcmk-2 * 2 nodes configured * 5 resource instances configured Node List: * Online: [ pcmk-1 pcmk-2 ] Full List of Resources: * ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1 * Clone Set: p_DRBD-clone [p_DRBD] (promotable): * Promoted: [ pcmk-1 ] * Unpromoted: [ pcmk-2 ] * p_iSCSITarget (ocf:heartbeat:iSCSITarget): Started pcmk-1 * p_iSCSI_lun1 (ocf:heartbeat:iSCSILogicalUnit): Started pcmk-1 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled - Рассмотрим случай, когда ведущим узлом является первый узел pcmk-1.
- На любом узле – остановить ведущий узел:
Command sudo pcs cluster stop pcmk-1
- На втором узле – проверить, что все ресурсы перемещены с первого на второй узел pcmk-2:
Command sudo pcs status
Раскрыть title Вывод команды... Блок кода Cluster name: astracluster Cluster Summary: * Stack: corosync (Pacemaker is running) * Current DC: pcmk-2 (version 3.0.0-3.0.0) - partition with quorum * Last updated: Thu Aug 28 13:14:12 2025 on pcmk-2 * Last change: Thu Aug 28 13:13:07 2025 by root via root on pcmk-2 * 2 nodes configured * 5 resource instances configured Node List: * Online: [ pcmk-2 ] * OFFLINE: [ pcmk-1 ] Full List of Resources: * ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-2 * Clone Set: p_DRBD-clone [p_DRBD] (promotable): * Promoted: [ pcmk-2 ] * Stopped: [ pcmk-1 ] * p_iSCSITarget (ocf:heartbeat:iSCSITarget): Started pcmk-2 * p_iSCSI_lun1 (ocf:heartbeat:iSCSILogicalUnit): Started pcmk-2 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled - На любом узле – запустить обратно первый узел:
Command sudo pcs cluster start pcmk-1
- На любом узле – проверить, что оба узла работают и все ресурсы остались на втором узле:
Command sudo pcs status
Раскрыть title Вывод команды... Блок кода Cluster name: astracluster Cluster Summary: * Stack: corosync (Pacemaker is running) * Current DC: pcmk-2 (version 3.0.0-3.0.0) - partition with quorum * Last updated: Thu Aug 28 13:40:50 2025 on pcmk-2 * Last change: Thu Aug 28 13:40:49 2025 by root via root on pcmk-2 * 2 nodes configured * 5 resource instances configured Node List: * Online: [ pcmk-1 pcmk-2 ] Full List of Resources: * ClusterIP (ocf:heartbeat:IPaddr2):
...
...
Предположим, что ведущим узлом является pcmk-1.
На любом узле – остановить узел pcmk-1 кластера:
| Command |
|---|
sudo pcs cluster stop pcmk-1 |
На втором узле pcmk-2 – проверить состояние кластера:
| Command |
|---|
sudo pcs status |
В выводе команды отобразится, что узел pcmk-1 отключён, а ведущим узлом является pcmk-2:
...
Started pcmk-2 * Clone Set: p_DRBD-clone [p_DRBD] (promotable): * Promoted: [ pcmk-2 ] *
...
Unpromoted: [ pcmk-1 ]
...
...
*
...
p_iSCSITarget
...
...
(ocf:heartbeat:
...
iSCSITarget): Started pcmk-2 * p_iSCSI_lun1
...
iSCSI-хранилище должно быть доступно по своему IP-адресу 192.168.23.100.
На любом узле – включить обратно первый узел кластера pcmk-1:
| Command |
|---|
sudo pcs cluster start pcmk-1 |
На любом узле – проверить, что оба узла кластера работают:
| Command |
|---|
sudo pcs status |
В выводе команды отобразится, что оба узла в работе:
...
(ocf:heartbeat:iSCSILogicalUnit): Started pcmk-2 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled
Возможные проблемы и способы их решения
...
После остановки или сбоя в работе кластера необходимо:
- Запустить кластер на На каждом узле (на котором кластер не запущен) командой– запустить кластер:
Дождаться окончания запуска кластера на обоих узлах, что может занять несколько десятков секунд.Command sudo pcs cluster start
- Проверить состояние кластера, выполнив на любом узле командуНа любом узле – проверить, что все ресурсы запущены на каком-то одном узле кластера:
Command sudo pcs status
Раскрыть title Пример вывода команды на ведущем узлеВывод команды... Блок кода Cluster name: astracluster Cluster Summary: * Stack: corosync (Pacemaker is running) * Current DC: pcmk-1 (version 3.0.0-3.0.0) - partition with quorum * Last updated: Wed Aug 20 12:38:55 2025 on pcmk-1 * Last change: Wed Aug 20 09:58:02 2025 by root via root on pcmk-1 * 2 nodes configured * 5 resource instances configured Node List: * Online: [ pcmk-1 pcmk-2 ] Full List of Resources: * ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1 * Clone Set: p_DRBD-clone [p_DRBD] (promotable): * Promoted: [ pcmk-1 ] * Unpromoted: [ pcmk-2 ] * p_iSCSI_lun1 (ocf:heartbeat:iSCSILogicalUnit): Started pcmk-1 * p_iSCSITarget (ocf:heartbeat:iSCSITarget): Started pcmk-1 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled - Проверить На любом узле – проверить состояние DRBD-устройства, выполнив на любом узле команду:
Command sudo drbdadm status
Раскрыть title Пример вывода Вывод команды на ведущем узле... Блок кода dvolume role:Primary disk:UpToDate pcmk-2 role:Secondary peer-disk:UpToDate
- Проверить состояние На ведущем узле – проверить настройки iSCSI-хранилища, выполнив на ведущем узле команду:
Command sudo targetcli ls /
Раскрыть title Пример вывода Вывод команды на ведущем узле с пояснениями... Блок кода o- / ......................................................................................................................... [...] o- backstores .............................................................................................................. [...] | o- block .................................................................................................. [Storage Objects: 1] | | o- p_iSCSI_lun1 .................................................................. [/dev/drbd1 (20.0GiB) write-thru activated] | | o- alua ................................................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized] | o- fileio ................................................................................................. [Storage Objects: 0] | o- pscsi .................................................................................................. [Storage Objects: 0] | o- ramdisk ................................................................................................ [Storage Objects: 0] o- iscsi ............................................................................................................ [Targets: 1] | o- iqn.2025-08.iscsi.pcmk12 .......................................................................................... [TPGs: 1] | o- tpg1 .................................................................................................. [gen-acls, no-auth] | o- acls .......................................................................................................... [ACLs: 0] | o- luns .......................................................................................................... [LUNs: 1] | | o- lun1 ............................................................. [block/p_iSCSI_lun1 (/dev/drbd1) (default_tg_pt_gp)] | o- portals .................................................................................................... [Portals: 1] | o- 10.192.1.100:3260 ................................................................................................ [OK] o- loopback ......................................................................................................... [Targets: 0] o- vhost ............................................................................................................ [Targets: 0] o- xen-pvscsi ....................................................................................................... [Targets: 0]
ПроверитьВывод команды показывает, что:
- объект хранения
/backstores/block/p_iSCSI_lun1привязан к DRBD-диску/dev/drbd1; - создана iSCSI-цель
/iscsi/iqn.2025-08.iscsi.pcmk12; - для группы
/iscsi/iqn.2025-08.iscsi.pcmk12/tpg1указаны настройки доступа[gen-acls, no-auth]; - логическая единица
/iscsi/iqn.2025-08.iscsi.pcmk12/tpg1/luns/lun1 привязана к объекту хранения block/p_iSCSI_lun1; - создан портал
/iscsi/iqn.2025-08.iscsi.pcmk12/tpg1/portals/10.192.1.100:3260.
- объект хранения
Разделение DRBD-устройства на части
При сетевых сбоях распределённое DRBD-устройство может разделиться на отдельные части, между которыми отсутствует синхронизация данныхне связанные между собой.
В этом случае в выводе команды "sudo drbdadm status" будет отображено, что соединение имеет статус с противоположным узлом находится в состоянии "StandAlone":
- на ведущем DRBD-ресурсеузле с ведущим DRBD-ресурсом (pcmk-2):
Блок кода dvolume role:Primary disk:UpToDate pcmk-1 connection:StandAlone
- на подчинённом DRBD-ресурсе на узле с подчинённым DRBD-ресурсом (pcmk-1):
Блок кода dvolume role:Secondary disk:UpToDate pcmk-2 connection:StandAlone
...
Чтобы объединить отдельные части в одно DRBD-устройство, необходимо выполнить на каждом узле команду:
| Command |
|---|
sudo drbdadm connect dvolume |
Подключение к кластерному iSCSI-хранилищу данных
...
Если произошла рассинхронизация данных на DRBD-устройствах, то тогда на узле с подчинённым DRBD-устройством выполнить команду:
| Command |
|---|
sudo drbdadm connect --discard-my-data dvolume |
