====== Решение HAST ====== * [[http://wiki.freebsd.org/HAST|HAST - Highly Available Storage]] ===== Подготовка узлов ===== Добавляем жесткие диски, создаем точки монтирования nodeN# dmesg | grep ada1 nodeN# mkdir /disk2 ===== Настройка узлов ===== nodeN# cat /etc/hast.conf resource r0 { on node1 { local /dev/ada1 remote 10.Z.M.200+X } on node2 { local /dev/ada1 remote 10.Z.M.100+X } } nodeN# service hastd rcvar nodeN# service hastd start ===== Инициализация ===== nodeN# hastctl status nodeN# hastctl create r0 node1# hastctl role primary r0 node2# hastctl role secondary r0 nodeN# hastctl status node1# newfs /dev/hast/r0 node1# mount /dev/hast/r0 /disk2 node1# cp /etc/rc.conf /disk2/ ===== Смена ролей узлов кластера ===== node1# umount /disk2 node1# hastctl role secondary r0 node2# hastctl role primary r0 node2# fsck -y -t ufs /dev/hast/r0 node2# mount /dev/hast/r0 /disk2 ===== Отключение зеркалируемого раздела ===== node2# umount /disk2 node2# hastctl role secondary r0 ===== Решение ситуации split brain ===== Выбираем узел, данные которого будут затерты. nodeZ# hastctl create r0 nodeZ# hastctl role secondary r0 nodeM# hastctl role primary r0 nodeZ# hastctl status nodeM# hastctl status ===== HAST и Heartbeat ===== - Состояние init возникает при запуске hastd на secondary узле, если он остановился и стартует раньше primary - Ситуация Split-Brain возникает при запуске hastd на secondary узле, если он остановился позже primary и heartbeat успел его назначить primary, а запускаются оба узла синхронно и heartbeat считает что primary должен оставаться прежним. nodeN# service heartbeat stop nodeN# cat /usr/local/etc/ha.d/resource.d/hast #!/bin/sh case $1 in status) hastctl status r0 | grep -q 'init' && hastctl role secondary r0 ;; start) hastctl role primary r0 sleep 60 fsck -y -t ufs /dev/hast/r0 mount /dev/hast/r0 /disk2 ;; stop) mount | grep -q hast && umount /disk2 hastctl role secondary r0 ;; esac exit 0 nodeN# chmod +x /usr/local/etc/ha.d/resource.d/hast nodeN# cat /usr/local/etc/ha.d/haresources node1.corpX.un hast nodeN# service heartbeat start