HAST (Highly Avalible Storage) технология позволяющая создавать отказоустойчивые хранилища (Primary-Secondary) используя несколько машин. Эта технология может помочь при создании кластера высокой доступности (HA). HAST появился в FreeBSD начиная с 8.1. В текущей версии HAST можно использовать только две машины. HAST работает на уровне блоков и не зависит от файловой системы, т.е. можно использовать ZFS или UFS.
Эта технология работает по TCP. Для работы используется демон hastd и утилита для управления hastctl.
Использование.
Имеем две машины (ноды)
host1 192.168.1.2
host2 192.168.1.9
на обоих машинах стоит дополнительный диск ad3.host2 192.168.1.9
HAST готов к использованию сразу, без дополнительных установок. Для конфигурирования создадим файл /etc/hast.conf
resource my {
on host1 {
local /dev/ad3
remote 192.168.1.9
}
on host2 {
local /dev/ad3
remote 192.168.1.2
}
}
т.е. host1 имеет диск ad3 и синхронизируется с 192.168.1.9 (host2), а для host2 соответственно наоборот.on host1 {
local /dev/ad3
remote 192.168.1.9
}
on host2 {
local /dev/ad3
remote 192.168.1.2
}
}
Сделайте такой же файл на другой машине.
host1# hastctl create my
host1# hastd
host1# hastd
После этого демон должен запустится, проверим, что все работает
host1# hastctl status
должно выдать вроде этого
my:
role: init
provname: my
localpath: /dev/ad3
extentsize: 0
keepdirty: 0
remoteaddr: 192.168.1.2
replication: memsync
dirty: 0 bytes
role: init
provname: my
localpath: /dev/ad3
extentsize: 0
keepdirty: 0
remoteaddr: 192.168.1.2
replication: memsync
dirty: 0 bytes
Сделаем такие же действия на другой машине
host2# hastctl create my
host2# hastd
host2# hastd
Теперь раздадим роли машинам. Например, host1 будет главным, а host2 - резервным.
host1# hastctl role primary my
host2# hastctl role secondary my
host2# hastctl role secondary my
После того, как host2 стал secondary, должна начаться синхронизация. В первый раз она не должна занять много времени.
Проверим, что все работает.
host1# hastctl status
my:
role: primary
provname: my
localpath: /dev/ad3
extentsize: 2097152
keepdirty: 0
remoteaddr: 192.168.1.9
replication: memsync
status: complete
dirty: 0 bytes
my:
role: primary
provname: my
localpath: /dev/ad3
extentsize: 2097152
keepdirty: 0
remoteaddr: 192.168.1.9
replication: memsync
status: complete
dirty: 0 bytes
Для нас важно, чтобы был статус complete. Если статус другой, проверяем, что не так.
Теперь создадим файловую систему. Не смотря на то что можно использовать UFS лучше использовать ZFS, чтобы не приходилось запускать fsck.
Создадим пул используя появившееся устройство /dev/hast/my
Теперь создадим файловую систему. Не смотря на то что можно использовать UFS лучше использовать ZFS, чтобы не приходилось запускать fsck.
Создадим пул используя появившееся устройство /dev/hast/my
host1# zpool create mydisk /dev/hast/my
host1# zpool list
host1# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
mydisk 95G 84.5K 95G 0% ONLINE -
mydisk 95G 84.5K 95G 0% ONLINE -
На второй машине этого делать не надо.
HAST настроен.
Тестирование.
Создадим несколько файлов в mydisk и протестируем нашу систему. Для тестирования перезагрузим ноду с primary, т.е. host1.
После перезагрузки посмотрим состяние пула
HAST настроен.
Тестирование.
Создадим несколько файлов в mydisk и протестируем нашу систему. Для тестирования перезагрузим ноду с primary, т.е. host1.
После перезагрузки посмотрим состяние пула
host1# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
mydisk - - - - FAULTED -
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
mydisk - - - - FAULTED -
Это случилось потому что пропало устройство /dev/hast/my Экспортируем пул и поменяем роль host1 на secondary
host1# zpool export -f my
host1# hastctl role secondary my
host1# hastctl role secondary my
А host2 сделаем основным и импортируем пул.
host2# hastctl role primary my
host2# zpool import -f mydisk
host2# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
mydisk 95G 84.5K 95G 0% ONLINE -
host2# zpool import -f mydisk
host2# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
mydisk 95G 84.5K 95G 0% ONLINE -
Проверим наши файлы, они должны остаться.
Ошибки.
По умолчанию логи можно посмотреть в /var/log/message.
В результате некоторых действий можно добиться ситуации, когда вы обнаружите в логах запись Split brain - разделение сознания.
Это означает, что каждая из нод думает, что она главная и живет собственной жизнью. Такое может произойти если вы умудритесь
записать разную информацию на нодах или поставить обои машины в роль primary. Исправить эту ситуацию можно выбрав ту машину которая будет у вас secondary, и нужно сделать на ней:
hastctl role init my
hastctl create my
hastctl role secondary my
hastctl create my
hastctl role secondary my
После этого должен запуститься процесс синхронизации. Он может занять продолжительное время.
Автоматизация.
Эта система сделана для кластеризации, а именно для кластера высокой доступности. Например можно воспользоваться CARP
чтобы сделать постоянным. Можно написать собственные скрипты,
а можно воспользоваться стандартными. Автором HAST уже написаны готовые скрипты которые умеют определять на какой ноде сейчас primary.
Для работы следует установить ucarp:
Автоматизация.
Эта система сделана для кластеризации, а именно для кластера высокой доступности. Например можно воспользоваться CARP
чтобы сделать постоянным. Можно написать собственные скрипты,
а можно воспользоваться стандартными. Автором HAST уже написаны готовые скрипты которые умеют определять на какой ноде сейчас primary.
Для работы следует установить ucarp:
cd /usr/ports/net/ucarp
make && make install clean && rehash
make && make install clean && rehash
Скрипты находятся в /usr/share/expamles/hast/
Скопируйте их в /домашний каталог/sbin/hastd/ так предлагается по умолчанию и отредактируйте переменные в начале скриптов
ucarp.sh, ucarp_down.sh, ucarp_up.sh
Сделейте это на обоих нодах и запустите ucarp.sh на обоих нодах.
Дополнительные возможности.
У HAST существует три типа репликаций. Они различаются тем когда данные считаются записанными.
Скопируйте их в /домашний каталог/sbin/hastd/ так предлагается по умолчанию и отредактируйте переменные в начале скриптов
ucarp.sh, ucarp_down.sh, ucarp_up.sh
Сделейте это на обоих нодах и запустите ucarp.sh на обоих нодах.
Дополнительные возможности.
У HAST существует три типа репликаций. Они различаются тем когда данные считаются записанными.
- memsync - Данные операции записи считаются завершенными когда запись локальна завершена и когда удаленный узел принял данные, но до того как записать данные. Данные на удаленной ноде начинают писаться, как только отправлен ответ.
- fullsync - Данные операции записи считаются завершенными когда запись завершена локально и на удаленной ноде запись тоже завершена.
- async - Данные записи считаются завершенными когда запись завершена локально. Это наиболее быстрый способ записи.
На момент написания статьи работает только memsync.
Дополнительную информацию можно прочитать на http://wiki.freebsd.org/HAST
Заключение.
HAST только появился, у него богатые возможности для организации хранилища высокой доступности. В данный момент еще не все работает, но это хорошее начало для кластеризации на FreeBSD.
Перед тем как работать с HAST в боевых условиях рекомендую потренироваться. У меня были ситуации, когда secondary не хотел брать данные с primary, было что неаккуратные движения приводили к "Split Brain". Данные, правда, потеряны не были, но много времени было потеряно на синхронизации.
Дополнительную информацию можно прочитать на http://wiki.freebsd.org/HAST
Заключение.
HAST только появился, у него богатые возможности для организации хранилища высокой доступности. В данный момент еще не все работает, но это хорошее начало для кластеризации на FreeBSD.
Перед тем как работать с HAST в боевых условиях рекомендую потренироваться. У меня были ситуации, когда secondary не хотел брать данные с primary, было что неаккуратные движения приводили к "Split Brain". Данные, правда, потеряны не были, но много времени было потеряно на синхронизации.
Статья написана при поддержке компании Uniadmins.
roelofpm
2010-11-17 04:11 pm (UTC)
Спасибо, давнёхонько не читал подобного.
2010-12-25 01:04 pm (UTC)
hastd: remote address not configured for resource shared
не пойму в чем косяк
/etc/hast.conf:
# Global section
control uds:///var/run/hastctl
replication fullsync
timeout 5
on host1
{
listen tcp4://10.10.0.1:8457
}
on host2
{
listen tcp4://10.10.0.2:8457
}
resource shared
{
on host1
{
local /dev/da0s2
remote tcp4://10.10.0.1
}
on host2
{
local /dev/da0s2
remote tcp4://10.10.0.2
}
}
не сталкивался?
2010-12-25 07:07 pm (UTC)
2010-12-25 07:38 pm (UTC)
{
listen tcp4://10.10.0.1:8457
}
on host2
{
listen tcp4://10.10.0.2:8457
}
resource shared
{
on host1
{
local /dev/da0s2
remote tcp4://10.10.0.2
}
on host2
{
local /dev/da0s2
remote tcp4://10.10.0.1
}
}
наверно так правильнее будет.
host1 - 10.10.0.1 host2 - 10.10.0.2
тока результат такой же =(
hastd: remote address not configured for resource shared
2010-12-26 10:57 am (UTC)
resource shared
{
on host1
{
local /dev/da0s2
remote 10.10.0.2
}
on host2
{
local /dev/da0s2
remote 10.10.0.1
}
}
Репликация fullsync официально не работает. hastd работает по tcp, поэтому можно не указывать.
hastctl create shared запускал перед запуском hastd?
Попробуй позапускать hastd только на одной машине, на второй останови.
2010-12-26 05:26 pm (UTC)
hastd: remote address not configured for resource shared
по поводу fullsync хз.
по поводу моей проблемы получил ответ с freebsd-fs@FreeBSD.org с таким содержанием:
node name should be a full hostname as obtained by gethostname(3), or only first part of the hostname, or node's UUID as found in the kern.hostuuid
sysctl(8) variable. I suppose yours host1/host2 don't match any. It may be e.g. "hostname".
2010-12-26 07:49 pm (UTC)
2010-12-26 08:13 pm (UTC)
2011-01-18 07:01 pm (UTC)
Супер блог!
2011-06-04 10:28 am (UTC)
Занятный блог
2011-07-06 02:19 am (UTC)