part1 -Load balancing Web cluster with nginx apache2 php5 mysql glusterfs drbd heatbeat pacemaker nfs lvm on ubuntu 12.04 LTS

vladimir simeonov
06/02/2013

Кратък коментар отностно защитни стени – възможно, дори желателно, е да се реализира защитна стена преди клиентските връзки към DNS, Nginx сървърите, както и мрежду Tier 1, Tier 2.

На слой 2 работят единствено apache2 workers, които обработват заявките и връщат обратно съдържание, тук могат да се инсталират Php5, perl, python, и само и единствено mysql-client. Отново с цел консистентност на съдържанието, конфигурациите на apache2, файловете със скриптове (/var/www/) се предоставят от NFS дял, който се хоства заедно с MySQL DBs на Слой 3.

Тук се реализират следните неща:

  • Apache2
  • PHP5, MySQL-client, Perl, Python, etc.
  • NFS
  • LVM

Желателно е да има отново защитна стена между слой 2 и слой 3.

Слой 3 се състои от нодове, част от Pacemaker+Heartbeat Failover Cluster, като репликацията на файловите структури и данни е чрез DRBD. Слой 2 се свързва като NFS/MySQL client, към Cluster IP, като pacemaker следи и се грижи да предостави ресурсите от node-а в standby режим, когато Heartbeat установи, че активният node e offline.

Обобщен списък с технологии на слой 3:

  • Heartbeat
  • Pacemaker
  • DRBD
  • MySQL Server
  • NFS Server
  • LVM

След описване на топологията, следва кратка абстракция:

  1. Няма да намерите инструкция по инсталацията на ОС Ubuntu Server 12.04
  2. Машините в тестовата среда, която ще опишем детайлно се намират в една обща мрежа, като с изключение на Tier3, където не е желателно да се поставят Node-овете в отделни мрежи, другите слоеве могат да бъдат сегментирани, чрез Firewall/IPS/Router.
  3. Таблицата показва необходимите ресурси, имена на хостове и адреси:

За улеснение всички машини имат 30-50GB хард диск, като по време на инсталацията всички дялове са върху LVM.

Започваме изграждането от Tier3:

t3-node1/t3-node2 –

/etc/hosts

127.0.0.1       localhost

10.167.0.31     t3-node1

10.167.0.32     t3-node2

# The following lines are desirable for IPv6 capable hosts

::1     ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

t3-node1 –

/etc/network/interfaces

auto lo

iface lo inet loopback

# The primary network interface

auto eth0

iface eth0 inet static

address 10.167.0.31

netmask 255.255.255.0

network 10.167.0.0

broadcast 10.167.0.255

gateway 10.167.0.1

# dns-* options are implemented by the resolvconf package, if installed

dns-nameservers 10.162.0.10

dns-search intercard.bg

auto eth1

iface eth1 inet static

address 10.136.6.31

netmask 255.255.255.0

t3-node2 –

/etc/network/interfaces

auto lo

iface lo inet loopback

# The primary network interface

auto eth0

iface eth0 inet static

address 10.167.0.32

netmask 255.255.255.0

network 10.167.0.0

broadcast 10.167.0.255

gateway 10.167.0.1

# dns-* options are implemented by the resolvconf package, if installed

dns-nameservers 10.162.0.10

dns-search intercard.bg

auto eth1

iface eth1 inet static

address 10.136.6.32

netmask 255.255.255.0

Интерфейс eth0 е главният интерфейс, чрез който машините ще комуникират с другите сървъри. eth1 е резрвиран единствено за комуникация на DRBD!

Инсталираме необходимите пакети:

t3-node1/t3-node2 –

apt-get install -y heartbeat pacemaker nfs-kernel-server mysql-server drbd8-utils build-essential psmisc xfsprogs

aptitude remove apparmor

Спираме автоматичното стартиране на NFS/DRBD/MySQL:

t3-node1/t3-node2 –

service nfs-kernel-server stop

service postgresql-8.4 stop

service mysql stop

update-rc.d -f nfs-kernel-server remove

update-rc.d -f mysql remove

update-rc.d -f drbd remove

sed -i -e “/^start on/d” /etc/init/mysql.conf

sed -i -e “/^stop on/d” /etc/init/mysql.conf

Конфигурираме Heartbeat:

cat <<EOF > /etc/heartbeat/ha.cf

logfacility daemon

keepalive 2

deadtime 15

warntime 5

initdead 120

udpport 694

bcast eth0

auto_failback on

node t3-node1

node t3-node2

use_logd yes

crm respawn

ping_group internal 10.167.0.1 10.162.0.10

deadping 12

EOF

Подменете адресите от група Internal с адреси на рутер или dns сървър, които да служат за witness в случай, че двата Nodes изгубят връзка помежду си, но продължат да работят – “split brain”.

Възможно е при по – специална конфигурация на мрежата, забраняваща broadcasting, да се наложи промяна на bcast eth0 с

ucast eth0 10.167.0.32

ucast eth0 10.167.0.31

( echo -ne “auth 1\n1 sha1 “; \
dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \
> /etc/ha.d/authkeys.

chmod 600 /etc/ha.d/authkeys

service heartbeat start

t3-node1/t3-node2 –

Създаваме дяловете, които ще се репликират чрез DRBD

lvcreate -n nfs -L 15G t3-node1

lvcreate -n mysql -L 15G t3-node1

Създаваме ресурсните дялове в DRBD

cat <<EOF > /etc/drbd.d/r0.res

resource r0 {

protocol C;

syncer {

rate 11M;

}

startup {

wfc-timeout 15;

degr-wfc-timeout 60;

}

net {

cram-hmac-alg sha1;

shared-secret “ieGobe9Ohwo5Ahv4aida”;

}

on t3-node1 {

device /dev/drbd0;

disk /dev/t3-node1/nfs;

address 10.136.6.31:7788;

meta-disk internal;

}

on t3-node2 {

device /dev/drbd0;

disk /dev/t3-node2/nfs;

address 10.136.6.32:7788;

meta-disk internal;

}

}

cat <<EOF > /etc/drbd.d/r1.res

resource r1 {

protocol C;

syncer {

rate 11M;

}

startup {

wfc-timeout 15;

degr-wfc-timeout 60;

}

net {

cram-hmac-alg sha1;

shared-secret “ooviPh7Sozezee4vughe”;

}

on t3-node1 {

device /dev/drbd1;

disk /dev/t3-node1/mysql;

address 10.136.6.31:7789;

meta-disk internal;

}

on t3-node2 {

device /dev/drbd1;

disk /dev/t3-node2/mysql;

address 10.136.6.32:7789;

meta-disk internal;

}

}

стартираме репликацията:

drbdadm create-md r0

drbdadm create-md r1

service drbd start

t3-node1 –

избираме t3-node1 за primary, спрямо който ще се репликира t3-node2. на този етап няма значение кой от двата хоста ще изберем:

drbdadm primary r0

drbdadm primary r1

Проверяваме статуса на репликацията:

cat /proc/drbd

drbd-overview

Създаваме файлова система и монтираме дяловете:

mkfs.xfs /dev/drbd0

mkfs.xfs /dev/drbd1

mkdir /srv/nfs

mkdir /srv/mysql

t3-node1/t3-node2-

Конфигурираме NFS/MySQL server:

sed -i -e “s/NEED_SVCGSSD=/NEED_SVCGSSD=no/” /etc/default/nfs-kernel-server

sed -i -e “s/NEED_GSSD=/NEED_GSSD=no/” /etc/default/nfs-common

echo NEED_IDMAPD=yes >> /etc/default/nfs-common

sed -i -e “s/\#bind-address.*/bind-address 10.167.0.55/” /etc/mysql/my.cnf

Подменете 10.167.0.55 с виртуален адрес, който да се взима от node-а който е в активен режим.

t3-node1 –

Монтираме файловите системи на t3-node1, за да преместим mysql базата и да я свържем към /var/lib/mysql

mount /dev/drbd0 /srv/nfs/

mount /dev/drbd1 /srv/mysql/

mv /var/lib/mysql/* /srv/mysql/

rm -r /var/lib/mysql

ln -sf /srv/mysql /var/lib/mysql

chown mysql:mysql /srv/mysql/

chmod 700 /srv/mysql/

t3-node2-

Премахваме /var/lib/mysql и я свързваме към /srv/mysql

rm -r /var/lib/mysql

ln -sf /srv/mysql /var/lib/mysql

chmod 700 /srv/mysql/

chown mysql:mysql /srv/mysql/

t3-node1/t3-node2-

експортираме NFS дяла:

echo “/srv/nfs        10.167.0.21/32(rw,sync,nohide,no_subtree_check,no_root_squash)” >> /etc/exports

echo “/srv/nfs        10.167.0.22/32(rw,sync,nohide,no_subtree_check,no_root_squash)” >> /etc/exports

exportfs -ra

t3-node1-

Конфигурираме pacemaker единствено на хост t3-nod1, тъйкато конфигурацията се репликира:

crm configure property stonith-enabled=false

crm configure property no-quorum-policy=ignore

crm configure edit

node $id=”a1b1f5b0-de01-4e14-af3f-e64c8ab9d507″ t3-node2 \        attributes standby=”off”node $id=”c8a40634-bc26-4449-bada-95846d34a841″ t3-node1 \        attributes standby=”off”primitive drbd_mysql ocf:linbit:drbd \

params drbd_resource=”r1″ \

op monitor interval=”15s” role=”Master” \

op monitor interval=”16s” role=”Slave”

primitive drbd_nfs ocf:linbit:drbd \

params drbd_resource=”r0″ \

op monitor interval=”15s” role=”Master” \

op monitor interval=”16s” role=”Slave”

primitive fs_mysql ocf:heartbeat:Filesystem \

params device=”/dev/drbd/by-res/r1″ directory=”/srv/mysql” fstype=”xfs” \

op start interval=”0″ timeout=”60″ \

op stop interval=”0″ timeout=”120″

primitive fs_nfs ocf:heartbeat:Filesystem \

params device=”/dev/drbd/by-res/r0″ directory=”/srv/nfs” fstype=”xfs” \

op start interval=”0″ timeout=”60″ \

op stop interval=”0″ timeout=”120″

primitive ip1 ocf:heartbeat:IPaddr2 \

params ip=”10.167.0.55” nic=”eth0:1″ \

op monitor interval=”5s”

primitive ip1arp ocf:heartbeat:SendArp \

params ip=”10.167.0.55” nic=”eth0:1″

primitive mysql ocf:heartbeat:mysql \

params binary=”/usr/bin/mysqld_safe” config=”/etc/mysql/my.cnf” user=”mysql” group=”mysql” log=”/var/log/mysql.log” pid=”/var/run/mysqld/mysqld.pid” datadir=”/var/lib/mysql” socket=”/var/run/mysqld/mysqld.sock” \

op monitor interval=”30s” timeout=”30s” \

op start interval=”0″ timeout=”120″ \

op stop interval=”0″ timeout=”120″

primitive nfs lsb:nfs-kernel-server \

op monitor interval=”5s”

group HAServices ip1 ip1arp fs_nfs nfs fs_mysql mysql \

meta target-role=”Started”

ms ms_drbd_mysql drbd_mysql \

meta master-max=”1″ master-node-max=”1″ clone-max=”2″ clone-node-max=”1″ notify=”true”

ms ms_drbd_nfs drbd_nfs \

meta master-max=”1″ master-node-max=”1″ clone-max=”2″ clone-node-max=”1″ notify=”true”

colocation mysql_on_drbd inf: HAServices ms_drbd_mysql:Master

colocation nfs_on_drbd inf: HAServices ms_drbd_nfs:Master

order fs-mysql-before-mysql inf: fs_mysql:start mysql:start

order fs-nfs-before-nfs inf: fs_nfs:start nfs:start

order ip-before-arp inf: ip1:start ip1arp:start

order ip-before-ms-drbd-mysql inf: ip1:start ms_drbd_mysql:promote

order ip-before-ms-drbd-nfs inf: ip1:start ms_drbd_nfs:promote

order ms-drbd-mysql-before-fs-mysql inf: ms_drbd_mysql:promote fs_mysql:start

order ms-drbd-nfs-before-fs-nfs inf: ms_drbd_nfs:promote fs_nfs:start

property $id=”cib-bootstrap-options” \        dc-version=”1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c” \        cluster-infrastructure=”Heartbeat” \        expected-quorum-votes=”1″ \

stonith-enabled=”false” \

no-quorum-policy=”ignore”

rsc_defaults $id=”rsc-options” \

resource-stickiness=”100″

Информацията в син цвят не се променя. Редактирайте виртуалният адрес в червено.

Ако конфигурацията е правилна, то командата crm_mon, ще върне резултат подобен на:

Last updated: Wed Feb  6 17:37:27 2013

Last change: Wed Feb  6 11:15:52 2013 via crm_attribute on t3-node1

Stack: Heartbeat

Current DC: t3-node1 (c8a40634-bc26-4449-bada-95846d34a841) – partition with quorum

Version: 1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c

2 Nodes configured, 1 expected votes

10 Resources configured.

============

Online: [ t3-node1 t3-node2 ]

Resource Group: HAServices

ip1        (ocf::heartbeat:IPaddr2):       Started t3-node2

ip1arp     (ocf::heartbeat:SendArp):       Started t3-node2

fs_nfs     (ocf::heartbeat:Filesystem):    Started t3-node2

nfs        (lsb:nfs-kernel-server):        Started t3-node2

fs_mysql   (ocf::heartbeat:Filesystem):    Started t3-node2

mysql      (ocf::heartbeat:mysql): Started t3-node2

Master/Slave Set: ms_drbd_mysql [drbd_mysql]

Masters: [ t3-node2 ]

Slaves: [ t3-node1 ]

Master/Slave Set: ms_drbd_nfs [drbd_nfs]

Masters: [ t3-node2 ]

Slaves: [ t3-node1 ]

Можете да симулирате отпадане на nodes с командите:

crm node standby t3-node1

crm node online t3-node1

crm node standby t3-node2

crm node online t3-node2

и отново да следите статуса на клъстъра след всяка команда чрез crm_mon

Comments are closed !