Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Секция
Столбец

Оглавление
stylenone

Столбец
Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).

Введение

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

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

Кластер состоит из двух узлов: ведущего и подчинённого. Роль ведущего может выполнять любой узел (на рисунке ниже ведущим является узел pcmk-1 и , а подчинённым – pcmk-2).

Примечание

Термины "ведущий узел кластера" и "подчинённый узел кластера" используются только в рамках описываемого кластера iSCSI-хранилища. Сам по себе кластер Pacemaker не делит узлы на ведущие и подчинённые, для него все узлы равноправны.

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

  • есть диск /dev/vdb (на компьютере и в виртуальной машине VirtualBox это будет диск /dev/sdb);
  • поверх диска /dev/vdb работает DRBD-устройство;
  • поверх DRBD-устройства работает iSCSI-сервер.

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

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

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

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

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


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

...

Название узлаIP-адресНазначение

10.192.1.100/16
Виртуальный IP-адрес кластера
pcmk-110.192.6.74/16
Первый узел кластера
pcmk-210.192.6.75/16
Второй узел кластера10.192.1.100/16
Виртуальный IP-адрес кластера

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

...

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

Разрешение имён

Задать имена узлов и настроить разрешение имён в соответствии со статьёй "Настройка разрешения имен и статических IP-адресов".

При тестовом создании кластера можно настроить разрешение имён с помощью файла /etc/hosts:

  1. На каждом узле

...

  1. добавить в файл /etc/hosts строки:
    Блок кода
    10.192.6.74 pcmk-1
    10.192.6.75 pcmk-2
  2. На первом узле – установить

...

  1. имя узла pcmk-1:
    Command
    sudo hostnamectl hostname pcmk-1
  2. На втором узле – установить

...

  1. имя узла pcmk-2:
    Command
    sudo hostnamectl hostname pcmk-2

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

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

  • 7789/TCP – для работы DRBD-устройства;
  • 3260/TCP – для работы iSCSI-сервера;
  • 5405/UDP, 2224/TCP – для работы кластера Pacemaker + Сorosync.

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

...

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

...

  1. Для установки DRBD-пакетов использовать командуиспользуется команда:
    Command

    sudo apt install drbd-utils "drbd-$(uname -r)"

  2. DRBD-устройство настраивается на узлах pcmk-1 и pcmk-2 с IP-адресами, указанными в разделе "Архитектура кластера".
  3. Для создания DRBD-устройства используется блочное устройство /dev/vdb.-устройства используется блочное устройство /dev/vdb.
  4. Настраиваются глобальные настройки в файле /etc/drbd.d/global_common.conf:
    Блок кода
    global {
      usage-count no;
    }
  5. Настраивается ресурс "dvolume" с помощью конфигурационного файла Необходимо настроить ресурс "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;
      }
    }
  6. Для запуска DRBD-устройства вместо команды "sudo /etc/init.d/drbd start" использовать командуиспользуется команда:
    Command

    sudo drbdadm up dvolume

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

    sudo drbdadm primary --force all

  8. Предупреждение

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

...

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

  2. Проверить настройки ресурсного агента "p_DRBD":
    Command

    sudo pcs resource status p_DRBD

    Вывод команды:
    Блок кода
      * Clone Set: p_DRBD-clone [p_DRBD] (promotable):
        * Promoted: [ pcmk-1 ]
        * Unpromoted: [ pcmk-2 ]

iSCSI-ресурс

...

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

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

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

  4. Проверить настройки ресурсного агента "p_iSCSITarget":
    Command

    sudo pcs resource status p_iSCSITarget

    Вывод команды:
    Блок кода
      * p_iSCSITarget       (ocf:heartbeat:iSCSITarget):     Started pcmk-2
    Проверить настройки ресурсного агента агента "p_iSCSI_lun1:
    Command

    sudo pcs resource status p_iSCSI_lun1

    Вывод команды:
    Блок кода
      * p_iSCSI_lun1        (ocf:heartbeat:iSCSILogicalUnit):        Started pcmk-2

...

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

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

    sudo pcs property set stonith-enabled="false"

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

    sudo pcs resource defaults update resource-stickiness=100

...

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

...

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

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

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

    Command

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

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

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

    sudo pcs cluster stop --all

    Command

    sudo pcs cluster start --all

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

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

Все ресурсы кластера запускаются на каком-то одном узле – на ведущем узле кластера.

Когда отключается ведущий узел, ресурсы запускаются на втором узле. Второй узел становится ведущим узлом кластера. При восстановлении работы первого узла ресурсы остаются работать на втором узле.


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

...

Порядок проверкиведущего узла:

  1. Определить, на каком узле запущены ресурсы, т.е. какой узел кластера является ведущим:
    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
    
  2. Пусть Рассмотрим случай, когда ведущим узлом будет является первый узел кластера pcmk-1.
  3. На любом узле – остановить ведущий узел кластера:
    Command

    sudo pcs cluster stop pcmk-1

  4. На втором узле – проверить, что ведущим узлом кластера стал второй узел все ресурсы перемещены с первого на второй узел pcmk-2:
    Command

    sudo pcs status

    Раскрыть
    titleВ выводе команды отобразится, что первый узел pcmk-1 отключён, а ресурсы запущены на втором узле pcmk-2Вывод команды...
    Блок кода
    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
  5. На любом узлевключить обратно запустить обратно первый узел кластера:
    Command

    sudo pcs cluster start pcmk-1

  6. На любом узле – проверить, что оба узла кластера работают и ведущим остался второй узел кластеравсе ресурсы остались на втором узле:
    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):         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

...

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

  1. Запустить кластер на На каждом узле (на котором кластер не запущен) командой– запустить кластер:
    Command

    sudo pcs cluster start

    Дождаться окончания запуска кластера на обоих узлах, что может занять несколько десятков секунд.
  2. ПроверитьНа любом узле – проверить, что все ресурсы запущены на каком-то одном узле кластера, выполнив на любом узле команду:
    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
  3. Проверить На любом узле – проверить состояние DRBD-устройства, выполнив на любом узле команду:
    Command

    sudo drbdadm status

    Раскрыть
    titleПример вывода Вывод команды на ведущем узле...
    Блок кода
    dvolume role:Primary
     disk:UpToDate
     pcmk-2 role:Secondary
       peer-disk:UpToDate
  4. Проверить состояние На ведущем узле – проверить настройки 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-ресурсересурсом (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

Если произошла рассинхронизация данных на DRBD-устройствах, то тогда на узле с подчинённым DRBD-устройством выполнить команду:

Command

sudo drbdadm connect --discard-my-data dvolume