Кратък коментар отностно защитни стени – възможно, дори желателно, е да се реализира защитна стена преди клиентските връзки към 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
След описване на топологията, следва кратка абстракция:
- Няма да намерите инструкция по инсталацията на ОС Ubuntu Server 12.04
- Машините в тестовата среда, която ще опишем детайлно се намират в една обща мрежа, като с изключение на Tier3, където не е желателно да се поставят Node-овете в отделни мрежи, другите слоеве могат да бъдат сегментирани, чрез Firewall/IPS/Router.
- Таблицата показва необходимите ресурси, имена на хостове и адреси:
За улеснение всички машини имат 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