HAST (Highly Available Storage) позволяет решить задачи прозрачного физического дублирования блочных устройств разделенных машин посредством передачи данных по сети tcp/ip. Диск главного устройства доступен в директории /dev/hast. На практике, это выглядит примерно так: первая машина работает с блочным устройством /dev/hast/XXX, hastd при этом все изменения передает на ведомую машину в соответствующее устройство, например, /dev/YYY. При этом при отключении ведущей машины, на ведомой машине можно смонтировать устройство /dev/hast/XXX и продолжить работу.
HAST (Highly Available Storage) позволяет решить задачи прозрачного физического дублирования блочных устройств разделенных машин посредством передачи данных по сети tcp/ip. Диск главного устройства доступен в директории /dev/hast. На практике, это выглядит примерно так: первая машина работает с блочным устройством /dev/hast/XXX, hastd при этом все изменения передает на ведомую машину в соответствующее устройство, например, /dev/YYY. При этом при отключении ведущей машины, на ведомой машине можно смонтировать устройство /dev/hast/XXX и продолжить работу.
Получается, что у нас возможность создать raid1 по сети. Рассмотрим возможность автоматизации процессов по обеспечению высокой доступности данных. Рекомендую ознакомиться с предыдущей заметкой о обеспечении высокой доступности виртуального сетевого адреса системы. Приступим к созданию хранилища HAST.
Создадим файл /etc/hast.conf на обеих системах:resource data { on carp0 { local /dev/ada0p3 remote 192.168.12.57 } on carp0 { local /dev/ada0p3 remote 192.168.12.56 } }Рассмотрим структуру файла:
data: role: init provname: data localpath: /dev/ada0p3 extentsize: 0 (0B) keepdirty: 0 remoteaddr: 192.168.12.57 replication: fullsync dirty: 0 (0B) statistics: reads: 0 writes: 0 deletes: 0 flushes: 0 activemap updates: 0В вашем случае состояние поля role будет init. Проделайте тоже самое на второй машине.
Теперь назначим первую машину ведущей:
hastctl role primary RECOURCEна второй машине выполним
hastctl role secondary RECOURCEТеперь снова смотрим статус и должны увидеть, что на первой машине поле role стало primary:
data: role: primary provname: data localpath: /dev/ada0p3 extentsize: 2097152 (2.0MB) keepdirty: 64 remoteaddr: 192.168.12.57 replication: fullsync status: degraded dirty: 4194304 (4.0MB) statistics: reads: 0 writes: 0 deletes: 0 flushes: 0 activemap updates: 0на второй secondary:
data: role: secondary provname: data localpath: /dev/ada0p3 extentsize: 2097152 (2.0MB) keepdirty: 0 remoteaddr: 192.168.12.56 replication: fullsync status: complete dirty: 0 (0B) statistics: reads: 0 writes: 32 deletes: 0 flushes: 0 activemap updates: 0Очень важно, чтобы при этом поле status было с значение complete. Если у вас поле status не имеет значения complete продолжать не стоит, необходимо добиться, чтобы поле status имело значение complete. Просмотрите файл /var/log/messages, там будет указана причина невозможности соединения с соседней системой. Чаще всего проблемы имеют сетевой характер или по причине неверно сконфигурированных блочных устройств. Теперь когда поле status имеет значение complete, наши блочные устройства синхронизированны, можно создать фс и смотнировать. Например, так:
newfs -U -L -O 2 /dev/hast/data mount -t ufs /dev/hast/data /dataПри этом вы увидите дисковую активность на второй системе. Теперь вы имеете дубликат блочного устройства первой системы. Можно провести простой тест: на первой системе:
dd if=/dev/zero of=/data/system1.dd bs=1m count=500 umount /data poweroffна второй системе:
hastctl role primary data fsck /dev/hast/data mount /dev/hast/data /dataОбратите внимание, что при назначении primary роли, устройство /dev/hast/XXX появляется не сразу. Это очень важно! Если вы все правильно сделали, тогда на второй системе у вас устройство смонтируется и вы сможете увидеть файл, созданный на первой машине. Можно создать файл для проверки синхронизации с первой машиной. Теперь при включении первой системы, вам необходимо назначить ей роль secondary для синхронизации изменений в фс, сделанных на второй машине. При этом увидите дисковую активность. Теперь можно отключить вторую систему и дать роль primary первой системе, смонтировать и увидеть файлы, созданные на второй системе. На этом все.
Теперь автоматизируем процесс. Напишем скрипт, состоящий из 3х частей: 1 часть - up - перевод системы в состояние primary, 2 часть - down - перевод системы в состояние secondary, 3 часть - boot - определение своего состояния при загрузке. Поясню: при загрузке системы, устройству carp назначается высокий приоритет (200) и через некоторое время скрипт определяем состояние этого устройства. Если оно стало MASTER, значит текущая система главная и блочное устройство должно быть в состоянии primary. Если оно BACKUP, то запустить все устройства в состоянии secondary. При отключении ведущей системы через подсистему devd, переводим ведомую систему в ведущую, при этом приоритет устройства carp понижается (станет 10). То есть при загрузке бывшей ведущей системы, скрипт даст устройству carp более высокий приоритет (200) и оно не сможет стать MASTER, при этом скрипт попросит HAST дать своим ресурсам роль secondary. Скрипт, не совершенен, например, в ситуации когда система 1 загрузилась быстрее системы 2, в то время когда система 2 была ведущей. Возможно это получится решить...
Вот текст скрипта:
#!/bin/sh export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin state=$1 carpstate=`ifconfig carp0 | grep carp: | awk '{ print $2 }'` resources="data" delay=3 case "$1" in up) ifconfig carp0 vhid 1 advskew 10 for i in ${resources}; do hastctl role primary $i; sleep ${delay}; done for i in ${resources}; do for n in $( jot 60 ); do if [ -c "/dev/hast/${i}" ] && break; then sleep 0.5 fi if [ ! -c "/dev/hast/${i}" ]; then sleep 1 fi done done for i in ${resources}; do fsck -y -t ufs /dev/hast/$i sleep 5 done for i in ${resources}; do mount -t ufs /dev/hast/$i /$i done ;; down) # ifconfig carp0 vhid 1 advskew 200 for i in ${resources}; do umount /$i; sleep $delay ; done for i in ${resources}; do hastctl role secondary $i; sleep $delay; done ;; boot) ifconfig carp0 create ifconfig carp0 vhid 1 advskew 200 pass p@ssw0rd 192.168.12.220 255.255.255.0 sleep 10 if [ "${carpstate}" = "MASTER" ]; then /sbin/hastd for i in ${resources}; do hastctl role primary $i; sleep ${delay}; done for n in $( jot 60 ); do if [ -c "/dev/hast/${i}" ] && break; then sleep 0.5 fi if [ ! -c "/dev/hast/${i}" ]; then sleep 0.5 fi done for i in ${resources}; do fsck -y -t ufs /dev/hast/$i done for i in ${resources}; do mount -t ufs /dev/hast/$i /$i done ifconfig carp0 advskew 10 else /sbin/hastd for i in ${resources}; do hastctl role secondary $i; sleep ${delay}; done fi esacТеперь у вас есть система, которая может жить относительно самостоятельно. Самое важное, что система в состоянии определить кто в данный момент главный. Это очень важно. Надеюсь, труд окажется полезным.
Комментарии (0)
Добавление комментариев закрыто.