Начиная с 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 в хранилище freenashastzpool 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
URL: http://qq929962616.72pines.com/2012/03/configure-highly-avai.../
Обсуждается: http://www.opennet.dev/tips/info/2723.shtml
Почему просто не использовать FreeBSD? Ведь удобнее же! Мало того что этот FreeNAS тормозит, так ещё и кучу неудобств в использовании: ни тебе обновлений вовремя, ни портов-пэкеджей, плюс куча граблей типа перезаписываемых конфигов и тд. _Зачем_??
FreeNAS-ом очень удобно управлять через web с рабочей станции, для домашнего хранилища самое то. Загрузился и всё уже из коробки работает, не нужно что-то настраивать и устанавливать.
И для этого дома надо держать 2 ноды?
насколько оно стабильно?
оно стабильно при следующих условиях:
1. все стандартные скирпты ты выкидываешь на помойку и пишешь свои, учитывая всякие разные внештатные ситуации.
2. настраиваешь мониторинг, который тебе будет говорить о внештатных ситуациях и оперативно на них реагируешь.
а теперь представляем: падает твой мастер-узел и лежит сутки, пока ты бегаешь за сгоревшей железкой. В момент починки у тебя выключают свет на часок и ложится еще и слайв-узел. Но вот дают свет и ты запускаешь оба сервера. При поднятии главным опять становится master-узел и все твои данные за сутки ты теряешь. Ладно, автоматом hast не засинхронит slave, для этого потребуется ручное вмешательство, а это значит, что ты сможешь переключиться на slave, но вот ведь беда, заметишь ты это часика через два, когда на мастере уже тоже набегут будут какие-то уникальные изменения и тебе придется терять либо сутки, либо последние два часа. Это сложный случай с кучей не очевидностей, а теперь простой:
Какой-то глюк, мастер-нода уходит в ребут, переключаемся автоматом на слейв, записываем туда какие-то данные, поднимается master-нода, перехватывает управление на себя - о данных, которые записали на слейв можно забыть. Вопрос: а отказоустойчивое ли хранилище?
Надо проверять это все, как именно работает master-slave, наверняка есть какие-то метаданные, которые не позволят мастеру стать мастером при возникшем сбое. Я не берусь утверждать что-то про HAST, поскольку не использовал его, но я использовать аналогичное решение Linux/DRBD и там такие ситуации, по крайней мере в master-slave зарешаны весьма хорошо. Есть претензии к режиму master-master, но это отдельная сложная тема.
Резюмируя, не надо делать поспешных выводов, не изучив детали.
Я пишу мысли не из головы. Я пользуюсь hast-ом уже больше года.
> Я пишу мысли не из головы. Я пользуюсь hast-ом уже больше года.а откуда у тебя мысли вылазят?
> Надо проверять это все, как именно работает master-slave, наверняка есть какие-то метаданные,
> которые не позволят мастеру стать мастером при возникшем сбое. Я не
> берусь утверждать что-то про HAST, поскольку не использовал его, но я
> использовать аналогичное решение Linux/DRBD и там такие ситуации, по крайней мере
> в master-slave зарешаны весьма хорошо. Есть претензии к режиму master-master, но
> это отдельная сложная тема.
> Резюмируя, не надо делать поспешных выводов, не изучив детали.Самая интересная тема здесь это поведение в ситуации split brain, и она не раскрыта
Вам забыли сказать, что FreeNAS сдох и вместо него уже давно пилят NAS4Free. В последнем все манипуляции - штатные и делаются несколькими кликами в вебморде.
> Вам забыли сказать, что FreeNAS сдох и вместо него уже давно пилят
> NAS4Free. В последнем все манипуляции - штатные и делаются несколькими кликами
> в вебморде.FreeNAS ещё все эти форки переживёт, последний релиз FreeNAS вышел 14 декабря, а новая тестовая версия - вчера. NAS4Free в этом время буксует на ровном месте и обещаниями кормит.
Какими обещаниями? Все то что описано в топике там уже давно реализовано из коробки и прикручено к вебморде. Где ваш FreeNAS теперь?
Немного не по теме: а кто-нибудь сравнивал производительность FreeBSD/HAST и Linux/DRBD ? Что быстрее? Особенно интересно было бы узнать результаты при использовании СУБД (Oracle и MySQL)в качестве "нагрузки".
Предположу, что большой разницы не будет. Синхронная реплика в сетях tcpip ограничена по iops-ам существенно, в идельном случае ~2000-3000 IOPS-ов.
Спасибо за статью. Очень полезная штука - настраивал под Ubuntu (http://sysadm.pp.ua/linux/carp-ubuntu.html) кластер из трех серверов - до сих пор на проде работает. Не подскажите, если ли возможность(технология) для geodistributed redundent IP, может сталкивались ? Заранее спасибо.
В этой серии статей освещены некоторые подходы
https://habrahabr.ru/company/ivi/blog/236065/
http://livesurf.ru/promo/219687 Программа автосерфинга