Настройка Linux кластера на Shared DAS и ZFS

в 12:59, , рубрики: corosync, etegro, iscsi-target, linux, open source, pacemaker, Shared DAS, zfs, Блог компании ETegro Technologies, ит-инфраструктура, кластер, хранение данных, метки:

Этим материалом мы открываем цикл статей, посвященных технологии Shared DAS и ее использованию в ОС GNULinux.

В первой статье цикла описывается создание простейшего двух-узлового кластера высокой надежности и создание на его базе отказоустойчивой iSCSI-СХД с ZFS.

Настройка Linux кластера на Shared DAS и ZFS - 1

Архитектура

Аппаратная часть

В качестве наиболее простого примера требуемой архитектуры можно привести два сервера, подключенные к одной дисковой полке (JBOD) внешними SAS HBA контроллерами.

Настройка Linux кластера на Shared DAS и ZFS - 2
Простейший двухузловой кластер

Аналогичными по своей сути являются решения типа кластер в коробке (Cluster-in-Box). Это тоже пара серверов, подключенных к одному JBOD, но объединенные в одном корпусе. Примеры таких устройств мы описывали.

Настройка Linux кластера на Shared DAS и ZFS - 3
Cluster-in-Box

Подобное решение используется в качестве стенда для статьи.

Программная часть

Ниже даны пояснения по общей архитектуре решения снизу вверх:

  • Отказоустойчивость на уровне оборудования обеспечивается дублированием всех активных компонентов: два и более серверов; отказоустойчивое хранилище JBOD; дублированные пути SAS (multipath) и сетевые интерфейсы.
  • На уровне ОС многопутевой ввод/вывод обеспечивает демон multipathd. Объединение сетевых интерфейсов при помощи bonding/teaming.
  • Отказоустойчивость по дисковой подсистеме — ZFS. Она же управление томами, кэшированием.
  • corosync+pacemaker — инфраструктура для создания HA-кластера и управления ресурсами.

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

Обратите внимание: Следующие действия выполняются на обоих узлах

На узлах должен быть установлен GNU/Linux с OpenSSH. В этой статье описывается кластер на CentOS 7, но работать все это будет (с минимальными отличиями) и на других современных GNU/Linux системах.

Сеть

Отключение автоматики (на любителя):

systemctl stop NetworkManager
systemctl disable NetworkManager
yum erase NetworkManager*

В системе имеются три физических интерфейса 10Gbps:

  • ens11f0, ens11f1 — внешние интерфейсы. Будут объединены в team0;
  • enp130s0 — внутренний. Используется только для служебной информации corosync.

Объединение интерфейсов сделано через Team.

Внешние интерфейсы:

# cat ifcfg-ens11f0
DEVICETYPE=TeamPort
BOOTPROTO=none
USERCTL=no
ONBOOT=no
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio":100}'
NAME="ens11f0"
UUID="704d85d9-7430-4d8f-b920-792263d192ba"
HWADDR="00:8C:FA:E5:6D:E0"
# cat ifcfg-ens11f1
DEVICETYPE=TeamPort
BOOTPROTO=none
USERCTL=no
ONBOOT=no
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio":100}'
NAME=ens11f1
UUID=4bd90873-9097-442a-8ac8-7971756b0fc5
HWADDR=00:8C:FA:E5:6D:E1

team0 интерфейс:

# cat ./ifcfg-team0
DEVICE=team0
DEVICETYPE=Team
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
IPADDR=10.3.254.64
NETMASK=255.255.255.0
GATEWAY=10.3.254.1
DNS1=192.168.10.107
TEAM_CONFIG='{"runner":{"name":"activebackup"},"link_watch":{"name":"ethtool"}}'

Внутренний:

# cat ./ifcfg-enp130s0
TYPE=Ethernet
BOOTPROTO=none
NAME=enp130s0
UUID=2933ee35-eb16-485e-b65c-e186d772b480
ONBOOT=yes
HWADDR=00:8C:FA:CE:56:DB
IPADDR=172.30.0.1
PREFIX=28

/etc/hosts

# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

172.30.0.1 node1
172.30.0.2 node2

10.3.254.64 node1-ext
10.3.254.12 node2-ext

Примечания

При первоначальной настройке рекомендуется отключить файрвол:

systemctl stop firewalld
systemctl disable firewalld

Multipath

При подключении к SAS HBA контроллерам более чем одним путем, блочные устройства будут задублированы. Для работы с ними используется демон multipathd.

yum install device-mapper-multipath.x86_64

touch /etc/multipath.conf
systemctl start multipathd
systemctl enable multipathd

Если все правильно, то результат

multipath -l

должен быть примерно таким:

35000c50077ad9a3f dm-6 SEAGATE ,ST2000NX0263
size=1.8T features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=active
| `- 0:0:0:0 sdb 8:16 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
`- 0:0:6:0 sdg 8:96 active undef running
35000c50077580317 dm-4 SEAGATE ,ST2000NX0273
size=1.8T features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=active
| `- 0:0:1:0 sdc 8:32 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
`- 0:0:7:0 sdh 8:112 active undef running

К самим устройствам следует обращаться через устройства типа:

/dev/mapper/35000c50077580317
/dev/mapper/35000c50077ad9287
/dev/mapper/35000c50077ad9a3f
/dev/mapper/35000c50077ad8aab
/dev/mapper/35000c50077ad92ef

ZFS

ZFS выбрана в качестве альтернативы связки MD+LVM. Это уменьшает количество типов ресурсов для heartbeat и упрощает управление. Можно использовать как блочный доступ (iSCSI), так и файловый (NFS), доступны такие функции как кэширование, дедупликация без дополнительных средств и их контроля со стороны кластера.

Установка на CentOS проста — http://zfsonlinux.org/epel.html:

yum install ftp://ftp.yandex.ru/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm
yum install kernel-devel zfs

После установки создаются пул, необходимый том. Пул экспортируется.

zpool create -o cachefile=none pool72 raidz1 /dev/mapper/35000c50077*
zfs create -s -V 1T pool72/vol1T
zpool export pool72

Том в дальнейшем будет отдаваться по iSCSI. Заранее неизвестно, какие данные и метаинформация будет хранится на этом томе, поэтому лучше сделать так, чтобы udev не смотрел на эти тома:

cp /lib/udev/rules.d/60-persistent-storage.rules /etc/udev/rules.d/60-persistent-storage.sed -i '1s/^/KERNEL=="zd*" SUBSYSTEM=="block" GOTO="persistent_storage_end"n/' /etc/systemctl restart systemd-udevd

iSCSI

yum install targetcli.noarch

Corosync+Pacemaker

Установка (производится на всех узлах кластера):

Необходимые пакеты:

yum install pcs fence-agents-all

Сценарии pacemaker для работы с ZFS и iSCSI:

cd /usr/lib/ocf/resource.d/heartbeat/
wget https://github.com/skiselkov/stmf-ha/raw/master/heartbeat/ZFS
wget https://github.com/ClusterLabs/resource-agents/raw/master/heartbeat/iSCSITarget
wget https://github.com/ClusterLabs/resource-agents/raw/master/heartbeat/iSCSILogicalUnit
chmod a+x ./ZFS
chmod a+x ./iSCSILogicalUnit
chmod a+x ./iSCSITarget

passwd hacluster

systemctl enable pcsd
systemctl enable corosync
systemctl enable pacemaker

systemctl start pcsd

Создание кластера (осуществляется на любом узле):

Авторизация узлов кластера:

pcs cluster auth node1 node2

Создание и старт кластера с двумя так называемыми кольцами — по внутреннему интерфейсу и внешнему:

pcs cluster setup --start --name cib node1,node1-ext node2,node2-ext

pcs status
Cluster name: cib
WARNING: no stonith devices and stonith-enabled is not false
Last updated: Thu Mar 12 14:38:37 2015
Last change: Thu Mar 12 14:38:24 2015 via crmd on node1
Current DC: NONE
2 Nodes configured
0 Resources configured

Node node1 (1): UNCLEAN (offline)
Node node2 (2): UNCLEAN (offline)

Full list of resources:

PCSD Status:
node1: Online
node2: Online

Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled

Предупреждение WARNING: no stonith devices and stonith-enabled is not false говорит о том, что не настроены STONITH ресурсы. В данном материале мы ограничимся только fencing'ом дисковой подсистемы при помощи SCSI-3 Persistant Reservation. Грубо говоря, при возникновении ситуации Split Brain один из узлов будет ограничен в записи на диски. В ресурсе указываются устройства на которых был создан пул ZFS.

pcs stonith create fence-pool72 fence_scsi 
devices="/dev/mapper/35000c50077580317, 
/dev/mapper/35000c50077ad8aab, 
/dev/mapper/35000c50077ad9287, 
/dev/mapper/35000c50077ad92ef, 
/dev/mapper/35000c50077ad9a3f" meta provides=unfencing

В рассматриваемой конфигурации кластер двух узловой и следует игнорировать политику кворума:

pcs property set no-quorum-policy=ignore

Ресурсы кластера

Ресурсы, связанные с обслуживанием одного пула, добавляются в одну группу group-pool72:

pcs resource create pool72 ZFS 
params pool="pool72" importargs="-d /dev/mapper/" 
op start timeout="90" op stop timeout="90" --group=group-pool72

iSCSI-target и LUN:

pcs resource create target-pool72 iSCSITarget 
portals="10.3.254.230" iqn="iqn.2005-05.com.etegro:cib.pool72" 
implementation="lio-t" --group group-pool72

pcs resource create lun1-pool72 iSCSILogicalUnit 
target_iqn="iqn.2005-05.com.etegro:cib.pool72" lun="1" 
path="/dev/pool72/vol1T" --group group-pool72

Здесь следует отметить, что таргет LIO использован лишь потому, что является системой по умолчанию в CentOS и не требует дополнительных пакетов. Есть много мнений на качество и производительность различных таргетов.

IP-адрес:

pcs resource create ip-pool72 IPaddr2 
ip="10.3.254.230" cidr_netmask=24 --group group-pool722

Порядок запуска ресурсов в группе:

pcs constraint order pool72 then target-pool72
pcs constraint order target-pool72 then lun1-pool72
pcs constraint order lun1-pool72 then ip-pool72

На этом на сегодня всё. Пишите пожелания, дополнения, вопросы.

Автор: ETegro_Technologies

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js