Введение

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

Архитектура кластера

Кластер состоит из двух узлов: pcmk-1 и pcmk-2.

На каждом узле:

Кластер запускает и останавливает на узлах DRBD-устройства, iSCSI-серверы, а также управляет виртуальным IP-адресом.

Один узел кластера является ведущим, второй – подчинённым.

На ведущем узле: DRBD-устройство является ведущим, работает iSCSI-сервер. На подчинённом узле: DRBD-устройство является подчинённым, iSCSI-сервер остановлен.

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


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


Кластер и его узлы:

Название узлаIP-адресНазначение
pcmk-110.192.6.74/16
Первый узел кластера
pcmk-210.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

Сетевой экран

Если используется сетевой экран, то должно быть обеспечено прохождение пакетов:

Двухузловой кластер Pacemaker + Corosync

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

При настройке использовать IP-адреса, указанные в разделе "Архитектура кластера".

DRBD-устройство

Настроить DRBD-устройство в соответствии со статьёй "Стандартная настройка DRBD (Astra Linux 1.6)".

При настройке учесть:

  1. DRBD-устройство настраивается на узлах pcmk-1 и pcmk-2 с IP-адресами, указанными в разделе "Архитектура кластера".
  2. Для создания DRBD-устройства используется блочное устройство /dev/vdb.
  3. Необходимо настроить ресурс "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;
      }
    }
  4. Для запуска DRBD-устройства вместо команды "sudo /etc/init.d/drbd start" использовать команду:

    sudo drbdadm up dvolume

  5. Для назначения ведущим DRBD-устройством на текущем узле вместо команды "sudo drbdadm -- --overwrite-data-of-peer primary all" использовать команду:

    sudo drbdadm primary --force all

  6. Не создавать файловую систему и не монтировать DRBD-устройство.

  7. После окончания синхронизации DRBD-устройств команда на ведущем узле:

    sudo drbdadm status

    должна выводить:
    dvolume role:Primary
      disk:UpToDate
      pcmk-2 role:Secondary
        peer-disk:UpToDate

iSCSI-сервер

Для проверки настроек SCSI-сервера установить пакет:

sudo apt install targetcli-fb

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

DRBD-ресурс

На ведущем узле кластера (т. е. на узле с ведущим DRBD -устройством):

  1. Создать ресурсного агента "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"

  2. Проверить настройки ресурсного агента "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 -устройством):

  1. iSCSI-сервер будет иметь имя "iqn.2025-08.iscsi.pcmk12" и принимать запросы на порту 3260 IP-адреса 10.192.1.100.
  2. Создать ресурсного агента "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"

  3. Настроить ресурсного агента "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"

  4. Проверить настройки ресурсного агента "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

Ограничения на запуск ресурсов

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

  1. Отключить (если не отключено) STONITH, которое используется для физического отключения (обесточивания) неисправного физического диска:

    sudo pcs property set stonith-enabled="false"

  2. Предотвратить перераспределение ресурсов между узлами при восстановлении нормального режима работы кластера после аварии:

    sudo pcs resource defaults update resource-stickiness=100


Все ресурсы кластера должны работать на одном узле и запускаться по порядку: первичный "p_DRBD", "ClusterIP", "p_iSCSITarget", "p_iSCSI_lun1".

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

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

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

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

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

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

    sudo pcs constraint order "ClusterIP" then start "p_iSCSITarget"

  3. Задать ограничения на запуск ресурса "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"

  4. Проверить созданные ограничения:
    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:
  5. Перезапустить кластер, чтобы ограничения вступили в силу:

    sudo pcs cluster stop --all

    sudo pcs cluster start --all

  6. Проверить состояние кластера:

    sudo pcs status

    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
    
    

Проверка работоспособности кластера при отказе одного из узлов

Перед использованием кластера необходимо проверить его работоспособность при отказе одного из узлов.


На любом узле – определить, какой из узлов кластера является ведущим, с помощью команды:

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
  4. Проверить состояние DRBD-устройства, выполнив на любом узле команду:

    sudo drbdadm status

    dvolume role:Primary
     disk:UpToDate
     pcmk-2 role:Secondary
       peer-disk:UpToDate
  5. Проверить состояние iSCSI-хранилища, выполнив на ведущем узле команду:

    sudo targetcli ls /

    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-устройство, необходимо выполнить на каждом узле команду:

sudo drbdadm connect dvolume

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

Подключение к iSCSI-хранилищу описано в статье "Использование протокола iSCSI".