LVM+OCFS2 под управлением Pacemaker
Общая информация
Схема стенда:
- узел - 10.122.122.35 (pcs-lvm1)
- узел - 10.122.122.36 (pcs-lvm2)
Виртуальный IP-адресс 10.122.122.34
Общий диск /dev/sdb на нодах, презентованный по iSCSI.
Версии пакетов:
- corosync-3.1.7-alt1.x86_64
- pacemaker-2.1.5-alt1.x86_64
- resource-agents-4.10.0-alt1.x86_64
- pcs-0.11.6-alt0.c10f1.1.x86_64
- lvm2-lockd-2.03.16-alt1.x86_64
- sanlock-3.8.2-alt1.x86_64
- ocfs2-tools-1.8.7-alt1.x86_64
- open-iscsi-2.1.9-alt1.x86_64
Предварительная настройка каждой ноды
Добавить необходимые записи в файл /etc/hosts:
# cat <<EOF >> /etc/hosts 10.122.122.35 pcs-lvm1 10.122.122.36 pcs-lvm2 EOF
Установить необходимые пакеты:
# apt-get install corosync resource-agents resource-agents-lvm pacemaker pcs lvm2-lockd ocfs2-tools open-iscsi
Проверить, что время синхронизировано:
# timedatectl
Настройка LVM (lvmlockd + sanlock)
На всех хостах, установить опцию в файле /etc/lvm/lvm.conf для включения механизма блокировок:
... use_lvmlockd = 1 ...
Назначить каждому хосту уникальный host_id в диапазоне 1-2000, в файле /etc/lvm/lvmlocal.conf .
[root@pcs-lvm1 ~]# grep host_id /etc/lvm/lvmlocal.conf [root@pcs-lvm2 ~]# grep host_id /etc/lvm/lvmlocal.conf
Служба sanlock использует wdmd демон для доступа к watchdog/softdog (/dev/watchdog).
SANLOCKOPTS="-U sanlock -G sanlock -w 0"
Тип блокировки будет выбран sanlock или dlm, в зависимости от запущенного менеджера блокировок (в данной инструкции это sanlock).
Запустить необходимые службы:
# systemctl enable --now sanlock.service # systemctl enable --now lvmlockd.service
Если общий диск уже использовался и на нём есть разметка, то лучше всего очистить все данные:
# wipefs -a -f /dev/sdb
На одном из узлов выполнить команду для создания VolumeGroup на общем диске с помощью опции shared:
# vgcreate --shared shared_vg /dev/sdb
Запустить механизм блокировки на всех хостах:
# vgchange --lock-start
После этого команды LVM будут получать блокировки от lvmlockd, а тот использовать выбранный менеджер блокировок. Менеджер sanlock может долго запускать блокировки. Команды следует выполнять после завершения.
Посмотреть параметры созданной группы:
~# vgs -o+locktype
На одном из узлов выполнить команду для создания LVM раздела:
# lvcreate -l 100%FREE shared_vg -n shared_lv
Активировать на всех узлах логический том:
# lvchange -asy shared_vg
Настройка OCFS2
Создать кластер ocfs2cluster из двух узлов (pcs-lvm1 и pcs-lvm2):
# o2cb_ctl -C -n ocfs2cluster -t cluster -a name=ocfs2cluster
Добавить оба узла в кластер:
# o2cb_ctl -C -n pcs-lvm1 -t node -a number=0 -a ip_address=10.122.122.35 -a ip_port=7777 -a cluster=ocfs2cluster # o2cb_ctl -C -n pcs-lvm2 -t node -a number=1 -a ip_address=10.122.122.36 -a ip_port=7777 -a cluster=ocfs2cluster
Конечная конфигурация, которую необходимо скопировать на другой узел:
# cat /etc/ocfs2/cluster.conf cluster: name = ocfs2cluster heartbeat_mode = local node_count = 2 node: cluster = ocfs2cluster number = 0 ip_port = 7777 ip_address = 10.122.122.35 name = pcs-lvm1 node: cluster = ocfs2cluster number = 1 ip_port = 7777 ip_address = 10.122.122.36 name = pcs-lvm2
Сконфигурировать OCFS2 на всех узлах (параметры попадают в файл /etc/sysconfig/o2cb) :
# /etc/init.d/o2cb configure
Вручную запустить кластер и убедиться, что нет ошибок (на всех узлах):
# /etc/init.d/o2cb load # /etc/init.d/o2cb online ocfs2cluster
Запустить службы в автозагрузку (на всех узлах):
# systemctl enable --now o2cb.service # systemctl enable --now ocfs2.service
На одном из узлов выполнить команду, чтобы отформатировать общий диск LVM в OCFS2:
# mkfs.ocfs2 -b 4096 -C 4k -L OCFS2 -N 2 /dev/shared_vg/shared_lv
Настройка Pacemaker
Задать пароль для пользователя hacluster, на всех узлах одинаковый:
# passwd hacluster
Запустить службу (на всех узлах):
# systemctl enable --now pcsd.service
Настроить аутентификацию (на одном узле):
# pcs host auth pcs-lvm1 pcs-lvm2 -u hacluster
Если выходит ошибка «Error: Unable to communicate with pcsd» (версия gem-childprocess-3.0.0-alt1), то выполнить команду и повторить аутентификацию (либо обновить пакет, если доспутен в репозитории gem-childprocess-5.0.0-alt1):
# gem install childprocess
На одном из узлов выполнить команду, чтобы создать кластер:
# pcs cluster setup pcscluster pcs-lvm1 pcs-lvm2
Запустить кластер и настроить автоматическое включение:
# pcs cluster start --all # pcs cluster enable --all
Проверить состояние кластера:
# pcs status cluster
Выполнить команду, чтобы наличие или отсутствие кворума не учитывалось:
# pcs property set no-quorum-policy=ignore
Пока STONITH не настроен, его можно отключить:
# pcs property set stonith-enabled=false
Добавить виртуальный IP-адрес для кластера:
# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=10.122.122.34 cidr_netmask=24 op monitor interval=10s
Добавить ресурсы sanlock.service и lvmlockd под управление pcs:
# pcs resource create sanlock_service --group locking service:sanlock op monitor interval=30s on-fail=restart # pcs resource create lvmlockd --group locking ocf:heartbeat:lvmlockd op monitor interval=30s on-fail=restart
Т.к. ресурс по умолчанию LVM-activate умеет определять только менеджер блокировок DLM, создаём свой ресурс, с небольшой модификацией:
# cd /usr/lib/ocf/resource.d/heartbeat/ # cp LVM-activate LVM-activate-sanlock
В файле LVM-activate-sanlock в 235 строке меняем на:
if [ "$vg_locktype" = "dlm" ] || [ "$vg_locktype" = "sanlock" ]; then
Файл LVM-activate-sanlock необходимо добавить на все узлы.
Добавить новый ресурс LVM-activate-sanlock под управление pcs:
# pcs resource create --group shared_vg shared_lv ocf:heartbeat:LVM-activate-sanlock lvname=shared_lv vgname=shared_vg activation_mode=shared vg_access_mode=lvmlockd op monitor interval=30s on-fail=restart
Добавить файловую систему OCFS2 под управление pcs, чтобы он монтировал (целевая папка для монтирования должна существовать):
# pcs resource create --group shared_vg ocfs2_fs ocf:heartbeat:Filesystem device="/dev/shared_vg/shared_lv" directory="/mnt/ocfs2" fstype="ocfs2" op monitor interval=20s on-fail=restart
Клонировать группы ресурсов, чтобы они могли быть активными на всех узлах кластера:
# pcs resource clone locking interleave=true # pcs resource clone shared_vg interleave=true
Установить порядок запуска ресурсов, сначала блокировки, потом активация:
# pcs constraint order start locking-clone then shared_vg-clone
Установить задержку запуска и остановки lvm, чтобы блокировки успевали отрабатывать:
# pcs resource update shared_lv op start timeout=180s # pcs resource update shared_lv op stop timeout=180s
Финальный результат кластера: