Этим материалом мы открываем цикл статей, посвященных технологии Shared DAS и ее использованию в ОС GNULinux.
В первой статье цикла описывается создание простейшего двух-узлового кластера высокой надежности и создание на его базе отказоустойчивой iSCSI-СХД с ZFS.
Архитектура
Аппаратная часть
В качестве наиболее простого примера требуемой архитектуры можно привести два сервера, подключенные к одной дисковой полке (JBOD) внешними SAS HBA контроллерами.
Простейший двухузловой кластер
Аналогичными по своей сути являются решения типа кластер в коробке (Cluster-in-Box). Это тоже пара серверов, подключенных к одному JBOD, но объединенные в одном корпусе. Примеры таких устройств мы описывали.
Подобное решение используется в качестве стенда для статьи.
Программная часть
Ниже даны пояснения по общей архитектуре решения снизу вверх:
- Отказоустойчивость на уровне оборудования обеспечивается дублированием всех активных компонентов: два и более серверов; отказоустойчивое хранилище 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