LVM+OCFS2 под управлением Pacemaker

Материал из ALT Linux Wiki

Общая информация

Схема стенда:

  1. узел - 10.122.122.35 (pcs-lvm1)
  2. узел - 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).

Примечание: Можно отключить использование wdmd в файле /etc/sysconfig/sanlock, раскомментировав строку:
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.png

Файл 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

Финальный результат кластера:

Pcs status full.png