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

Комментарии (17)


  1. pcdesign
    06.02.2014 14:37

    Спасибо за статью.
    А почему heartbeat?
    Спрашиваю, потому что он очень давно не обновлялся, бывает зависает.
    Может есть более современные решения?


    1. smartlight
      06.02.2014 14:37

      Corosync/pacemaker
      Вот не плохая дока _http://www.tokiwinter.com/clustering-with-drbd-corosync-and-pacemaker/


      1. pcdesign
        06.02.2014 14:37

        Спасибо!
        Давно думаю, чем заменить heartbeat.
        Он работает хорошо, но когда два разных датацентра и начинается чехарда с сетью, он бывает выдает сюрпризы.


    1. freewind Автор
      06.02.2014 14:37

      Heartbeat на моей памяти ни разу не вис. Собственно это было определяющим критерием его выбора. Можно вместо него использовать corosync, или даже piranha.

      Вот только corosync использует IP Multicast, что не во всех сетях заканчивается хорошо. А piranha больше подходит для Red Hat дистрибутивов.

      Corosync инсталяция расписана вот тут.


  1. smartlight
    06.02.2014 14:37

    Сам две недели назад подобное делал, но использовал связку corosync/pacemaker.
    По каким причинам вы взяли heartbeat, который не развивается с 2011 года?


    1. freewind Автор
      06.02.2014 14:37

      Чуть выше ответил. Corosync использует IP Multicast, что требует перенастроить cisco, а это в больших организациях не так просто сделать.


      1. click0
        06.02.2014 14:37

        Можно перенастроить и на unicast.


  1. lolipop
    06.02.2014 14:37

    В качестве дистрибутиа для серверов был взят Ubuntu Server 10.10.

    ШТО? Ладно бы еще 10.04 LTS, но вот брать 10.10 в 2014 году как-то странно.

    Last updated: Fri Feb 10 09:33:04 2012

    Похоже что автор конкретно застрял в прошлом.


    1. merlin-vrn
      06.02.2014 14:37

      Я думаю, статья писалась в 2011 и только сейчас опубликована. Или это перевод творческая переработка какой-то статьи из тех времён.


      1. freewind Автор
        06.02.2014 14:37

        Статья писалась в 2012 году, но не было возможности её опубликовать. Сейчас появилась. Не думаю, что конкретный рабочий пример сильно поменялся за несколько лет.


        1. freewind Автор
          06.02.2014 14:37

          NFS работает уровнем выше. Дублирование информации по нодам происходит на уровне блочного устройства. Операция ввода/вывода не завершается пока данные не попадут на диск.


          1. zakon
            06.02.2014 14:37

            Отличное замечание, сразу отпала куча вопросов.
            Будем изучать NFS. Но кто же тогда использует Gluster?


            1. freewind Автор
              06.02.2014 14:37

              Там можно хранить большое количество файлов практически неограниченного суммарного объёма. Какие-то специфичные задачи на Gluster решать вполне можно.


  1. egorF
    06.02.2014 14:37

    А почему Ubuntu 10.10? Почему не 8.04?


  1. Darka
    06.02.2014 14:37

    А почему ни какой-нибудь GlusterFS?


    1. freewind Автор
      06.02.2014 14:37

      Судя по документации можно потерять данные. Но я не пробовал использовать GlusterFS, поэтому не могу про неё рассказать.


  1. anonymous
    06.02.2014 14:37