Введение

Перед выполнением действий из данной статьи необходимо настроить кластер в соответствии со статьёй "Развертывание двухузлового кластера pacemaker".

В статье описано создание iSCSI-хранилища данных на основе двухузлового кластера Pacemaker. Главная цель кластера, чтобы iSCSI-хранилище всегда было доступно для клиентов.


!!!! не используется fencing (STONITH) !!!


Термины

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-адресНазначение

192.168.23.100Виртуальный IP-адрес кластера iSCSI-хранилища
pcmk-1192.168.23.101Первый узел кластера
pcmk-2192.168.23.102Второй узел кластера


Предварительная настройка

На каждом узле – для разрешения имён добавить в файл /etc/hosts строки:

192.168.23.101 pcmk-1
192.168.23.102 pcmk-2

На узле pcmk-1 – установить название узла:

sudo hostnamectl hostname pcmk-1

На узле pcmk-2 – установить название узла:

sudo hostnamectl hostname pcmk-2


На каждом узле – для работы DRBD сетевой экран (если используется) должен пропускать входящие и исходящие TCP-пакеты на порте 7789.

На каждом узле – для работы iSCSI-target сетевой экран (если используется) должен пропускать входящие и исходящие TCP-пакеты на порте 3260.

Установка ПО

На каждом узле необходимо:

Установить пакеты с DRBD-утилитами и drbd-модулем ядра, соответствующим версии загруженного ядра.

sudo apt install drbd-utils drbd-`uname -r`


Установить пакет для настройки SCSI-сервера (target):

sudo apt install targetcli-fb




Настройка кластера

DRBD

DRBD-устройство состоит из двух дисков – по одному на каждом узле. Запись и чтение осуществляется только на ведущий диск (Primary). Ведомый диск (Secondary) только синхронизируется с ведущим.

DRBD-устройство должно управляться только кластером Pacemaker, т. е. не должна использоваться служба systemd.


На каждом узле – создать конфигурационный файл /etc/drbd.d/dvolume.res, содержащий настройки ресурса dvolume:

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 drbdadm create-md dvolume

Вывод команды:

initializing activity log
initializing bitmap (640 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.

Загрузить модуль ядра для работы с DRBD:

sudo modprobe drbd

Включить автозагрузку модуля ядра DRBD при загрузке ОС:

echo drbd | sudo tee /etc/modules-load.d/drbd.conf


На каждом узле –включить DRBD-диск:

sudo drbdadm up dvolume

Проверить состояние DRBD-диска:

sudo drbdadm status

В выводе команды на первом узле будет ... - при не запущенном втором:

dvolume role:Secondary
  disk:Inconsistent
  pcmk-2 connection:Connecting

В выводе команды на первом узле будет при запущенном DRBD на втором узле:

dvolume role:Secondary
  disk:Inconsistent
  pcmk-2 role:Secondary
    disk:Inconsistent



На каждом узле –проверить, что появилось блочное устройство /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


Теперь DRBD состоит из двух локальных дисков /dev/vdb и сетевого соединения между ними.


Необходимо синхронизировать DRBD-диски узлов.

Для этого – На первом узле (В данном случае) – сделать DRBD-диск первого узла ведущим:

sudo drbdadm primary --force dvolume

Начнётся синхронизация дисков на двух узлах:

sudo drbdadm status

Вывод команды:

dvolume role:Primary
 disk:UpToDate
 pcmk-2 role:Secondary
   replication:SyncSource peer-disk:Inconsistent done:1.03


Для отлеживания процесса синхронизации дисков можно использовать команду:

sudo drbdsetup events2

Вывод команды:

exists resource name:dvolume role:Primary suspended:no force-io-failures:no may_promote:no promotion_score:10101
exists connection name:dvolume peer-node-id:1 conn-name:pcmk-2 connection:Connected role:Secondary
exists device name:dvolume volume:0 minor:1 backing_dev:/dev/vdb disk:UpToDate client:no quorum:yes
exists peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 replication:SyncSource peer-disk:Inconsistent peer-client:no resync-suspended:no done:72.16
exists path name:dvolume peer-node-id:1 conn-name:pcmk-2 local:ipv4:10.192.6.74:7789 peer:ipv4:10.192.6.75:7789 established:yes
exists -
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 done:0.86
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 done:1.27
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 done:2.67
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 done:4.08
...
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 done:99.86
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0
change resource name:dvolume may_promote:no promotion_score:10102
change peer-device name:dvolume peer-node-id:1 conn-name:pcmk-2 volume:0 replication:Established peer-disk:UpToDate peer-client:no

Для завершения команды нажать <CTRL+C>.


На первом узле – когда диски полностью синхронизированы:

sudo drbdadm status

Вывод команды:

dvolume role:Primary
  disk:UpToDate
  pcmk-2 role:Secondary
    peer-disk:UpToDate



Настройка iSCSI-сервера

Настройка без ограничения доступа со стороны клиентов.


На первом узле pcmk-1, на котором DRBD = Primary:


Запустить оболочку по управлению iSCSI-объектами:

sudo targetcli

Вывод команды:

targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> 


Далее команды выполняются внутри оболочки.


Зарегистрировать блочное DRBD-устройство /dev/drbd1 в качестве ... под именем, например, storage01:

Перейти в каталог /backstores/block:

--- /> cd /backstores/block


> /backstores/block create storage01 /dev/drbd1

Вывод:

Created block storage object storage01 using /dev/drbd1.


Создать iSCSI-target:

Перейти в каталог /iscsi:

----- /backstores/block> cd /iscsi 


> /iscsi create

Вывод:

Created target iqn.2003-01.org.linux-iscsi.pcmk-1.x8664:sn.6425f3536d03.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.



Создать LUN – блочное устройство, :

Перейти в каталог luns из /iscsi/<iSCSI-target>:

>cd /iscsi/iqn.2003-01.org.linux-iscsi.pcmk-1.x8664:sn.56c2d5f061b1/tpg1/luns


/iscsi/iqn.20...d03/tpg1/luns> create /backstores/block/storage01

Вывод:

Created LUN 0.


Проверить созданные устройства:

...> ls /

Вывод:

o- / ......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- block .................................................................................................. [Storage Objects: 1]
  | | o- storage01 ..................................................................... [/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.2003-01.org.linux-iscsi.pcmk-1.x8664:sn.56c2d5f061b1 .......................................................... [TPGs: 1]
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]
  |     o- acls .......................................................................................................... [ACLs: 0]
  |     o- luns .......................................................................................................... [LUNs: 1]
  |     | o- lun0 ................................................................ [block/storage01 (/dev/drbd1) (default_tg_pt_gp)]
  |     o- portals .................................................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]
  o- loopback ......................................................................................................... [Targets: 0]
  o- vhost ............................................................................................................ [Targets: 0]
  o- xen-pvscsi


> cd /

> saveconfig

> exit

---

Although by default targetcli saves the running configuration upon exit, a distribution-specific service must be enabled to restore the saved configuration on reboot. See distribution documentation for specifics, but for example:

$ sudo systemctl enable target.service

---


Отключение контроля доступа   – из https://wiki.astralinux.ru/x/h8COEg

/iscsi/iqn.2003-01.org.linux-iscsi.pcmk-1.x8664:sn.56c2d5f061b1/tpg1 set attribute generate_node_acls=1


!!!!! Переход Portal 0.0.0.0:3260



Pacemaker + DRBD

На узле, где DRBD = Primary :


Создать ресурсного агента для управления DRBD-диском (DRBD-ресурс "iscsi_data"):

sudo pcs resource create "p_DRBD" ocf:linbit:drbd drbd_resource="iscsi_data" op monitor interval=29s role="Promoted" op monitor interval=31s role="Unpromoted"

Настроить ресурсного агента для управления DRBD-диском:

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

Вывод команды:

  * ClusterIP   (ocf:heartbeat:IPaddr2):         Started pcmk-1
  * Clone Set: p_DRBD-clone [drbd_iscsi] (promotable):
    * Promoted: [ pcmk-1 ]
    * Unpromoted: [ pcmk-2 ]



Pacemaker + iSCSI Target

На узле, где DRBD = Primary :


Создать ресурсного агента для управления iSCSI-Target:

sudo pcs resource create "p_iSCSITarget" ocf:heartbeat:iSCSITarget iqn="iqn.2025-08.iscsi.pcmk12" portals="0.0.0.0:3260" op monitor interval="10s"


Настроить ресурсного агента для управления iSCSI-диском 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"


!!!!! Переход Portal 0.0.0.0:3260



sudo pcs resource status

Вывод команды:

Full List of Resources:
  * ClusterIP   (ocf:heartbeat:IPaddr2):         Started pcmk-1
  * p_iSCSITarget       (ocf:heartbeat:iSCSITarget):     Started pcmk-1
  * Clone Set: p_DRBD-clone [p_DRBD] (promotable):
    * Promoted: [ pcmk-1 ]
    * Unpromoted: [ pcmk-2 ] 



Настройка ограничений на запуск ресурсов кластера Pacemaker

На любом работающем узле кластера:


Настроить кластер, чтобы:

Для этого на любом работающем узле кластера:

  1. Задать ограничения на запуск ресурса "p_iSCSITarget":

    sudo pcs constraint colocation add "p_iSCSITarget" with Promoted "p_DRBD-clone"

    sudo pcs constraint order promote "p_DRBD-clone" then start "p_iSCSITarget"

    Adding p_DRBD-clone p_iSCSITarget (kind: Mandatory) (Options: first-action=promote then-action=start)
  2. Задать ограничения на запуск ресурса "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"

    Adding p_iSCSITarget p_iSCSI_lun1 (kind: Mandatory) (Options: first-action=start then-action=start)
  3. Задать ограничения на запуск ресурса "ClusterIP": 

    sudo pcs constraint colocation add "ClusterIP" with "p_iSCSI_lun1" INFINITY

    sudo pcs constraint order "p_iSCSI_lun1" then "ClusterIP"

    Adding p_iSCSI_lun1 ClusterIP (kind: Mandatory) (Options: first-action=start then-action=start)
  4. Проверить созданные ограничения:
    sudo pcs constraint
    Вывод:
    Location Constraints:
    Ordering Constraints:
      promote p_DRBD-clone then start p_iSCSITarget (kind:Mandatory)
      start p_iSCSITarget then start p_iSCSI_lun1 (kind:Mandatory)
      start p_iSCSI_lun1 then start ClusterIP (kind:Mandatory)
    Colocation Constraints:
      ClusterIP with p_iSCSI_lun1 (score:INFINITY)
      p_iSCSITarget with p_DRBD-clone (score:INFINITY) (rsc-role:Started) (with-rsc-role:Promoted)
      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 ]


Возможные проблемы и способы их решения

Запуск и проверка состояния кластера

После остановки или сбоя в работе кластера необходимо:

  1. Запустить кластер на каждом узле, на котором кластер не запущен, командой:

    sudo pcs cluster start

  2. Дождаться окончания запуска кластера на обоих узлах, что может занять несколько десятков секунд.
  3. Проверить состояние кластера, выполнив на каждом узле команды:

    sudo pcs status

    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

    sudo drbdadm status

    dvolume role:Primary
     disk:UpToDate
     pcmk-2 role:Secondary
       peer-disk:UpToDate

Разделение DRBD-устройства на части

При сетевых сбоях DRBD-устройство может разделиться на отдельные части, между которыми отсутствует синхронизация данных.

В этом случае в выводе команды "sudo drbdadm status" будет отображено, что соединение имеет статус "StandAlone":


Чтобы объединить отдельные части в одно DRBD-устройство, необходимо выполнить на каждом узле команду:

sudo drbdadm connect dvolume

Подключение к кластерному iSCSI-хранилищу данных