| Оглавление | ||
|---|---|---|
|
Введение
| Примечание |
|---|
Перед выполнением действий из данной статьи необходимо настроить кластер в соответствии со статьёй "Развертывание двухузлового кластера 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;
- поверх DRBD-диска работает SCSI-target.
В нормальном режиме работы кластера: один узел является ведущим, второй – вторичным.
Кластер имеет виртуальный IP-адрес 192.168.23.100, который физически принадлежит ведущему узлу.
Ресурсы: ведущий DRBD-диск, SCSI-target – активны на ведущем узле кластера.
Рисунок 1. Архитектура iSCSI-хранилища на основе двухузлового кластера
Кластер и его узлы:
| Название узла | IP-адрес | Назначение |
|---|---|---|
| 192.168.23.100 | Виртуальный IP-адрес кластера iSCSI-хранилища | |
| pcmk-1 | 192.168.23.101 | Первый узел кластера |
| pcmk-2 | 192.168.23.102 | Второй узел кластера |
Предварительная настройка
На каждом узле – для разрешения имён добавить в файл /etc/hosts строки:
| Блок кода |
|---|
192.168.23.101 pcmk-1 192.168.23.102 pcmk-2 |
На узле pcmk-1 – установить название узла:
| Command |
|---|
|
На узле pcmk-2 – установить название узла:
| Command |
|---|
|
На каждом узле – для работы DRBD сетевой экран (если используется) должен пропускать входящие и исходящие TCP-пакеты на порте 7789.
На каждом узле – для работы iSCSI-target сетевой экран (если используется) должен пропускать входящие и исходящие TCP-пакеты на порте 3260.
Установка ПО
На каждом узле необходимо:
Установить пакеты с DRBD-утилитами и drbd-модулем ядра, соответствующим версии загруженного ядра.
| Command |
|---|
|
Установить пакет для настройки SCSI-сервера (target):
| Command |
|---|
|
Настройка кластера
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-диска:
| Command |
|---|
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:
| Command |
|---|
sudo modprobe drbd |
Включить автозагрузку модуля ядра DRBD при загрузке ОС:
| Command |
|---|
echo drbd | sudo tee /etc/modules-load.d/drbd.conf |
На каждом узле –включить DRBD-диск:
| Command |
|---|
sudo drbdadm up dvolume |
Проверить состояние DRBD-диска:
| Command |
|---|
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:
| Command |
|---|
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-диск первого узла ведущим:
| Command |
|---|
sudo drbdadm primary --force dvolume |
Начнётся синхронизация дисков на двух узлах:
| Command |
|---|
sudo drbdadm status |
Вывод команды:
| Блок кода |
|---|
dvolume role:Primary disk:UpToDate pcmk-2 role:Secondary replication:SyncSource peer-disk:Inconsistent done:1.03 |
Для отлеживания процесса синхронизации дисков можно использовать команду:
| Command |
|---|
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>.
На первом узле – когда диски полностью синхронизированы:
| Command |
|---|
sudo drbdadm status |
Вывод команды:
| Блок кода |
|---|
dvolume role:Primary
disk:UpToDate
pcmk-2 role:Secondary
peer-disk:UpToDate |
Настройка iSCSI-сервера
Настройка без ограничения доступа со стороны клиентов.
На первом узле pcmk-1, на котором DRBD = Primary:
Запустить оболочку по управлению iSCSI-объектами:
| Command |
|---|
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:
| Command |
|---|
--- /> cd /backstores/block |
| Command |
|---|
> /backstores/block create storage01 /dev/drbd1 |
Вывод:
| Блок кода |
|---|
Created block storage object storage01 using /dev/drbd1. |
Создать iSCSI-target:
Перейти в каталог /iscsi:
| Command |
|---|
----- /backstores/block> cd /iscsi |
| Command |
|---|
> /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>:
| Command |
|---|
>cd /iscsi/iqn.2003-01.org.linux-iscsi.pcmk-1.x8664:sn.56c2d5f061b1/tpg1/luns |
| Command |
|---|
/iscsi/iqn.20...d03/tpg1/luns> create /backstores/block/storage01 |
Вывод:
| Блок кода |
|---|
Created LUN 0. |
Проверить созданные устройства:
| Command |
|---|
...> 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
| Command |
|---|
/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"):
| Command |
|---|
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-диском:
| Command |
|---|
sudo pcs resource promotable "p_DRBD" promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify="true" |
| Command |
|---|
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:
| Command |
|---|
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:
| 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" |
!!!!! Переход Portal 0.0.0.0:3260
| Command |
|---|
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
На любом работающем узле кластера:
- Отключить (если ещё не отключено) STONITH, которое используется для физического отключения (обесточивания) неисправного физического диска:
Command sudo pcs property set stonith-enabled="false"
- Предотвратить перераспределение ресурсов между узлами после того, как кластер восстановил работу в нормальном режиме с двумя узлами:
Command sudo pcs resource defaults update resource-stickiness=100
Настроить кластер, чтобы:
- все ресурсы работали на одном узле вместе с первичным ресурсом DRBD.
- ресурсы запускались по порядку: первичный DRBD, iSCSI-target, iSCSI-lun, ClusterIP.
Для этого на любом работающем узле кластера:
- Задать ограничения на запуск ресурса "p_iSCSITarget":
Command sudo pcs constraint colocation add "p_iSCSITarget" with Promoted "p_DRBD-clone"
Command 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)
- Задать ограничения на запуск ресурса "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"
Блок кода Adding p_iSCSITarget p_iSCSI_lun1 (kind: Mandatory) (Options: first-action=start then-action=start)
- Задать ограничения на запуск ресурса "ClusterIP":
Command sudo pcs constraint colocation add "ClusterIP" with "p_iSCSI_lun1" INFINITY
Command sudo pcs constraint order "p_iSCSI_lun1" then "ClusterIP"
Блок кода Adding p_iSCSI_lun1 ClusterIP (kind: Mandatory) (Options: first-action=start then-action=start)
- Проверить созданные ограничения:
Вывод:Command 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:
Проверка работоспособности кластера при отказе одного из узлов
Перед использованием кластера необходимо проверить его работоспособность при отказе одного из узлов.
На любом узле – определить, какой из узлов кластера является ведущим, с помощью команды:
| Command |
|---|
sudo pcs status |
В выводе команды ведущий узел отобразится в строке с ресурсом ClusterIP после слова "Started":
| Блок кода |
|---|
Full List of Resources: * ClusterIP (ocf:heartbeat:IPaddr2): Started pcmk-1 |
Предположим, что ведущим узлом является pcmk-1.
На любом узле – остановить узел pcmk-1 кластера:
| Command |
|---|
sudo pcs cluster stop pcmk-1 |
На втором узле pcmk-2 – проверить состояние кластера:
| Command |
|---|
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:
| Command |
|---|
sudo pcs cluster start pcmk-1 |
На любом узле – проверить, что оба узла кластера работают:
| Command |
|---|
sudo pcs status |
В выводе команды отобразится, что оба узла в работе:
| Блок кода |
|---|
Node List: * Online: [ pcmk-1 pcmk-2 ] |
Возможные проблемы и способы их решения
Запуск и проверка состояния кластера
После остановки или сбоя в работе кластера необходимо:
- Запустить кластер на каждом узле, на котором кластер не запущен, командой:
Command sudo pcs cluster start
- Дождаться окончания запуска кластера на обоих узлах, что может занять несколько десятков секунд.
- Проверить состояние кластера, выполнив на каждом узле команды:
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/enabledCommand sudo drbdadm status
Раскрыть title Пример вывода команды на ведущем узле Блок кода dvolume role:Primary disk:UpToDate pcmk-2 role:Secondary peer-disk:UpToDate
Разделение 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-устройство, необходимо выполнить на каждом узле команду:
| Command |
|---|
sudo drbdadm connect dvolume |
