Доброго времени суток, хабровчане. Поступила задача — развернуть отказоустойчивое High Available хранилище по средствам pacamaker + drbd (в режиме dual primary) + clvmd + ctdb, которое будет монтироваться на сервер. Оговорюсь, что со всеми этими инструментами я сталкиваюсь впервые и буду рад критике и дополнениям\исправлениям. В интернете инструкций конкретно по этой связке либо нет, либо информация устарела. Эта рабочая на данный момент, но есть одна проблема, решение которой, я надеюсь найти в ближайшее время. Все действия нужно выполнять на обоих нодах, если не указано обратное.
Приступим. У нас есть две виртуальные машины на CentOS 7.
1) Для надежности знакомим их в /etc/hosts
2) В стандартных репозиториях DRBD нет, поэтому надо подключить стороннюю.
3) Устанавливаем drbd версии 8.4 (у меня не получилось завести 9.0 в режиме dual primary )
4) Активируем и включаем в автозагрузку модуль ядра drbd
5) Создаем конфигурационный файл ресурса drbd /etc/drbd.d/r0.res
6) Отключаем юнит drbd (позже его за него будет отвечать pacemaker), создаем метаданные для диска drbd, поднимаем ресурс
7) На первой ноде делаем ресурс первичным
8) Ставим pacemaker
9) Устанавливаем пароль для пользователя hacluster для авторизации на нодах
10) Запускаем pacemaker на обоих нодах
11) Авторизуемся в кластере. C этого этапа делаем все на одной ноде
12) Создаем кластер с именем samba_cluster
13) активируем ноды
14) Так как в качестве серверов у нас выступают виртуальные машины, то отключаем механизм STONITH
15) Создаем VIP
16) Создаем ресурс drbd
17) Устанавливаем необходимые пакеты для clvm и подготавливаем clvm
18) Добавляем ресурс dlm и clvd в pacemaker
19) На это этапе запуск clvmd и dlm должен выдать ошибку. Заходим на веб интерфейс pacemaker 192.168.0.1:2224. Если кластер не появился, то добавляем его «Edd existing». Далее переходим Resources — dlm — optional arguments и выставляем значение allow_stonith_disabled = true
20) Задаем очередь загрузки ресурсов
21) Запрещаем LVM писать кэш и очищаем его. На обоих нодах
22) Редактируем /etc/lvm/lvm.conf чтоб lvm не видел /dev/sdb. На обоих нодах
23) Создаем CLVM раздел. Делаем только на одной ноде
24) Размечаем раздел в gfs2
25) Дальше добавляем монтирование этого раздела в pacemaker и говорим ему грузиться после clvmd
26) Теперь наcтал черед ctdb, который будет запускать samba
27) Правим конфиг /etc/ctdb/ctdbd.conf
28) Создаем файл со списком нод. ВНИМАНИЕ! После каждого айпишника в списке нод, должен присутствовать перевод строки. Иначе нода будет фэйлится при инициализации.
29) Добавляем к конфигу /etc/samba/smb.conf
30) И наконец создаем ресурс ctdb и указываем, что он должен грузиться после
А теперь о проблеме, которую я пока не решил. Если ребутнуть ноду, то вся связка рушится, так как drbd нужно время чтобы активировать /dev/drbd0. DLM не видит раздела, так как он еще не активирован и не стартует и т.д. Временное решение — активировать раздел вручную и перезапустить ресурсы pacemaker
Приступим. У нас есть две виртуальные машины на CentOS 7.
1) Для надежности знакомим их в /etc/hosts
192.168.0.1 node1
192.168.0.2 node2
2) В стандартных репозиториях DRBD нет, поэтому надо подключить стороннюю.
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
3) Устанавливаем drbd версии 8.4 (у меня не получилось завести 9.0 в режиме dual primary )
yum install -y kmod-drbd84 drbd84-utils
4) Активируем и включаем в автозагрузку модуль ядра drbd
modprobe drbd
echo drbd > /etc/modules-load.d/drbd.conf
5) Создаем конфигурационный файл ресурса drbd /etc/drbd.d/r0.res
resource r0 {
protocol C;
device /dev/drbd0;
meta-disk internal;
disk /dev/sdb;
net {
allow-two-primaries;
}
disk {
fencing resource-and-stonith;
}
handlers {
fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh";
}
on node1 {
address 192.168.0.1:7788;
}
on node2 {
address 192.168.0.2:7788;
}
6) Отключаем юнит drbd (позже его за него будет отвечать pacemaker), создаем метаданные для диска drbd, поднимаем ресурс
systemctl disable drbd
drbdadm create-md r0
drbdadm up r0
7) На первой ноде делаем ресурс первичным
drbdadm primary --force r0
8) Ставим pacemaker
yum install -y pacemaker pcs resource-agents
9) Устанавливаем пароль для пользователя hacluster для авторизации на нодах
echo CHANGEME | passwd --stdin hacluster
10) Запускаем pacemaker на обоих нодах
systemctl enable pcsd
systemctl start pcsd
11) Авторизуемся в кластере. C этого этапа делаем все на одной ноде
pcs cluster auth node1 node2 -u hacluster
12) Создаем кластер с именем samba_cluster
pcs cluster setup --force --name samba_cluster node1 node2
13) активируем ноды
pcs cluster enable --all
pcs cluster start --all
14) Так как в качестве серверов у нас выступают виртуальные машины, то отключаем механизм STONITH
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
15) Создаем VIP
pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.0.10 cidr_netmask=24 op monitor interval=60s
16) Создаем ресурс drbd
pcs cluster cib drbd_cfg
pcs -f drbd_cfg resource create DRBD ocf:linbit:drbd drbd_resource=r0 op monitor interval=60s
pcs -f drbd_cfg resource master DRBDClone DRBD master-max=2 master-node-max=1 clone-node-max=1
clone-max=2 notify=true interleave=true
pcs cluster cib-push drbd_cfg
17) Устанавливаем необходимые пакеты для clvm и подготавливаем clvm
yum install -y lvm2-cluster gfs2-utils
/sbin/lvmconf --enable-cluster
18) Добавляем ресурс dlm и clvd в pacemaker
pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true
pcs resource create clvmd ocf:heartbeat:clvm op monitor interval=30s on-fail=fence clone interleave=true ordered=true
pcs constraint colocation add clvmd-clone with dlm-clone
19) На это этапе запуск clvmd и dlm должен выдать ошибку. Заходим на веб интерфейс pacemaker 192.168.0.1:2224. Если кластер не появился, то добавляем его «Edd existing». Далее переходим Resources — dlm — optional arguments и выставляем значение allow_stonith_disabled = true
20) Задаем очередь загрузки ресурсов
pcs constraint order start DRBDClone then dlm-clone
pcs constraint order start dlm-clone then clvmd-clone
21) Запрещаем LVM писать кэш и очищаем его. На обоих нодах
sed -i 's/write_cache_state = 1/write_cache_state = 0/' /etc/lvm/lvm.conf
rm /etc/lvm/cache/*
22) Редактируем /etc/lvm/lvm.conf чтоб lvm не видел /dev/sdb. На обоих нодах
# This configuration option has an automatic default value.
# filter = [ "a|.*/|" ]
filter = [ "r|^/dev/sdb$|" ]
23) Создаем CLVM раздел. Делаем только на одной ноде
$ vgcreate -Ay -cy cl_vg /dev/drbd0
Physical volume "/dev/drbd0" successfully created.
Clustered volume group "cl_vg" successfully created
$ lvcreate -l100%FREE -n r0 cl_vg
Logical volume "r0" created.
24) Размечаем раздел в gfs2
mkfs.gfs2 -j2 -p lock_dlm -t drbd-gfs2:r0 /dev/cl_vg/r0
25) Дальше добавляем монтирование этого раздела в pacemaker и говорим ему грузиться после clvmd
pcs resource create fs ocf:heartbeat:Filesystem device="/dev/cl_vg/r0" directory="/mnt/" fstype="gfs2" --clone
pcs constraint order start clvmd-clone then fs-clone
26) Теперь наcтал черед ctdb, который будет запускать samba
yum install -y samba ctdb cifs-utils
27) Правим конфиг /etc/ctdb/ctdbd.conf
CTDB_RECOVERY_LOCK="/mnt/ctdb/.ctdb.lock"
CTDB_NODES=/etc/ctdb/nodes
CTDB_MANAGES_SAMBA=yes
CTDB_LOGGING=file:/var/log/ctdb.log
CTDB_DEBUGLEVEL=NOTICE
28) Создаем файл со списком нод. ВНИМАНИЕ! После каждого айпишника в списке нод, должен присутствовать перевод строки. Иначе нода будет фэйлится при инициализации.
cat /etc/ctdb/nodes
192.168.0.1
192.168.0.2
29) Добавляем к конфигу /etc/samba/smb.conf
[global]
clustering = yes
private dir = /mnt/ctdb
lock directory = /mnt/ctdb
idmap backend = tdb2
passdb backend = tdbsam
[test]
comment = Cluster Share
path = /mnt
browseable = yes
writable = yes
30) И наконец создаем ресурс ctdb и указываем, что он должен грузиться после
pcs constraint order start fs-clone then samba
А теперь о проблеме, которую я пока не решил. Если ребутнуть ноду, то вся связка рушится, так как drbd нужно время чтобы активировать /dev/drbd0. DLM не видит раздела, так как он еще не активирован и не стартует и т.д. Временное решение — активировать раздел вручную и перезапустить ресурсы pacemaker
vgchage -a y
pcs resource refresh