Создание надёжного хранилища раздаваемого нескольким серверам по nfs

от автора

При создании кластера для обработки звонков на базе 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. Дополнительные ссылки

  1. При создании конфигурации за основу было взято описание http://library.linode.com/linux-ha/ip-failover-heartbeat-pacemaker-drbd-mysql-ubuntu-10.04
  2. Инструкция по лечени split-brain у drbd http://www.alsigned.ru/?p=490
  3. В Ubuntu 10.10 exportfs агент не входит, поэтому его надо скачивать отдельно (https://github.com/ClusterLabs/resource-agents/blob/master/heartbeat/exportfs) и установить в /usr/lib/ocf/resource.d/heartbeat/
  4. В данной конфигурации нет важной части — STONITH (http://linux-ha.org/wiki/STONITH), так как нет резервного канала
  5. Описание механизма использования общего адреса можно прочитать на http://www.ultramonkey.org/3/ip_address_takeover.html

ссылка на оригинал статьи http://habrahabr.ru/post/137938/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *