Репликация дисков между двумя серверами на FreeBSD+HASTD

2 сервера под управлением FreeBSD 8.1-RELEASE:

host1 (192.168.1.2) и host2 (192.168.1.1)
На каждом сервере диски: ad0 с системой, ad1 — неразмеченный.

ad1 будет под контролем HASTd и ZFS, на которой будет работать JAIL.
Сервера скоммутированы на свиче в одну подсеть (мой случай — 192.168.1.0/24), 1 Gbit/s интерфейс.
Между серверами будет поднят виртуальный (carp) IP 192.168.1.5, принадлежащий jail-у.

Пишем /etc/rc.conf.

На host1:

zfs_enable="YES"
hostname="host1"
ifconfig_em0="192.168.1.2/24"
defaultrouter="192.168.1.1"
hastd_enable="YES"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 advskew 100 pass password 192.168.1.5/24"
ezjail_enable="YES"

На host2:

zfs_enable="YES"
ifconfig_em0="192.168.1.1/24"
defaultrouter="192.168.1.1"
hastd_enable="YES"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 advskew 100 pass password 192.168.1.5/24"
ezjail_enable="YES"

Пишем конфиг ядра GENERIC-CARP для поддержки carp(4) ( есть впрочем вариант userland-ового net/ucarp ).

На обеих нодах:
Архитектура i386, соотв. /sys/i386/conf/GENERIC-CARP:

device carp

Компилируем и перезагружаемся, на обеих машинах.

make buildkernel KERNCONF=GENERIC-CARP;make installkernel KERNCONF=GENERIC-CARP;reboot

Пишем на обеих машинах одинаковый /etc/hast.conf:

on host1
{
      listen 192.168.1.2
}

on host2
{
      listen 192.168.1.1
}
resource shared
{
      on host1
      {
            local /dev/ad1
            remote 192.168.1.1
      }
      on host2
      {
            local /dev/ad1
            remote 192.168.1.2  
      }
}

Запускаем hastd (на обеих машинах):

/etc/rc.d/hastd restart

Создаем файловую систему для Jail/HASTd (делается только на одной машине, вторая получит все это добро через реплику) и сообщаем HAST-у, что он у нас будет мастером.

gpart create -s GPT ad1
gpart add -b 34 -s 4194230 -t freebsd-zfs ad1
hastctl create shared
hastctl role primary shared
zpool create jails hast/shared

Настроил ezjail на обеих машинах:

cat > "/usr/local/etc/ezjail.conf"
ezjail_jaildir=/jails
ezjail_jailtemplate=${ezjail_jaildir}/newjail
#ezjail_jailbase=${ezjail_jaildir}/basejail
ezjail_sourcetree=/usr/src
ezjail_ftphost=ftp.freebsd.org
ezjail_default_execute="/usr/bin/login -f root"
ezjail_default_flavour=""
ezjail_archivedir=`pwd -P`
ezjail_uglyperlhack="YES"
ezjail_devfs_enable="YES"
ezjail_procfs_enable="YES"
ezjail_mount_enable="YES"
ezjail_use_zfs="YES"
ezjail_jailzfs="jails"

Добавим новый джэйл на host1:

ezjail-admin create -s 10G -c zfs vm1 192.168.1.5
скопируем конфиг /usr/local/etc/ezjail/vm1 на host2.

Содержимое /root/carp_sw скрипта, ответственный за переключение (не забыть chmod +x /root/carp_sw):

#!/bin/sh
pool="shared"
case "$1" in
master)
        logger "carp_sw.sh: Switching to primary provider ${pool}."
        hastctl create ${pool}
        hastctl role primary ${pool}
        logger "zpool import: "
        sleep 10
        zpool import -f -d /dev/hast jails
        /etc/rc.d/jail onestart
        ;;
slave)
        logger "carp_sw.sh: Switching to slave profider for ${pool}."
        hastctl create ${pool}
        hastctl role secondary ${pool}
        ;;
esac

Также, чтобы упавшая и поднявшаяся машина не пыталась запускать jail, скажем ей что она теперь Slave. Содержимое /etc/rc.local на обеих машинах:

#!/bin/sh
sh /root/carp_sw slave

Остается все это позапускать (на обеих нодах):

/etc/rc.d/routing restart
/etc/rc.d/hastd restart

На host1:

sh /root/carp_sw master

На host2:

sh /root/carp_sw slave

Что получили в результате этой работы:

На carp-овом IP работает JAIL, который может содержать все что душе угодно — почтовый сервис, WEB приложение и пр. Как только обслуживающая этот jail физическая машина падает, работу на себя автоматически подхватывает второй сервер, который запускает JAIL на состояние максимально близкое к времени падени ноды. При этом HAST конфигурируется как MASTER. Когда-нибудь возвратившаяся упавшая машина становится SLAVE-ом, подхватывает реплику и готовится подстраховать MASTER-а

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong