В статье описано создание iSCSI-хранилища данных на основе двухузлового кластера Pacemaker. Главная цель кластера, чтобы iSCSI-хранилище всегда было доступно для клиентов.
iSCSI (Internet Small Computer System Interface) – протокол для работы c хранилищем данных через сеть Ethernet (поверх TCP/IP) с использованием SCSI-команд.
SCSI-target – SCSI-цель – в зависимости от контекста это либо сервер, предоставляющий доступ к устройству хранения данных, либо объект, экспортируемый устройством хранения. Объект может делиться на логические единицы (LU).
SCSI-initiator – SCSI-инициатор – клиент, использующий SCSI-хранилище для хранения данных.
LU (logical unit) – логическая единица iSCSI-объекта. Является аналогом блочного SCSI-устройства. Может использоваться: для разбиения на разделы, для хранения файловой системы, для хранения данных в "сыром" виде и т. п.
!!! Logical unit number (LUN) is a physical device that is backed by the iSCSI backstore. Each LUN has a unique number
DRBD (Distributed Replicated Block Device) – распределённая система хранения, которая зеркалирует блочные устройства компьютеров через сеть Ethernet. Зеркалироваться могут жёсткие диски, разделы дисков и т. п.
Кластер состоит из двух узлов: pcmk-1 и pcmk-2.
На каждом узле:
поверх физического диска /dev/vdb запущена распределённая система хранения DRBD;
В нормальном режиме работы кластера: один узел является ведущим, второй – вторичным.
Кластер имеет виртуальный IP-адрес 192.168.23.100, который физически принадлежит ведущему узлу.
Ресурсы: ведущий DRBD-диск, SCSI-target – активны на ведущем узле кластера.

Рисунок 1. Архитектура iSCSI-хранилища на основе двухузлового кластера
Кластер и его узлы:
| Название узла | IP-адрес | Назначение |
|---|---|---|
| pcmk-1 | 10.192.6.74/16 | Первый узел кластера |
| pcmk-2 | 10.192.6.75/16 | Второй узел кластера |
| 10.192.1.100/16 | Виртуальный IP-адрес кластера iSCSI-хранилища |
На каждом узле – для разрешения имён добавить в файл /etc/hosts строки:
192.168.23.101 pcmk-1 192.168.23.102 pcmk-2 |
На первом узле – установить название узла pcmk-1:
|
На втором узле – установить название узла pcmk-2:
|
Если используется сетевой экран, то должно быть обеспечено прохождение пакетов:
Настроить кластер в соответствии со статьёй "Развертывание двухузлового кластера pacemaker".
При настройке необходимо использовать IP-адреса:
| Название узла | IP-адрес | Назначение |
|---|---|---|
| pcmk-1 | 10.192.6.74/16 | Первый узел кластера |
| pcmk-2 | 10.192.6.75/16 | Второй узел кластера |
| 10.192.1.100/16 | Виртуальный IP-адрес кластера (используется при создании ресурса ClusterIP) |
Настроить DRBD-устройство в соответствии со статьёй "Стандартная настройка DRBD (Astra Linux 1.6)".
При настройке учесть, что для создания 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;
}
} |
На каждом узле –проверить, что появилось блочное устройство /dev/drbd1:
sudo lsblk |
В выводе команды должен появиться диск drbd1:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sr0 11:0 1 6,8G 0 rom vda 252:0 0 20G 0 disk ├─vda1 252:1 0 1M 0 part └─vda2 252:2 0 20G 0 part / vdb 252:16 0 20G 0 disk └─drbd1 147:1 0 20G 0 disk |
На первом узле – когда диски полностью синхронизированы:
sudo drbdadm status |
Вывод команды:
dvolume role:Primary
disk:UpToDate
pcmk-2 role:Secondary
peer-disk:UpToDate |
Установить пакет для настройки SCSI-сервера (target):
|
На ведущем узле кластера (т. е. на узле с ведущим 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" |
sudo pcs resource promotable "p_DRBD" promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify="true" |
sudo pcs resource status p_DRBD |
* Clone Set: p_DRBD-clone [p_DRBD] (promotable):
* Promoted: [ pcmk-1 ]
* Unpromoted: [ pcmk-2 ] |
iSCSI-сервер будет доступен iSCSI-клиентам без аутентификации. |
На ведущем узле кластера (т. е. на узле с ведущим DRBD -устройством):
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" |
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" |
sudo pcs resource |
... * p_iSCSI_lun1 (ocf:heartbeat:iSCSILogicalUnit): Started pcmk-1 * p_iSCSITarget (ocf:heartbeat:iSCSITarget): Started pcmk-1 |
На любом работающем узле кластера:
sudo pcs property set stonith-enabled="false" |
sudo pcs resource defaults update resource-stickiness=100 |
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 |
sudo pcs resource defaults |
Meta Attrs: rsc_defaults-meta_attributes resource-stickiness=100 |
Все ресурсы кластера должны работать на одном узле и запускаться по порядку: первичный "p_DRBD", "ClusterIP", "p_iSCSITarget", "p_iSCSI_lun1".
Для этого на любом работающем узле кластера:
sudo pcs constraint colocation add "ClusterIP" with Promoted "p_DRBD-clone" |
sudo pcs constraint order promote "p_DRBD-clone" then start "ClusterIP" |
sudo pcs constraint colocation add "p_iSCSITarget" with "ClusterIP" INFINITY |
sudo pcs constraint order "ClusterIP" then start "p_iSCSITarget" |
sudo pcs constraint colocation add "p_iSCSI_lun1" with "p_iSCSITarget" INFINITY |
sudo pcs constraint order "p_iSCSITarget" then "p_iSCSI_lun1" |
| sudo pcs constraint |
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 status |
В выводе команды ведущий узел отобразится в строке с ресурсом 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 – проверить состояние кластера:
sudo pcs status |
В выводе команды отобразится, что узел 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 |
На любом узле – проверить, что оба узла кластера работают:
sudo pcs status |
В выводе команды отобразится, что оба узла в работе:
Node List: * Online: [ pcmk-1 pcmk-2 ] |
После остановки или сбоя в работе кластера необходимо:
sudo pcs cluster start |
sudo pcs status |
|
sudo drbdadm status |
|
sudo targetcli ls / |
Проверить, что:
|
При сетевых сбоях DRBD-устройство может разделиться на отдельные части, между которыми отсутствует синхронизация данных.
В этом случае в выводе команды "sudo drbdadm status" будет отображено, что соединение имеет статус "StandAlone":
dvolume role:Primary disk:UpToDate pcmk-1 connection:StandAlone |
dvolume role:Secondary disk:UpToDate pcmk-2 connection:StandAlone |
Чтобы объединить отдельные части в одно DRBD-устройство, необходимо выполнить на каждом узле команду:
sudo drbdadm connect dvolume |