Создание надёжного хранилища раздаваемого нескольким серверам по 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

    Средняя зарплата в IT

    120 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 7 078 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

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

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

        +1
        Corosync/pacemaker
        Вот не плохая дока _http://www.tokiwinter.com/clustering-with-drbd-corosync-and-pacemaker/
          +1
          Спасибо!
          Давно думаю, чем заменить heartbeat.
          Он работает хорошо, но когда два разных датацентра и начинается чехарда с сетью, он бывает выдает сюрпризы.
          +1
          Heartbeat на моей памяти ни разу не вис. Собственно это было определяющим критерием его выбора. Можно вместо него использовать corosync, или даже piranha.

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

          Corosync инсталяция расписана вот тут.
          0
          Сам две недели назад подобное делал, но использовал связку corosync/pacemaker.
          По каким причинам вы взяли heartbeat, который не развивается с 2011 года?
            0
            Чуть выше ответил. Corosync использует IP Multicast, что требует перенастроить cisco, а это в больших организациях не так просто сделать.
              0
              Можно перенастроить и на unicast.
            +3
            В качестве дистрибутиа для серверов был взят Ubuntu Server 10.10.

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

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

            Похоже что автор конкретно застрял в прошлом.
              0
              Я думаю, статья писалась в 2011 и только сейчас опубликована. Или это перевод творческая переработка какой-то статьи из тех времён.
                0
                Статья писалась в 2012 году, но не было возможности её опубликовать. Сейчас появилась. Не думаю, что конкретный рабочий пример сильно поменялся за несколько лет.
              0
              А почему Ubuntu 10.10? Почему не 8.04?
                0
                А почему ни какой-нибудь GlusterFS?
                  0
                  Судя по документации можно потерять данные. Но я не пробовал использовать GlusterFS, поэтому не могу про неё рассказать.
                    0
                    Ну а по NFS если произойдет сбой во время записи, эти данные не потеряются?
                      0
                      NFS работает уровнем выше. Дублирование информации по нодам происходит на уровне блочного устройства. Операция ввода/вывода не завершается пока данные не попадут на диск.
                        0
                        Отличное замечание, сразу отпала куча вопросов.
                        Будем изучать NFS. Но кто же тогда использует Gluster?
                          0
                          Там можно хранить большое количество файлов практически неограниченного суммарного объёма. Какие-то специфичные задачи на Gluster решать вполне можно.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое