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