
Введение
В статье описано создание iSCSI-хранилища данных на основе двухузлового кластера Pacemaker. Главная цель кластера, чтобы iSCSI-хранилище всегда было доступно для клиентов.
Архитектура кластера
Кластер состоит из двух узлов: pcmk-1 и pcmk-2.
На каждом узле:
- есть диск /dev/vdb;
- поверх диска /dev/vdb работает DRBD-устройство;
- поверх DRBD-устройства работает iSCSI-сервер.
Кластер запускает и останавливает на узлах DRBD-устройства, iSCSI-серверы, а также управляет виртуальным IP-адресом.
Один узел кластера является ведущим, второй – подчинённым.
На ведущем узле: DRBD-устройство является ведущим, работает iSCSI-сервер. На подчинённом узле: DRBD-устройство является подчинённым, iSCSI-сервер остановлен.
iSCSI-клиенты подключаются к виртуальному адресу кластера.

Рисунок 1. Архитектура iSCSI-хранилища на основе двухузлового кластера

Кластер и его узлы:
| Название узла | IP-адрес | Назначение |
|---|
| pcmk-1 | 10.192.6.74/16
| Первый узел кластера |
| pcmk-2 | 10.192.6.75/16
| Второй узел кластера |
| 10.192.1.100/16
| Виртуальный IP-адрес кластера |
Предварительная настройка
Разрешение имён
На каждом узле – для разрешения имён добавить в файл /etc/hosts строки:
10.192.6.74 pcmk-1
10.192.6.75 pcmk-2 |
На первом узле – установить название узла pcmk-1:
sudo hostnamectl hostname pcmk-1
|
На втором узле – установить название узла pcmk-2:
sudo hostnamectl hostname pcmk-2
|
Сетевой экран
Если используется сетевой экран, то должно быть обеспечено прохождение пакетов:
- 7789/TCP – для работы DRBD-устройства;
- 3260/TCP – для работы iSCSI-сервера;
- 5405/UDP, 2224/TCP – для работы кластера Pacemaker + Сorosync.
Двухузловой кластер Pacemaker + Corosync
Настроить кластер в соответствии со статьёй "Развертывание двухузлового кластера pacemaker".
При настройке использовать IP-адреса, указанные в разделе "Архитектура кластера".
DRBD-устройство
Настроить DRBD-устройство в соответствии со статьёй "Стандартная настройка DRBD (Astra Linux 1.6)".
При настройке учесть:
- DRBD-устройство настраивается на узлах pcmk-1 и pcmk-2 с IP-адресами, указанными в разделе "Архитектура кластера".
- Для создания DRBD-устройства используется блочное устройство
/dev/vdb. - Необходимо настроить ресурс "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" использовать команду:
- Для назначения ведущим DRBD-устройством на текущем узле вместо команды "
sudo drbdadm -- --overwrite-data-of-peer primary all" использовать команду:
sudo drbdadm primary --force all
|
Не создавать файловую систему и не монтировать DRBD-устройство. |
- После окончания синхронизации DRBD-устройств команда на ведущем узле:
должна выводить:
dvolume role:Primary
disk:UpToDate
pcmk-2 role:Secondary
peer-disk:UpToDate |
iSCSI-сервер
Для проверки настроек SCSI-сервера установить пакет:
sudo apt install targetcli-fb
|
Настройка кластера
DRBD-ресурс
На ведущем узле кластера (т. е. на узле с ведущим DRBD -устройством):
- Создать ресурсного агента "p_DRBD" для управления DRBD-устройством:
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":
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-сервером:
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-диском:
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":
sudo pcs resource status p_iSCSITarget |
Вывод команды:
* p_iSCSITarget (ocf:heartbeat:iSCSITarget): Started pcmk-2 |
Проверить настройки ресурсного агента "p_iSCSI_lun1
sudo pcs resource status p_iSCSI_lun1 |
Вывод команды:
* p_iSCSI_lun1 (ocf:heartbeat:iSCSILogicalUnit): Started pcmk-2 |
Ограничения на запуск ресурсов
На любом работающем узле кластера:
- отключить (если не отключено) STONITH, которое используется для физического отключения (обесточивания) неисправного физического диска:
sudo pcs property set stonith-enabled="false" |
- предотвратить перераспределение ресурсов между узлами после того, как кластер восстановил работу в нормальном режиме после аварийного режима:
sudo pcs resource defaults update resource-stickiness=100 |
- Проверить настройки:
Вывод команды:
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 |
sudo pcs resource defaults |
Вывод команды:
Meta Attrs: rsc_defaults-meta_attributes
resource-stickiness=100 |
Все ресурсы кластера должны работать на одном узле и запускаться по порядку: первичный "p_DRBD", "ClusterIP", "p_iSCSITarget", "p_iSCSI_lun1".
Для этого на любом работающем узле кластера:
- Задать ограничения на запуск ресурса "ClusterIP":
sudo pcs constraint colocation add "ClusterIP" with Promoted "p_DRBD-clone" |
sudo pcs constraint order promote "p_DRBD-clone" then start "ClusterIP" |
- Задать ограничения на запуск ресурса "p_iSCSITarget":
sudo pcs constraint colocation add "p_iSCSITarget" with "ClusterIP" INFINITY |
sudo pcs constraint order "ClusterIP" then start "p_iSCSITarget" |
- Задать ограничения на запуск ресурса "p_iSCSI_lun1":
sudo pcs constraint colocation add "p_iSCSI_lun1" with "p_iSCSITarget" INFINITY |
sudo pcs constraint order "p_iSCSITarget" then "p_iSCSI_lun1" |
- Проверить созданные ограничения:
Вывод команды:
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: |
- Перезапустить кластер, чтобы ограничения вступили в силу:
sudo pcs cluster stop --all |
sudo pcs cluster start --all |
Проверка работоспособности кластера при отказе одного из узлов
Перед использованием кластера необходимо проверить его работоспособность при отказе одного из узлов.
На любом узле – определить, какой из узлов кластера является ведущим, с помощью команды:
В выводе команды ведущий узел отобразится в строке с ресурсом ClusterIP после слова "Started":
Full List of Resources:
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1 |
Предположим, что ведущим узлом является pcmk-1.
На любом узле – остановить узел pcmk-1 кластера:
sudo pcs cluster stop pcmk-1
|
На втором узле pcmk-2 – проверить состояние кластера:
В выводе команды отобразится, что узел pcmk-1 отключён, а ведущим узлом является pcmk-2:
Node List:
* Online: [ pcmk-2 ]
* OFFLINE: [ pcmk-1 ]
Full List of Resources:
* ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-2 |
iSCSI-хранилище должно быть доступно по своему IP-адресу 192.168.23.100.
На любом узле – включить обратно первый узел кластера pcmk-1:
sudo pcs cluster start pcmk-1 |
На любом узле – проверить, что оба узла кластера работают:
В выводе команды отобразится, что оба узла в работе:
Node List:
* Online: [ pcmk-1 pcmk-2 ] |
Возможные проблемы и способы их решения
Запуск и проверка состояния кластера
После остановки или сбоя в работе кластера необходимо:
- Запустить кластер на каждом узле (на котором кластер не запущен) командой:
- Дождаться окончания запуска кластера на обоих узлах, что может занять несколько десятков секунд.
- Проверить состояние кластера, выполнив на любом узле команду:
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-устройства, выполнив на любом узле команду:
dvolume role:Primary
disk:UpToDate
pcmk-2 role:Secondary
peer-disk:UpToDate |
|
- Проверить состояние iSCSI-хранилища, выполнив на ведущем узле команду:
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-ресурсе:
dvolume role:Primary
disk:UpToDate
pcmk-1 connection:StandAlone |
- на подчинённом DRBD-ресурсе:
dvolume role:Secondary
disk:UpToDate
pcmk-2 connection:StandAlone |
Чтобы объединить отдельные части в одно DRBD-устройство, необходимо выполнить на каждом узле команду:
sudo drbdadm connect dvolume |
Подключение к кластерному iSCSI-хранилищу данных
Подключение к iSCSI-хранилищу описано в статье "Использование протокола iSCSI".