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

в 12:18, , рубрики: drbd, linux, nfs, Ubuntu, метки: , ,

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

Автор: freewind

Источник

Поделиться

* - обязательные к заполнению поля