Создание кластера Xen + drbd + Centos 5
Есть два сервера где много памяти, дисков и сетевых адаптеров, мы планируем на них развернуть сервера виртуальных машин под управлением Xen c автоматическим переходом машин на другой сервер (ноду) при падении одного из них.
Для этого потребуется кластерный свич (лучше два) который будет обслуживать только кластер.
Итак что имеем
А. управляемый свич с двумя не маршрутизируемыми вланами и общий инфраструктурный свич
Б. две машины с тремя (т.к. я разделяю управляющий, кластерный и бриджовый интерфейсы, если бриджовый и управляющий интерфейсы не разделять то хватит и двух, если задумаете использовать NLB или ISCSI, то интерфейсов должно быть больше) сетевыми картами и сидиромом для первоначальной установки ОС
Распишем сети
192.168.0.0/24 - моя сеть где работают сервера
10.0.0.0/24 - кластерная сеть
192.168.1.0/21 - админский влан
Машины для удобства назовем их Xen1 и Xen2
Конфиги машин:
Xen1
Name - xen1.local, xen1.xen, xen1
Os - Centos 5.9
Memory - 4G (для теста достаточно у ксена ограничение по-моему до 512G, но могу ошибаться)
Hdd1(sda) - 20g
Hdd2(sdb) - 100g
Eth0 - 192.168.1.2/24
Eth1 - 10.0.0.1/255.255.255.252
Eth2 -> xenbr0 - 192.168.0.1/24
Default GW - 192.168.0.254
Xen2
Name - xen2.local, xen2.xen, xen2
Os - Centos 5.9
Memory - 4G
Hdd1(sda) - 20g
Hdd2(sdb) - 100g
Eth0 - 192.168.1.3/24
Eth1 - 10.0.0.2/255.255.255.252
Eth2 -> xenbr0 - 192.168.0.2/24
Default GW - 192.168.0.254
2. Приступим:
Устанавливаем Centos 5.9 на обе машины
Диски размечаем следующим образом
sda1 – /boot – 2g
sda2 – swap – 4g
sda3 – / – все остальное пространство
в группах пакетов выбираем Server (и можно еще Server GUI, для начинающих)
Интерфейсы пока не настраиваем, только отключаем ipv6 и в имени хоста прописываем xen1 и xen2 соответственно, отключаем selunux (обязательно), iptables по вкусу (я не отключал). И ждем перезагрузки.
Логинимся в систему Xen1 под рутом (и все действия по конфигурации выполняем под рутом) и доставляем нужные пакеты
yum install kernel-xen xen kmod-drbd83-xen kmod-drbd83 drbd83 libvirt qemu
yum install heartbeat
тоже делаем и на xen2
именно так, потому что heartbeat не может встать пока не встанет xen
Я использовал штатные репозитории которые доступные в Centos 5.9 на момент написания статьи ничего не доставлял, если возникают проблемы то ищите эти пакеты в других репозиториях, или поставьте более поздние версии, но тогда могут отличаться конфиги, а это уже выходит за пределы данной статьи.
Далее правим grub
[root@xen1 xen]# vim /boot/grub/grub.conf
Там дописываем после kernel /xen.gz….. dom0_mem=1024M чтобы получилось следующие
Код: Выделить всё
default=0 timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-348.4.1.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-348.4.1.el5 dom0_mem=1024M
module /vmlinuz-2.6.18-348.4.1.el5xen ro root=LABEL=/ rhgb quiet
module /initrd-2.6.18-348.4.1.el5xen.img title CentOS (2.6.18-348.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-348.el5 dom0_mem=1024M
module /vmlinuz-2.6.18-348.el5xen ro root=LABEL=/ rhgb quiet
module /initrd-2.6.18-348.el5xen.img title CentOS-base (2.6.18-348.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-348.el5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.18-348.el5.img Код: Выделить всё
127.0.0.1 xen1.localdomain xen1
10.0.0.1 xen1.xen xen1
192.168.1.2 xen1.local xen1
10.0.0.2 xen2.xen xen2
192.168.1.3 xen2.local xen2 Код: Выделить всё
127.0.0.1 xen2.localdomain xen2
10.0.0.1 xen1.xen xen1
192.168.1.2 xen1.local xen1
10.0.0.2 xen2.xen xen2
192.168.1.3 xen2.local xen2 scp /boot/grub/grub.conf xen2:/boot/grub/grub.conf
идем в конфиг ксена по пути /etc/xen/xend-config.sxp и правим его
Код: Выделить всё
(logfile /var/log/xen/xend.log)
(loglevel DEBUG)
(xend-http-server yes)
(xend-unix-server yes)
(xend-relocation-server yes)
(xend-unix-path /var/lib/xend/xend-socket)
(xend-port 8000)
(xend-relocation-port 8002)
(xend-address '192.168.1.2')
(xend-relocation-address '10.0.0.1')
(xend-relocation-hosts-allow '^xen1\\.local$ ^xen1$ ^xen1\\.xen$ ^xen2\\.local$ ^xen2$ ^xen2\\.xen$ ^localhost$ ^localhost\\.localdomain$')
(network-script /bin/true) # убираем автоматическое создание бриджей xenbrX
(vif-script vif-bridge)
(dom0-min-mem 256)
(dom0-cpus 0)
(vnc-listen '0.0.0.0')
(vncpasswd '123456')
(keymap 'en-us') Код: Выделить всё
(logfile /var/log/xen/xend.log)
(loglevel DEBUG)
(xend-http-server yes)
(xend-unix-server yes)
(xend-relocation-server yes)
(xend-unix-path /var/lib/xend/xend-socket)
(xend-port 8000)
(xend-relocation-port 8002)
(xend-address '192.168.1.3')
(xend-relocation-address '10.0.0.2')
(xend-relocation-hosts-allow '^xen1\\.local$ ^xen1$ ^xen1\\.xen$ ^xen2\\.local$ ^xen2$ ^xen2\\.xen$ ^localhost$ ^localhost\\.localdomain$')
(network-script /bin/true) # убираем автоматическое создание бриджей xenbrX
(vif-script vif-bridge)
(dom0-min-mem 256)
(dom0-cpus 0)
(vnc-listen '0.0.0.0')
(vncpasswd '123456')
(keymap 'en-us') vi /etc/sysctl.conf
Код: Выделить всё
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_dynaddr = 1
net.ipv4.conf.all.rp_filter = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.conf.all.proxy_arp = 1scp /etc/sysctl.conf xen2:/etc/sysctl.conf
теперь настроим сеть
В первую очередь правим файл /etc/sysconfig/network на обоих машинах
Должно быть примерно следующие на xen1
Код: Выделить всё
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xen1
Код: Выделить всё
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xen2cd /etc/sysconfig/network-scripts
переписываем все интерфейсы
cat ifcfg-eth0 административный интерфейс
Код: Выделить всё
DEVICE=eth0 #указываем интерфейс
HWADDR=xx:xx:xx:xx:xx:xx #Здесь мак адрес сетевухи
BOOTPROTO=static # тип конфигурации (возможны еще типы dhcp, none)
BROADCAST=192.168.1.255 #Широковещательный адрес
IPADDR=192.168.1.2 #собственный адрес интерфейса
NETMASK=255.255.255.0 # Маска сети
ONBOOT=yes # Запускать при старте системыКод: Выделить всё
DEVICE=eth1
BOOTPROTO=static
BROADCAST=10.0.0.3
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=10.0.0.1
NETMASK=255.255.255.252
NETWORK=10.0.0.0
ONBOOT=yesКод: Выделить всё
DEVICE=eth2
BOOTPROTO=static
BROADCAST=192.168.0.255
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=192.168.0.1
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.254
ONBOOT=yes
BRIDGE=xenbr0 Код: Выделить всё
DEVICE=xenbr0
ONBOOT=yes
TYPE=Bridge
DELAY=0
PEERDNS=yes
STP=off cat ifcfg-eth0 административный интерфейс
Код: Выделить всё
DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx
BOOTPROTO=static
BROADCAST=192.168.1.255
IPADDR=192.168.1.3
NETMASK=255.255.255.0
ONBOOT=yesКод: Выделить всё
DEVICE=eth1
BOOTPROTO=static
BROADCAST=10.0.0.3
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=10.0.0.2
NETMASK=255.255.255.252
NETWORK=10.0.0.0
ONBOOT=yesКод: Выделить всё
DEVICE=eth2
BOOTPROTO=static
BROADCAST=192.168.0.255
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=192.168.0.2
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.254
ONBOOT=yes
BRIDGE=xenbr0 Код: Выделить всё
DEVICE=xenbr0
ONBOOT=yes
TYPE=Bridge
DELAY=0
PEERDNS=yes
STP=off После перезапуска машины должны пинговаться и должны подняться dom0 домены.
Как проверить пинг объяснять не буду, а стартовавший домен должен отвечать на команду
xm li
следующим образом
Код: Выделить всё
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 1024 2 r----- 3828.5vi /etc/drbd.conf
Код: Выделить всё
global { usage-count yes; }
common {
syncer { rate 100M;
al-extents 257;
}
}
resource r0 { protocol C;
startup { become-primary-on both; ### For Primary/Primary ###
degr-wfc-timeout 60;
wfc-timeout 30;
}
disk
{ on-io-error detach; }
net { allow-two-primaries; ### For Primary/Primary ###
cram-hmac-alg sha1;
shared-secret "mysecret";
after-sb-0pri discard-zero-changes;
after-sb-1pri violently-as0p;
after-sb-2pri violently-as0p;
}
on xen1 { device /dev/drbd0;
disk /dev/sdb1;
address 10.0.0.1:7788;
meta-disk internal;
}
on xen2 { device /dev/drbd0;
disk /dev/sdb1;
address 10.0.0.2:7788;
meta-disk internal;
}
} scp /etc/drbd.conf xen2: /etc/drbd.conf
На обоих серверах выполняем команды
drbdadm create-md r0
service drbd start
drbdsetup /dev/drbd0 primary –o
И курим около 20 минут, на 100гб пока синхронизируются диски.
Проверить работу можно командой
cat /proc/drbd
или
watch -n1 “cat /proc/drbd”
после синхронизации вы должны увидеть примерно следующие
Код: Выделить всё
version: 8.3.15 (api:88/proto:86-97)
GIT-hash: 0ce4d235fc02b5c53c1c52c53433d11a694eab8c build by mockbuild@builder10.centos.org, 2013-03-27 16:01:39
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
ns:243484 nr:410654 dw:424847 dr:421232 al:68 bm:60 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 Поскольку я экспериментировал на машинах поднятых на VirtualBox аппаратная виртуализация мне была недоступна, поэтому я взял дистрибутив Centos 5.6 и смонтировал его в /media
После этого запустил сервер nfs командой
service nfs start
и создал nfs шару командой
exportfs *:/media
после чего на машине xen2 ввел команду
watch -n1 “cat /proc/drbd”
а на машине xen1 запустил установку виртуальной машины командой
virt-install -p -n Centos -r 1024 --vcpus=2 --bridge=virbr0 --location=nfs:192.168.122.1:/media -f /dev/drbd0
и в текстовом режиме провел установку Centos 5.6, при этом периодически посматривал на машину xen2, чтобы видеть как работает DRBD (должна была идти синхронизация дисков)
после установки погасил машину и чуть поправил конфиг, заменил мост virbr0 на xenbr0 и добавил еще один интерфейс, после этого конфиг выглядел так
cat /etc/xen/Centos
Код: Выделить всё
name = "Centos"
uuid = "171caed6-123b-0f27-0af7-85e5e639f01f"
maxmem = 1024
memory = 1024
vcpus = 2
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
disk = [ "phy:/dev/drbd0,xvda,w" ]
vif = [ "mac=00:16:3e:6f:2e:71,bridge=xenbr0",
"mac=00:16:3e:6f:2e:72,bridge=xenbr0" ]scp /etc/xen/Centos xen2:/etc/xen/Centos
после чего запустил машину командой
xm create Centos
После того как виртуалка Centos запустилась, из сети 192.168.0.0 запустил
ping -t ip.addr.vir.mash (где ip.addr.vir.mash ip адрес виртуальной машины)
и проверил как у нас работает миграция виртуалок с сервера на сервер
xm migrate Centos xen2 --live
При этом на xen2 выполнил команду
xm li
Вот ее вывод
Код: Выделить всё
Name ID Mem(MiB) VCPUs State Time(s)
Centos 3 629 0 -bp--- 0.0
Domain-0 0 1024 2 r----- 4051.9Код: Выделить всё
Name ID Mem(MiB) VCPUs State Time(s)
Centos 3 1024 2 -b---- 2.3
Domain-0 0 1024 2 r----- 4073.5 Для начала проверяем что у нас с каталоге /etc/ha.d
ls -al /etc/ha.d
вывод должен быть следующим
-rwxr-xr-x 1 root root 745 Фев 6 2008 harc
drwxr-xr-x 2 root root 4096 Фев 6 2008 rc.d
-rw-r--r-- 1 root root 692 Фев 6 2008 README.config
drwxr-xr-x 2 root root 4096 Фев 6 2008 resource.d
-rw-r--r-- 1 root root 7186 Фев 6 2008 shellfuncs
Создаем необходимые каталоги на обеих системах
mkdir -p /etc/ha.d/xen/auto.xen1
mkdir -p /etc/ha.d/xen/auto.xen2
на обоих серверах создаем симлинк на конфиг Centos
ln -s /etc/xen/Centos /etc/ha.d/xen/auto.xen1/Centos
Создаем основной конфиг ha.cf
cat /etc/ha.d/ha.cf
Код: Выделить всё
keepalive 2
deadtime 30
warntime 10
initdead 30
debugfile /var/log/heartbeat/debug.log
logfile /var/log/heartbeat/logfile.log
logfacility local0
bcast eth1
auto_failback on
node xen1
node xen2
respawn hacluster /usr/lib64/heartbeat/ipfail
compression bz2 compression_threshold 2cat /etc/ha.d/authkeys
Код: Выделить всё
auth 1
1 sha1 6723jsp[;.;,m,er23r54235665v90jnsdcmsc%$jnsdc8*(sdcnk chmod 600 /etc/ha.d/authkeys
Создаем файл haresources
cat /etc/ha.d/haresources
Код: Выделить всё
xen1 xendomains.xen1
xen2 xendomains.xen2 cd /etc/ha.d/
scp haresources authkeys ha.cf xen2:/etc/ha.d/
копируем файлы
cp /etc/init.d/xendomains /etc/ha.d/resource.d/xendomains.xen1
открываем его на запись т правим строки
Код: Выделить всё
LOCKFILE=/var/lock/subsys/xendomains
XENDOM_CONFIG=/etc/sysconfig/xendomainsКод: Выделить всё
LOCKFILE=/var/lock/subsys/xendomains.xen1
XENDOM_CONFIG=/etc/ha.d/xen/xen1 cp /etc/init.d/xendomains /etc/ha.d/resource.d/xendomains.xen2
открываем его на запись и правим строки
Код: Выделить всё
LOCKFILE=/var/lock/subsys/xendomains
XENDOM_CONFIG=/etc/sysconfig/xendomainsКод: Выделить всё
LOCKFILE=/var/lock/subsys/xendomains.xen2
XENDOM_CONFIG=/etc/ha.d/xen/xen2Для хоста xen1
cat /etc/ha.d/xen/xen1
Код: Выделить всё
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="xen2 --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.xen1
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300 Код: Выделить всё
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="xen2 --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.xen2
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300cat /etc/ha.d/xen/xen1
Код: Выделить всё
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="xen1 --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.xen1
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300 Код: Выделить всё
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="xen1 --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.xen2
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300Вот мои сервисы по запросу
chkconfig --list | grep 3:вкл
Код: Выделить всё
acpid 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
auditd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
autofs 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
cpuspeed 0:выкл 1:вкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
crond 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
drbd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
gpm 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
heartbeat 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
hidd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
iptables 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
irqbalance 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
iscsi 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
iscsid 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
libvirt-guests 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
libvirtd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
lm_sensors 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
lvm2-monitor 0:выкл 1:вкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
mcstrans 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
mdmonitor 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
messagebus 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
modclusterd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
netfs 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
network 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
nfslock 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
portmap 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
rawdevices 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
readahead_early 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
restorecond 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
rpcgssd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
rpcidmapd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
sendmail 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
sshd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
syslog 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
virt-who 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
xend 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
xfs 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
xinetd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
yum-updatesd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл