...

четверг, 26 марта 2015 г.

Настройка 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://ift.tt/1GxjzUI:



yum install http://ift.tt/1FL86U2
yum install http://ift.tt/1ratw6F
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 http://ift.tt/1FL89iy
wget http://ift.tt/1HMrT2A
wget http://ift.tt/1FL87am
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


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


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий