Pull to refresh

Кластерное хранилище Pacemaker + DRBD (Dual primary) + samba

Reading time 5 min
Views 10K
В продолжение статьи «Кластерное хранилище Pacemaker + DRBD (Dual primary) + ctdb» представляю полностью готовый и рабочий вариант HA кластера файловой шары на 2-4 ноды для centos 6 и centos 7. Если вы хотите реализовать такое, вы либо извращенец, либо вам не дали никакого выбора, и реализовать надо хоть как-то.

Я просто опишу слоёный пирог, который мы будем собирать:

На блочном устройстве создаём таблицу gpt => один раздел на всё пространство под лвм => группу томов лвм на всё доступное пространство => лвм том на всё доступное пространство => drbd устройство => dlm => размечаем как физический том лвм на всё доступное пространство => на него кластерную группу томов лвм => лвм том на всё доступное пространство => размечаем фс gfs2 => подключаем в точку монтирования.
И рулить всем этим будет pacemaker c virtual ip адресом.


Если вы ещё хотите продолжать, читайте дальше под катом.

Из исходных нам необходимо следующее:
Процессор 1 ядро
1 Гб минимум оперативной памяти
15 Гб диск + место на котором вы будете хранить данные
Дисков может быть сколько угодно, даже один.

Если у вас один диск, то лучше размечать его следующим образом:
Таблица разделов gpt => раздел 200 Мб для efi (опционально) => раздел 1Гб для /boot => всё остальное место под лвм.

На лвм томе вам необходимо создать 2 группы томов. Первая группа томов под ОС размером 10 Гб + удвоенному размеру оперативной памяти, но не более 4 Гб.

Кто бы, что не говорил, но подкачка иногда очень выручает, поэтому на лвм группе создаём лвм раздел для подкачки равный удвоенному размеру оперативной памяти, но не более 4 Гб и оставшееся место отводим под корень ОС.

Вторая группа лвм под хранение данных. Создаём лвм раздел на всё оставшееся место.

По условиям нам дали 2 виртуальные машины и на этом всё. Ceph для корректной работы лучше ставить на 6 нодах, минимум 4, плюс было бы неплохо иметь какой-нибудь опыт работы с ним, а то получится как у cloudmouse. Gluster для сотен тысяч мелких файлов по производительности не пройдёт, это обмусолено на просторах хабра много раз. ipfs, lustre и тому подобные имеют такие же требования как у ceph или даже больше.

Начнём сражение! У меня было две виртуальные машины на CentOS 7 с 2мя дисками.


1) Pacemaker версии 1.1 не работает с ip корректно, поэтому для надёжности добавляем в /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
yum localinstall -y http://ftp.nluug.nl/os/Linux/distr/elrepo/elrepo/el7/x86_64/RPMS/$(curl -s http://ftp.nluug.nl/os/Linux/distr/elrepo/elrepo/el7/x86_64/RPMS/ | grep -oP ">elrepo-release.*rpm" | cut -c 2-)

3) Устанавливаем drbd версии 8.4

yum install -y kmod-drbd84 drbd84-utils

4) Активируем и включаем в автозагрузку модуль ядра drbd

modprobe drbd
echo drbd > /etc/modules-load.d/drbd.conf

5) Создаём раздел диска и настраиваем лвм

echo -e "g\nn\n\n\n\nt\n8e\nw\n" | fdisk /dev/sdb
vgcreate drbd_vg /dev/sdb1
lvcreate -l +100%FREE --name r0 drbd_vg

6) Создаем конфигурационный файл ресурса drbd /etc/drbd.d/r0.res

resource r0 {
  protocol C;
  device /dev/drbd1;
  meta-disk internal;
  disk /dev/mapper/drbd_vg-r0;
  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";
  }
  startup { 
    become-primary-on both;
  }
  on node1 {
    address 192.168.0.1:7788;
  }
  on node2 {
    address 192.168.0.2:7788;
  }

7) Убираем сервис drbd из авозагрузки (позже его за него будет отвечать pacemaker), создаем метаданные для диска drbd, поднимаем ресурс

systemctl disable drbd
drbdadm create-md r0
drbdadm up r0

8) На первой ноде делаем ресурс первичным

drbdadm primary --force r0

9) Ставим pacemaker

yum install -y pacemaker corosync pcs resource-agents fence-agents-all

10) Устанавливаем пароль для пользователя hacluster для авторизации на нодах

echo CHANGEME | passwd --stdin hacluster 

11) Запускаем pcsd на обоих нодах

systemctl enable pcsd
systemctl start pcsd

12) Авторизуемся в кластере. C этого этапа делаем все на одной ноде

pcs cluster auth node1 node2 -u hacluster -p CHANGEME --force 

13) Создаем кластер с именем samba_cluster

pcs cluster setup --force --name samba_cluster node1 node2

14) активируем ноды и добавляем сервисы в автозагрузку и запускаем их

pcs cluster enable --all
pcs cluster start --all
systemctl start corosync pcsd pacemaker
systemctl enable corosync pcsd pacemaker

15) Так как в качестве серверов у нас выступают виртуальные машины, то отключаем механизм STONITH, так как мы не имеем никаких механизмов для управления ими. Так же у нас машин всего 2, поэтому кворум тоже отключаем, он работает только при 3х и более машинах.

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore

16) Создаем VIP

pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.0.10 cidr_netmask=32 nic=eth0 clusterip_hash=sourceip-sourceport op monitor interval=1s

17) Создаем ресурс drbd

pcs resource create DRBD1 ocf:linbit:drbd drbd_resource=r0 op monitor interval=60s master master-max=2 master-node-max=1 clone-node-max=1 clone-max=2 notify=true op start interval=0s timeout=240 promote interval=0s timeout=130 monitor interval=150s role=Master monitor interval=155s role=Slave

18) Устанавливаем необходимые пакеты для clvm и подготавливаем clvm

yum install -y lvm2-cluster gfs2-utils
/sbin/lvmconf --enable-cluster

19) Добавляем ресурс dlm и clvd в pacemaker

pcs resource create dlm ocf:pacemaker:controld allow_stonith_disabled=true clone meta interleave=true
pcs resource create clvmd ocf:heartbeat:clvm clone meta interleave=true

20) Запрещаем LVM писать кэш и очищаем его. На обоих нодах

sed -i 's/write_cache_state = 1/write_cache_state = 0/' /etc/lvm/lvm.conf
rm /etc/lvm/cache/*


21) Создаем CLVM раздел. Делаем только на одной ноде
vgcreate -A y -c y cl_vg /dev/drbd1
lvcreate -l 100%FREE -n r0 cl_vg

22) Размечаем раздел в gfs2, здесь важно чтобы таблица блокировок имела тоже имя что и наш кластер в peacemaker. Делаем только на одной ноде

mkfs.gfs2 -j 2 -p lock_dlm -t samba_cluster:r0 /dev/cl_vg/r0

23) Дальше добавляем монтирование этого раздела в pacemaker и говорим ему грузиться после clvmd

pcs resource create fs ocf:heartbeat:Filesystem device="/dev/cl_vg/r0" directory="/mnt" fstype="gfs2" clone interleave=true

24) Теперь наcтал черед ctdb, который будет запускать samba

yum install -y samba ctdb cifs-utils

25) Правим конфиг /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

26) Создаем файл со списком нод /etc/ctdb/nodes
ВНИМАНИЕ! После каждого адреса в списке должен присутствовать перевод строки. Иначе нода не будет включаться при инициализации.

192.168.0.1
192.168.0.2

27) И наконец создаем ресурс ctdb

pcs resource create samba systemd:ctdb clone meta interleave=true

28) Задаем очередь загрузки и зависимости ресурсов для запуска

pcs constraint colocation add dlm-clone with DRBD1-master
pcs constraint colocation add clvmd-clone with dlm-clone
pcs constraint colocation add fs-clone with clvmd-clone
pcs constraint colocation add samba-clone with fs-clone
pcs constraint colocation add virtual_ip with samba-clone
pcs constraint order promote DRBD1-master then dlm-clone
pcs constraint order start dlm-clone then clvmd-clone
pcs constraint order start clvmd-clone then fs-clone
pcs constraint order start fs-clone then samba-clone

29) Задаем очередь остановки ресурсов, без этого ваша машина может зависнуть на моменте выключения

pcs constraint order stop fs-clone then stop clvmd-clone
pcs constraint order stop clvmd-clone then stop dlm-clone
pcs constraint order stop dlm-clone then stop DRBD1-master
pcs constraint order stop samba-clone then stop fs-clone

P.S.


Сама шара может быть и на nfs, и на samba, но подключение к ним fail-over по IP, хотя само хранилище HA. Если вы хотите полный HA, то вместо samba и nfs вам надо ставить iSCSI и подключать через multipath. К тому же можно получить splitbrain в случае если одна из нод умрёт, а когда поднимется мастера не будет. Я проверил, что если ОС корректно выключается, то после поднятия ноды, когда мастера нет, она переходит в режим out-of-date и не становится мастером во избежание сплит брейна. Варианты с кворумом(DRBD и\или pacemaker) и любые извращения из каскадных конструкций DRBD после вашей настройки несостоятельны по причине высокой сложности, другой админ будет долго разбираться. Хотя с тем, что я написал не лучше, не делайте так.

Ссылки:

Здесь есть похожая инструкция с синтаксисом под pacemaker 1.0.
Tags:
Hubs:
+14
Comments 26
Comments Comments 26

Articles