This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
решение_hast [2011/07/29 09:39] val |
решение_hast [2017/10/02 09:48] (current) val [HAST и HEARTBEAT] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Решение HAST ====== | ====== Решение HAST ====== | ||
| - | [[http://wiki.freebsd.org/HAST]] | + | * [[http://wiki.freebsd.org/HAST|HAST - Highly Available Storage]] |
| - | ===== Подготовка стенда ===== | + | ===== Подготовка узлов ===== |
| - | Будем использовать устройство ad1 | + | Добавляем жесткие диски, создаем точки монтирования |
| <code> | <code> | ||
| - | gateN# mkdir /disk2 | + | nodeN# dmesg | grep ada1 |
| + | |||
| + | nodeN# mkdir /disk2 | ||
| </code> | </code> | ||
| ===== Настройка узлов ===== | ===== Настройка узлов ===== | ||
| <code> | <code> | ||
| - | gateN# cat /etc/hast.conf | + | nodeN# cat /etc/hast.conf |
| </code><code> | </code><code> | ||
| resource r0 { | resource r0 { | ||
| - | on gate1 { | + | on node1 { |
| - | local /dev/ad1 | + | local /dev/ada1 |
| - | remote 10.0.0.2 | + | remote 10.Z.M.200+X |
| } | } | ||
| - | on gate2 { | + | on node2 { |
| - | local /dev/ad1 | + | local /dev/ada1 |
| - | remote 10.0.0.1 | + | remote 10.Z.M.100+X |
| } | } | ||
| } | } | ||
| </code><code> | </code><code> | ||
| - | gateN# cat /etc/rc.conf | + | nodeN# service hastd rcvar |
| - | ... | + | |
| - | hastd_enable=yes | + | |
| - | gateN# /etc/rc.d/hastd start | + | nodeN# service hastd start |
| </code> | </code> | ||
| ===== Инициализация ===== | ===== Инициализация ===== | ||
| <code> | <code> | ||
| - | gateN# hastctl create r0 | + | nodeN# hastctl status |
| - | gate1# hastctl role primary r0 | + | nodeN# hastctl create r0 |
| - | gate2# hastctl role secondary r0 | + | node1# hastctl role primary r0 |
| - | gateN# hastctl status | + | node2# hastctl role secondary r0 |
| - | gate1# newfs /dev/hast/r0 | + | nodeN# hastctl status |
| - | gate1# mount /dev/hast/r0 /disk2 | + | node1# newfs /dev/hast/r0 |
| - | gate1# cp /etc/rc.conf /disk2/ | + | node1# mount /dev/hast/r0 /disk2 |
| + | |||
| + | node1# cp /etc/rc.conf /disk2/ | ||
| </code> | </code> | ||
| ===== Смена ролей узлов кластера ===== | ===== Смена ролей узлов кластера ===== | ||
| <code> | <code> | ||
| - | gate1# umount /disk2 | + | node1# umount /disk2 |
| - | gate1# hastctl role secondary r0 | + | node1# hastctl role secondary r0 |
| - | gate2# hastctl role primary r0 | + | node2# hastctl role primary r0 |
| - | gate2# fsck -y -t ufs /dev/hast/r0 | + | node2# fsck -y -t ufs /dev/hast/r0 |
| - | gate2# mount /dev/hast/r0 /disk2 | + | node2# mount /dev/hast/r0 /disk2 |
| </code> | </code> | ||
| - | ===== Остановка заркалирования ===== | + | ===== Отключение зеркалируемого раздела ===== |
| <code> | <code> | ||
| - | gate2# umount /disk2 | + | node2# umount /disk2 |
| - | gate2# hastctl role secondary r0 | + | node2# hastctl role secondary r0 |
| </code> | </code> | ||
| - | ===== Дополнительные материалы ===== | + | ===== Решение ситуации split brain ===== |
| - | + | ||
| - | ==== Решение ситуации split brain ==== | + | |
| Выбираем узел, данные которого будут затерты. | Выбираем узел, данные которого будут затерты. | ||
| <code> | <code> | ||
| - | gateZ# hastctl create r0 | + | nodeZ# hastctl create r0 |
| - | gateZ# hastctl role secondary r0 | + | nodeZ# hastctl role secondary r0 |
| - | gateZ# hastctl status | + | nodeM# hastctl role primary r0 |
| - | gateM# hastctl status | + | nodeZ# hastctl status |
| + | |||
| + | nodeM# hastctl status | ||
| </code> | </code> | ||
| + | ===== HAST и Heartbeat ===== | ||
| + | |||
| + | - Состояние init возникает при запуске hastd на secondary узле, если он остановился и стартует раньше primary | ||
| + | - Ситуация Split-Brain возникает при запуске hastd на secondary узле, если он остановился позже primary и heartbeat успел его назначить primary, а запускаются оба узла синхронно и heartbeat считает что primary должен оставаться прежним. | ||
| + | |||
| + | <code> | ||
| + | nodeN# service heartbeat stop | ||
| + | |||
| + | nodeN# cat /usr/local/etc/ha.d/resource.d/hast | ||
| + | </code><code> | ||
| + | #!/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 | ||
| + | </code><code> | ||
| + | nodeN# chmod +x /usr/local/etc/ha.d/resource.d/hast | ||
| + | |||
| + | nodeN# cat /usr/local/etc/ha.d/haresources | ||
| + | </code><code> | ||
| + | node1.corpX.un hast | ||
| + | </code><code> | ||
| + | nodeN# service heartbeat start | ||
| + | </code> | ||