The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Создание отказоустойчивого хранилища на базе FreeBSD или FreeNAS с использованием ZFS, HAST и CARP
Начиная с FreeBSD 8.1 в состав включена поддержка системы репликации устройств
хранения данных HAST (Highly Avalable STorage), позволяющей создавать
высоконадежные конфигурации, в которых данные синхронизированы между
несколькими узлами. HAST реализован в виде работающего на уровне пользователя
демона hastd, использующего стандартный класс GEOM Gate для обработки запросов
ввода/вывода. Hastd, обеспечивает синхронную репликацию блочных устройств
поверх TCP/IP сетей, независимо от типа накопителя и файловой системы. HAST
предусматривает возможность быстрого восстановления после сбоя, причём, при
выходе из строя первичного master-узла, его функции могут быть делегированы
slave-узлу. После проверки и монтирования UFS раздела или импорта ZFS пула на
поврежденном узле, система автоматически синхронизирует внесенные за время
восстановления изменения и продолжит работу без потери данных.

Для быстрого развёртывания хранилищ удобно использовать дистрибутив FreeNAS. К
сожалению в настоящее время FreeNAS не поддерживает HAST из коробки, но так как
во FreeNAS используются стандартные компоненты FreeBSD 8.x, ни что не мешает
самостоятельно вручную создать и надстроить работу подобных хранилищ.

После первой загрузки FreeNAS настроим параметры сетевого доступа и DNS. Первый
узел freenas1 будет иметь IP 192.168.137.31, а второй freenas2 -
192.168.137.32. После первичной типовой настройки подключимся к shell.


Настройка узла HAST

Перемонтируем корневой раздел для обеспечения возможности записи:

  mount -uw /
 
Создадим массив хранения RAID3 из дисков da1, da2, da3.

   graid3 label gr0raid3 da1 da2 da3

В итоге будет создано устройство /dev/raid3/gr0raid3
 
Включим поддержку CARP и активируем демон hastd:

   cat <<EOF >> /conf/base/etc/rc.conf
   ifconfig carp0 create
   ifconfig carp0 vhid 1 pass freenashast 192.168.137.30/24
   # enable HAST daemon
   hastd_enable="YES"
   EOF
 
Если в директории  /boot/kerneldaemon отсутствует модуль if_carp.ko, скопируем
его из системы на базе FreeBSD 8.2 или 8.3.

Создадим файл конфигурации hast.conf, в котором определим /dev/raid3/gr0raid3 в
качестве синхронизируемого между узлами хранилища:

   cat <<EOF > /conf/base/etc/hast.conf
   resource freenashast {
        on freenas1 {
                local /dev/raid3/gr0raid3
                remote freenas2
        }
        on freenas2 {
                local /dev/raid3/gr0raid3
                remote freenas1
        }
   }
   EOF
 
Копируем hast.conf в директорию /etc и перезагружаем систему:

   cp /conf/base/etc/hast.conf /etc
 
Создаём хранилище hast:

   hastctl create freenashast
 
После появления устройства /dev/hast/freenashast назначаем текущему узлу роль первичной системы:

   hastctl role primary freenashast
 
Создаём zpool в хранилище freenashast

   zpool create -m /mnt gr0 /dev/hast/freenashast

Создаём символическую ссылку на директорию RAID3, чтобы web-интерфейс FreeNAS
распознал вручную созданное хранилище:

   ln -s /dev/hast/freenashast /dev/raid3/gr1raid3
 
После этого в GUI FreeNAS можно автоматически импортировать раздел gr0 и
настроить совместный доступ  с использованием штатного web-интерфейса.

 
Настроим демон devd для переключения HAST из режима master в slave и наоборот в
зависимости от состояния сетевого линка:

   cat <<EOF >> /conf/base/etc/devd.conf
   notify 30 {
        match "system" "IFNET";
        match "subsystem" "carp0";
        match "type" "LINK_UP";
        action "/usr/local/sbin/carp-hast-switch master";
   };
 
   notify 30 {
        match "system" "IFNET";
        match "subsystem" "carp0";
        match "type" "LINK_DOWN";
        action "/usr/local/sbin/carp-hast-switch slave";
   };
   EOF
 
Создадим скрипт hast-carp-switch, который будет выполнять переключение режимов:

   cat <<EOF > /usr/local/sbin/carp-hast-switch

   #!/bin/sh
   resources="freenashast"
   zfspool="gr0"
   delay=3
   log="local0.debug"
   name="carp-hast"
 
   case "$1" in
        master)
                logger -p $log -t $name "Switching to primary provider for $resources."
                # in order to wait for the original primary provider to change role state
                # otherwise, brain-split may happen
                sleep $delay
                for disk in $resources; do
                        # ensure that this storage can be switched                        
                        while $(pgrep -lf "hastd: $disk \\(secondary\\)" > /dev/null 2>&1 ); do
                                sleep 1
                        done
 
                        # Switch role for each disk
                        hastctl role primary $disk
                        if [ $? -ne 0 ]; then
                                logger -p $log -t $name "Unable to change role to primary for resouce ${disk}."
                                exit 1
                        fi
                done
 
                # Wait for the /dev/hast/* devices to appear
                for disk in $resources; do
                        for I in $(jot 60); do
                                [ -c "/dev/hast/${disk}" ] && break
                                sleep 0.5
                        done
                        if [ ! -c "/dev/hast/${disk}" ] ; then
                                logger -p $log -t $name "GEOM provider /dev/hast/$disk did not appear."
                                exit 1
                        fi
                done
 
                logger -p $log -t $name "Role for HAST resources switched to primary."
 
                logger -p $log -t $name "Importing ZFS pool."
                zpool import -f $zfspool
 
                # restart the enabled services
                for srv in $(sqlite3 /data/freenas-v1.db "select srv_service from services_services where srv_enable=1" \\
                                | xargs printf "grep 'bool_.*%s' /etc/rc.conf.local\\n" | sh | awk '{print $2}')
               do
                         case $srv in
                             winbindd_enable|samba_enable) /etc/local/rc.d/samba restart
                                        ;;
                             netatalk_enable)        /etc/local/rc.d/netatalk restart
                                        ;;
                             proftpd_enable)         /etc/local/rc.d/proftpd restart
                                        ;;
                             inetd_enable)           /etc/rc.d/inetd restart
                                        ;;
                             nfs_server_enable)      /etc/rc.d/nfsserver restart
                                        ;;
                             mountd_enable)          /etc/rc.d/mountd restart
                                        ;;
                             nfsd_enable)            /etc/rc.d/nfsd restart
                                        ;;
                             rsyncd_enable)          /etc/local/rc.d/rsyncd restart
                                        ;;
                         esac
              done
 
                ;;
 
        slave)
                logger -p $log -t $name "Switching to secondary provider for $resources."
                # stop the running services
                for srv in $(sqlite3 /data/freenas-v1.db "select srv_service from services_services where srv_enable=1" \\
                                | xargs printf "grep 'bool_.*%s' /etc/rc.conf.local\\n" | sh | awk '{print $2}')
               do
                         case $srv in
                             winbindd_enable|samba_enable) /etc/local/rc.d/samba stop
                                        ;;
                             netatalk_enable)        /etc/local/rc.d/netatalk stop
                                        ;;
                             proftpd_enable)         /etc/local/rc.d/proftpd stop
                                        ;;
                             inetd_enable)           /etc/rc.d/inetd stop
                                        ;;
                             nfs_server_enable)      /etc/rc.d/nfsserver stop
                                        ;;
                             mountd_enable)          /etc/rc.d/mountd stop
                                        ;;
                             nfsd_enable)            /etc/rc.d/nfsd stop
                                        ;;
                             rsyncd_enable)          /etc/local/rc.d/rsyncd stop
                                        ;;
                       esac
                done
 
                # export the zfs pool & change role to slave
                for disk in $resources; do
                        zpool export -f $zfspool
                        sleep $delay
                        hastctl role secondary $disk 2>&1
                        if [ $? -ne 0 ]; then
                                logger -p $log -t $name "Unable to switch role to secondary for resource $disk."
                                exit 1
                        fi
                        logger -p $log -t name "Role switched to secondary for resource $disk"
                done
                ;;
        *)
                logger -p $log -t $name "Usage: $0 "
                exit 1
                ;;
   esac

Поменяем права доступа и перезагрузим систему: 

   chmod +x /usr/local/sbin/carp-hast-switch
   reboot

После перезагрузки вручную установим первичный режим HAST для созданного хранилища:

   hastctl role primary freenashast

Выше представленная инструкция рассчитана на создание master-узла. Для
запасного slave-узла, который возьмёт на себя управление в случае сбоя
первичного узла, настойка выполняется аналогично, за одним исключением - для
интерфейса carp0 должен быть установлен меньший приоритет, чем на master-узле:

   ifconfig carp0 vhid 1 pass freenashast advskew 100 192.168.137.30/24
 
28.12.2012 , Источник: http://qq929962616.72pines.com/2012...
Ключи: freenas, hast, storage, ha, carp, zfs / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Кластерные технологии

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, johndoe (?), 11:35, 28/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Почему просто не использовать FreeBSD? Ведь удобнее же! Мало того что этот FreeNAS тормозит, так ещё и кучу неудобств в использовании: ни тебе обновлений вовремя, ни портов-пэкеджей, плюс куча граблей типа перезаписываемых конфигов и тд. _Зачем_??
     
     
  • 2.2, Аноним (-), 12:04, 28/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    FreeNAS-ом очень удобно управлять через web с рабочей станции, для домашнего хранилища самое то. Загрузился и всё уже из коробки работает, не нужно что-то настраивать и устанавливать.
     
     
  • 3.3, Сержант Скотч (?), 12:29, 28/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    И для этого дома надо держать 2 ноды?
     

  • 1.4, hypro (?), 13:19, 28/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    насколько оно стабильно?
     
     
  • 2.6, Аноним (-), 07:01, 29/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    оно стабильно при следующих условиях:
    1. все стандартные скирпты ты выкидываешь на помойку и пишешь свои, учитывая всякие разные внештатные ситуации.
    2. настраиваешь мониторинг, который тебе будет говорить о внештатных ситуациях и оперативно на них реагируешь.
     

  • 1.5, Аноним (-), 06:58, 29/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а теперь представляем: падает твой мастер-узел и лежит сутки, пока ты бегаешь за сгоревшей железкой. В момент починки у тебя выключают свет на часок и ложится еще и слайв-узел. Но вот дают свет и ты запускаешь оба сервера. При поднятии главным опять становится master-узел и все твои данные за сутки ты теряешь. Ладно, автоматом hast не засинхронит slave, для этого потребуется ручное вмешательство, а это значит, что ты сможешь переключиться на slave, но вот ведь беда, заметишь ты это часика через два, когда на мастере уже тоже набегут будут какие-то уникальные изменения и тебе придется терять либо сутки, либо последние два часа. Это сложный случай с кучей не очевидностей, а теперь простой:
    Какой-то глюк, мастер-нода уходит в ребут, переключаемся автоматом на слейв, записываем туда какие-то данные, поднимается master-нода, перехватывает управление на себя - о данных, которые записали на слейв можно забыть. Вопрос: а отказоустойчивое ли хранилище?
     
     
  • 2.7, dry (ok), 13:22, 29/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Надо проверять это все, как именно работает master-slave, наверняка есть какие-то метаданные, которые не позволят мастеру стать мастером при возникшем сбое. Я не берусь утверждать что-то про HAST, поскольку не использовал его, но я использовать аналогичное решение Linux/DRBD и там такие ситуации, по крайней мере в master-slave зарешаны весьма хорошо. Есть претензии к режиму master-master, но это отдельная сложная тема.
    Резюмируя, не надо делать поспешных выводов, не изучив детали.
     
     
  • 3.11, Аноним (-), 19:09, 29/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Я пишу мысли не из головы. Я пользуюсь hast-ом уже больше года.
     
     
  • 4.16, табуреткин (?), 20:30, 09/01/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Я пишу мысли не из головы. Я пользуюсь hast-ом уже больше года.

    а откуда у тебя мысли вылазят?

     
  • 3.15, нононимо (?), 20:47, 07/01/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Надо проверять это все, как именно работает master-slave, наверняка есть какие-то метаданные,
    > которые не позволят мастеру стать мастером при возникшем сбое. Я не
    > берусь утверждать что-то про HAST, поскольку не использовал его, но я
    > использовать аналогичное решение Linux/DRBD и там такие ситуации, по крайней мере
    > в master-slave зарешаны весьма хорошо. Есть претензии к режиму master-master, но
    > это отдельная сложная тема.
    > Резюмируя, не надо делать поспешных выводов, не изучив детали.

    Самая интересная тема здесь это поведение в ситуации split brain, и она не раскрыта

     

  • 1.8, anonchik (?), 14:04, 29/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вам забыли сказать, что FreeNAS сдох и вместо него уже давно пилят NAS4Free. В последнем все манипуляции - штатные и делаются несколькими кликами в вебморде.
     
     
  • 2.9, Аноним (-), 14:15, 29/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Вам забыли сказать, что FreeNAS сдох и вместо него уже давно пилят
    > NAS4Free. В последнем все манипуляции - штатные и делаются несколькими кликами
    > в вебморде.

    FreeNAS ещё все эти форки переживёт, последний релиз FreeNAS вышел 14 декабря, а новая тестовая версия - вчера. NAS4Free в этом время буксует на ровном месте и обещаниями кормит.

     
     
  • 3.10, anonchik (?), 14:25, 29/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Какими обещаниями? Все то что описано в топике там уже давно реализовано из коробки и прикручено к вебморде. Где ваш FreeNAS теперь?
     

  • 1.12, Mr. Sneer (?), 21:05, 02/01/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Немного не по теме: а кто-нибудь сравнивал производительность FreeBSD/HAST и Linux/DRBD ? Что быстрее? Особенно интересно было бы узнать результаты при использовании СУБД (Oracle и MySQL)в качестве "нагрузки".
     
     
  • 2.13, Forth (??), 12:25, 03/01/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Предположу, что большой разницы не будет. Синхронная реплика в сетях tcpip ограничена по iops-ам существенно, в идельном случае ~2000-3000 IOPS-ов.
     

  • 1.17, aprogrammer (?), 12:26, 20/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо за статью. Очень полезная штука - настраивал под Ubuntu (http://sysadm.pp.ua/linux/carp-ubuntu.html) кластер из трех серверов - до сих пор на проде работает. Не подскажите, если ли возможность(технология) для geodistributed redundent IP, может сталкивались ? Заранее спасибо.
     
     
  • 2.19, фвввввввв (?), 16:08, 08/05/2016 [^] [^^] [^^^] [ответить]  
  • +/
    В этой серии статей освещены некоторые подходы
    https://habrahabr.ru/company/ivi/blog/236065/
     

  • 1.18, karlen (?), 00:51, 26/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    http://livesurf.ru/promo/219687 Программа автосерфинга
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру