При создании кластера для обработки звонков на базе CGP возникла необходимость настройки бесперебойного хранилища, монтируемого с нескольких сервров.
В качестве дистрибутиа для серверов был взят Ubuntu Server 10.10. Дисковое пространство было разбито на два логических диска (sda1 для установки системы, и sda2 собственно для разделяемого диска).
После установки базовой системы надо дополнительно установить следующие пакеты: heartbeat, pacemaker, drbd8-utils, xfs, xfsprogs, nfs-kernel-server.
Heartbeat и pacemaker нужны для кластеризации серверов. Хранилище сделано на основе drbd, в качестве файловой системы использовалась xfs. Раздача файловой системы серверам сделана по nfs.
1. Настройка системы
Для нод были выбраны имена u1 и u2. Для удобста эти имена сразу были прописаны в /etc/hosts:
10.0.0.84 u1 10.0.0.115 u2 10.0.0.120 u0
u0 — это адрес по которому хранилище доступно для монтирования файловой системы с остальных серверов.
2. Настройка drbd
Файл с конфигурацией хранилища распологается в /etc/drbd.d/r0.res:
resource r0 { protocol C; syncer { rate 4M; } startup { wfc-timeout 15; degr-wfc-timeout 60; } net { after-sb-0pri discard-zero-changes; after-sb-1pri discard-secondary; after-sb-2pri disconnect; cram-hmac-alg sha1; shared-secret somesecretword; } on u1 { device /dev/drbd0; disk /dev/sda2; address 10.0.0.84:7788; meta-disk internal; } on u2 { device /dev/drbd0; disk /dev/sda2; address 10.0.0.115:7788; meta-disk internal; } }
На обоих нодах файл одинаковый, так что можно создать на одной, а затем скопировать на вторую.
Такая жестокоя настройка для лечения split brain была выбрана, так как хранилище используется в основном для хранения конфигурации системы. То есть потеря последних изменения не так критична, как потеря звонков во время простоя по причине slit blain.
После создания файла конфигурации надо создать сами диски на обоих серверах кластера:
dd if=/dev/zero of=/dev/sda2 bs=64M drbdadm create-md r0
После этого можно стартовать drbd. Важно запустить drbd демон на обоих серверах с разницой меньше минуты (таймаут для связи с другими членами кластера):
/etc/init.d/drbd start
После этго в /proc/drbd будет состояние хранилища, в примерно таком виде:
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
То есть две ноды в режиме secondary, при этом диск неконсистетный. Чтобы выйти из этого положения надо насильно объявить одну из нод кластера главной, чтобы это сделать надо выполнить команду:
drbdadm -- --overwrite-data-of-peer primary r0
После этого drbd начнёт обновлять состояние secondary диска:
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---- ns:241984 nr:0 dw:0 dr:242184 al:0 bm:14 lo:510 pe:179 ua:510 ap:0 ep:1 wo:b oos:782664 [===>................] sync'ed: 23.6% (782664/1023932)K finish: 0:04:04 speed: 3,160 (3,172) K/sec
После того, как синхронизация закончится можно создавать файловую систему, на сервере, где drbd в состоянии primary:
mkfs.xfs /dev/drbd0
Для следующих шагов нам будет мешать стандартный механизм запуска демонов. Поэтому надо выполнить на обоих серверах команду:
update-rc.d -f drbd remove
3. Настройка heartbeat
Конфигурация создаётся в файле /etc/heartbeat/ha.cf. На обоих нодах он одинаковый, так что можно создать на одной, а затем скопировать на вторую.
logfacility daemon keepalive 2 deadtime 15 warntime 5 initdead 120 udpport 694 ucast eth0 10.0.0.115 ucast eth0 10.0.0.84 auto_failback on node u1 node u2 use_logd yes crm respawn
Второй файл служит для аутентификации /etc/heartbeat/authkeys:
auth 1 1 sha1 somesecretword
Лучше не дожидаться предупреждения от heartbeat на неправильные атрибуты файла и поменять их заранее:
chmod 600 /etc/heartbeat/authkeys
После этого можно стартовать heartbeat:
/etc/init.d/heartbeat start
Через некоторое время команда crm_mod должно показать, что две ноды подключились к друг-другу:
============ Last updated: Fri Feb 10 09:33:04 2012 Stack: Heartbeat Current DC: u1 (86b204d8-ee3e-47c7-ba0e-1dcbd40a20da) - partition with quorum Version: 1.0.9-unknown 2 Nodes configured, 2 expected votes 2 Resources configured. ============ Online: [ u2 u1 ]
Далее надо выполнить команду crm configure edit и ввести настройку для кластера:
node $id="86b204d8-ee3e-47c7-ba0e-1dcbd40a20da" u1 node $id="c6e3c21f-da3e-4031-9f28-a7e33425a817" u2 primitive drbd0 ocf:linbit:drbd params drbd_resource="r0" op start interval="0" timeout="240" op stop interval="0" timeout="100" op monitor interval="20" role="Slave" timeout="20" depth="0" op monitor interval="10" role="Master" timeout="20" depth="0" primitive fs0 ocf:heartbeat:Filesystem params directory="/shared" fstype="xfs" device="/dev/drbd/by-res/r0" options="noatime,nodiratime,nobarrier,logbufs=8" op start interval="0" timeout="60" op stop interval="0" timeout="60" op notify interval="0" timeout="60" op monitor interval="20" timeout="40" depth="0" meta target-role="Started" primitive ip0 ocf:heartbeat:IPaddr2 params ip="10.0.0.120" nic="eth0:0" op monitor interval="5s" meta target-role="Started" primitive nfs0 ocf:itl:exportfs params directory="/shared" clientspec="10.0.0.0/255.255.255.0" options="rw,no_root_squash,sync,no_wdelay" fsid="1" op start interval="0" timeout="40" op stop interval="0" timeout="60" op monitor interval="30" timeout="55" depth="0" OCF_CHECK_LEVEL="10" meta target-role="Started" group ha_nfs fs0 nfs0 ip0 meta target-role="Started" ms ms_drbd0 drbd0 meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" colocation c_nfs inf: nfs0 ms_drbd0:Master order o_nfs inf: ms_drbd0:promote ha_nfs:start property $id="cib-bootstrap-options" dc-version="1.0.9-unknown" cluster-infrastructure="Heartbeat" stonith-enabled="false" expected-quorum-votes="2" no-quorum-policy="ignore" symmetric-cluster="true" last-lrm-refresh="1328625786" rsc_defaults $id="rsc_defaults-options" resource-stickiness="10000"
Настройки exportfs говорят о том, что директория, где будет смонтирована общая файловая система /shared, монтировать этот ресурс по nfs можно будет всем серверам из сети 10.0.0.0.
Через некоторое время монитор кластера должен показать состояние ресурсов:
============ Last updated: Fri Feb 10 09:33:04 2012 Stack: Heartbeat Current DC: u1 (86b204d8-ee3e-47c7-ba0e-1dcbd40a20da) - partition with quorum Version: 1.0.9-unknown 2 Nodes configured, 2 expected votes 2 Resources configured. ============ Online: [ u2 u1 ] Resource Group: ha_nfs fs0 (ocf::heartbeat:Filesystem): Started u1 nfs0 (ocf::itl:exportfs): Started u1 ip0 (ocf::heartbeat:IPaddr2): Started u1 Master/Slave Set: ms_drbd0 Masters: [ u1 ] Slaves: [ u2 ]
4. Монтирование общей файловой системы с других серверов
Для этого можно использовать /etc/fstab:
u0:/shared /var/CommuniGate/SharedDomains nfs bg,intr 0 0
5. Дополнительные ссылки
- При создании конфигурации за основу было взято описание http://library.linode.com/linux-ha/ip-failover-heartbeat-pacemaker-drbd-mysql-ubuntu-10.04
- Инструкция по лечени split-brain у drbd http://www.alsigned.ru/?p=490
- В Ubuntu 10.10 exportfs агент не входит, поэтому его надо скачивать отдельно (https://github.com/ClusterLabs/resource-agents/blob/master/heartbeat/exportfs) и установить в /usr/lib/ocf/resource.d/heartbeat/
- В данной конфигурации нет важной части — STONITH (http://linux-ha.org/wiki/STONITH), так как нет резервного канала
- Описание механизма использования общего адреса можно прочитать на http://www.ultramonkey.org/3/ip_address_takeover.html
Автор: freewind