Настройка 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 

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

ссылка на оригинал статьи http://habrahabr.ru/post/254083/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *