Мар 19 2011
Репликация дисков между двумя серверами на 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:
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:
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:
{
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 add -b 34 -s 4194230 -t freebsd-zfs ad1
hastctl create shared
hastctl role primary shared
zpool create jails hast/shared
Настроил ezjail на обеих машинах:
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):
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 на обеих машинах:
sh /root/carp_sw slave
Остается все это позапускать (на обеих нодах):
/etc/rc.d/hastd restart
На host1:
На host2:
Что получили в результате этой работы:
На carp-овом IP работает JAIL, который может содержать все что душе угодно — почтовый сервис, WEB приложение и пр. Как только обслуживающая этот jail физическая машина падает, работу на себя автоматически подхватывает второй сервер, который запускает JAIL на состояние максимально близкое к времени падени ноды. При этом HAST конфигурируется как MASTER. Когда-нибудь возвратившаяся упавшая машина становится SLAVE-ом, подхватывает реплику и готовится подстраховать MASTER-а