Apache Cluster

A HupWiki-ből...

Tartalomjegyzék

Bemutatás

Ez a leírás a két pontból álló Apache web server cluster beállításáról fog szólni, debian disztribúció alá. Tehát csinálunk egy olyan load balancert amely elosztja a bejövő kéréseket a kettő webszerver között.

Felépítés, működés, beállítás

Először is szükségünk lesz 2 Apache nodera, és kettő load balancerre, és 5 ipcímre az alhálózaton, 1 amelyet használni fog az apache webserver, és 1 virtuális ipcím amely majd megosztásra fog kerülni a load balancerrek között, és kezelni fogja a beérkező HTTP kéréseket.


Példának most használjuk ezeket, ahogyan az ultramonkey hivatalos dokumentációjában is szerepel. Tehát:

  Apache első webszerver: webserver1.example.com (webserver1) - IP cím: 192.168.0.101; 
  Apache document root: /var/www 
  Apache második webszerver: webserver2.example.com (webserver2) - IP cím: 192.168.0.102; 
  Apache document root: /var/www
  Első load balancer: loadb1.example.com (loadb1) - IP cím: 192.168.0.103
  Második load balancer: loadb2.example.com (loadb2) - IP cím: 192.168.0.104
  Virtuáis ip cím: 192.168.0.105 (Erre a címre fognak érkezni majd a bejövő kérések) 

Lásd rajzon ábrazolva a következő oldalt: http://www.linuxvirtualserver.org/docs/ha/ultramonkey.html

Engedélyezzük az IPVS-t a Load Balancereken

IPVS ( IP Virtual Server )

Tehát mind a kettő gépen, amely a load balancerek lesznek adjuk ki a következő parancsokat:


 echo ip_vs_dh >> /etc/modules
 echo ip_vs_ftp >> /etc/modules
 echo ip_vs >> /etc/modules
 echo ip_vs_lblc >> /etc/modules
 echo ip_vs_lblcr >> /etc/modules
 echo ip_vs_lc >> /etc/modules
 echo ip_vs_nq >> /etc/modules
 echo ip_vs_rr >> /etc/modules
 echo ip_vs_sed >> /etc/modules
 echo ip_vs_sh >> /etc/modules
 echo ip_vs_wlc >> /etc/modules
 echo ip_vs_wrr >> /etc/modules
modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr 

Ha valamilyen hibaüzenetet kapnál, az azt jelenti hogy a kerneledbe nem lett belefordítva az IPVS támogatás, ezért újra le kell fordítanod a kernelt, erről részletesebben elvileg a Kernel konfigurálása részben olvashatsz. FIXME

Telepítsük az Ultramonkeyt a Load Balancerekhez

Ultramonkey az egy olyan project amely létrehozza a Load Balancert, a lokális hálózatok között, használva a Nyílt Forráskódú komponenseket a Linux operációs rendszeren.

Tehát először adjuk hozzá a sources listánkhoz a szervereket amelyről letöltjük.


/etc/apt/sources.list
deb http://www.ultramonkey.org/download/3/ stable main
deb-src http://www.ultramonkey.org/download/3 stable main

Azután futtasok mind a kettő gépen a frissítést és telepítést :

loadb1/loadb2:
apt-get update
apt-get install ultramonkey 

Fontos hogy a kernelünkben legyen I2C Hardware támogatás is.

Pár kérdés telepítéskor amire az alábbiakat válaszold:


 Do you want to automatically load IPVS rules on boot?
 <-- No
Select a daemon method.
<-- none

Csomagok továbbításának beállítása

A loadb1/loadb2 gépeken az /etc/sysctl.conf fájlhoz írjuk be hogy "net.ipv4.ip_forward = 1" . Ezután mind a kettő gépen adjuk ki a következő parancsot:

sysctl -p

Heartbeat és az ldirectord konfigurálása

Most 3 konfigurációs fájlt kell létrehoznunk a loadb1/loadb2 gépeken.

/etc/ha.d/ha.cf 

Adjuk hozzá a következőket:

logfacility        local0
bcast        eth0                # Linux
mcast eth0 225.0.0.1 694 1 0
auto_failback off
node        loadb1
node        loadb2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

Fontos a node neveknek egyezennek meg a gép nevével:

uname -n 

Következő konfigurációs fájl, ugyaúgy a loadb1/loadb2 gépeken.

/etc/ha.d/haresources

Adjuk hozzá a következő sorokat:

loadb1        \
ldirectord::ldirectord.cf \
LVSSyncDaemonSwap::master \
IPaddr2::192.168.0.105/24/eth0/192.168.0.255

Következő konfigurációs fájl, ugyanúgy a loadb1/loadb2 gépeken:

/etc/ha.d/authkeys

Adjuk hozzá a következő sorokat:

auth 3
3 md5 password

Értelmszerűen a password a jelszót fogja jelenteni, amelyet a kettő heartbeat démon fog használni authentikációnál. Fontos hogy az authkeys jogai, csak olvasható legyen root felhasználó alatt:

chmod 600 /etc/ha.d/authkeys

Ldirectord az aktuális load balancer, úgyhogy most be kell konfigurálnunk ezt is, ugye megadtuk a kettő hostot amelyek:

loadb1.example.com
és 
loadb2.example.com

voltak.

Hozzuk létre a loadb1/loadb2 gépeken a következő konfigurációs fájlt: /etc/ha.d/ldirectord.cf , és írjuk bele a következőket:

checktimeout=10
checkinterval=2
autoreload=no
logfile="local0"
quiescent=yes
virtual=192.168.0.105:80
real=192.168.0.101:80 gate
real=192.168.0.102:80 gate
fallback=127.0.0.1:80 gate
service=http
request="ldirector.html"
receive="Test Page"
scheduler=rr
protocol=tcp
checktype=negotiate

A virtual= sornak ugye a példánkban megadott gép címét írjuk és a real= sor a valódi gépeket fogja tartalmazni, amelyeken az apache webszerver fut. A request= sor fogja tartalmazni a kérést amely mind a kettő gépen rajta van. Ezekután be kell állítanunk a heartbeat elindítását minden rendszerindításkor, és törölnünk kell a ldirectord-t, mert az majd együtt indul el a hearbeat démonjaként.

Tehát mind a kettő gépen (loadb1/loadb2) adjuk ki a következő parancsokat:

update-rc.d heartbeat start 75 2 3 4 5 . stop 05 0 1 6 .
update-rc.d -f ldirectord remove 

Ezután indítsuk el a heartbeatet és állítsuk le a ldirectord-t.

/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start

Teszteljük a Load Balancereket

Nézzük meg hogy mind a kettő load balancer megfelelően működik-e:


    loadb1/loadb2:
    ip addr sh eth0 

Az aktív Load Balancernek ha minden igaz a Virtualis IP címet fogja kilistázni. (192.168.0.105)

   2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:16:3e:40:18:e5 brd ff:ff:ff:ff:ff:ff
   inet 192.168.0.103/24 brd 192.168.0.255 scope global eth0
   inet 192.168.0.105/24 brd 192.168.0.255 scope global secondary eth0

Amelyik készen áll majd a kérések feldolgozására pedig ezt:

   2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:16:3e:50:e3:3a brd ff:ff:ff:ff:ff:ff
   inet 192.168.0.104/24 brd 192.168.0.255 scope global eth0

Nézzük meg hogy az ldirectord fut-e: Az aktív Load Balanceren:

ldirectord ldirectord.cf status

Kiírja:

ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 1234

A készen álló Load Balanceren pedig:

ldirectord ldirectord.cf status

Kíirja:

ldirectord is stopped for /etc/ha.d/ldirectord.cf

Az aktív Load Balanceren:

ipvsadm -L -n

Kiírja:

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.105:80 rr
-> 192.168.0.101:80             Route   0      0          0
-> 192.168.0.102:80             Route   0      0          0
-> 127.0.0.1:80                 Local   1      0          0

A készen álló szerveren: Kiírja:

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
/etc/ha.d/resource.d/LVSSyncDaemonSwap master status

Az aktív Load Balanceren:

Kiírja:

master running
(ipvs_syncmaster pid: 1234)

A készen álló szerveren: Kiírja:

master stopped

Ha végeztünk a tesztel akkor most konfigurálhatjuk az apache szerverekkel rendelkező gépeket:

Az apache webszerverekkel rendelkező gépek konfigurálása

Figyelem: A parancsok mind a két gépre érvenyesek! A webserver1/webserver2 gépeken adjuk ki a következő parancsokat:

apt-get install iproute

Írjuk bele a /etc/sysctl.conf fileba a következő sorokat:


# Enable configuration of arp_ignore option
net.ipv4.conf.all.arp_ignore = 1
# When an arp request is received on eth0, only respond if that address is
# configured on eth0. In particular, do not respond if the address is
# configured on lo
net.ipv4.conf.eth0.arp_ignore = 1
# Ditto for eth1, add for all ARPing interfaces
#net.ipv4.conf.eth1.arp_ignore = 1


# Enable configuration of arp_announce option
net.ipv4.conf.all.arp_announce = 2
# When making an ARP request sent through eth0 Always use an address that
# is configured on eth0 as the source address of the ARP request.  If this
# is not set, and packets are being sent out eth0 for an address that is on
# lo, and an arp request is required, then the address on lo will be used.
# As the source IP address of arp requests is entered into the ARP cache on
# the destination, it has the effect of announcing this address.  This is
# not desirable in this case as adresses on lo on the real-servers should
# be announced only by the linux-director.
net.ipv4.conf.eth0.arp_announce = 2
# Ditto for eth1, add for all ARPing interfaces
#net.ipv4.conf.eth1.arp_announce = 2


Futassuk a következő parancsot:


sysctl -p

A /etc/network/interfaces adjuk hozzá a következő sorokat:


auto lo:0
iface lo:0 inet static
address 192.168.0.105
netmask 255.255.255.255
pre-up sysctl -p > /dev/null

Majd futtasuk :


ifup lo:0

Ezután hozzuk létre ldirector.html fájlt a /var/www/ könyvtárba és tartalma legyen a következő Teszt Oldal.

További tesztelések

Nah most nézzük meg hogy valóban működik-e amit csináltunk. Böngészőnk címsorába gépeljük be:

http://192.168.0.105

Most állítsuk le valamelyik gépünkon az apache webszervert és nézzük meg újra, ha minden igaz akkor műküdnie kell.

További olvasmányok linkek

http://linux-ha.org/

http://www.linuxvirtualserver.org

http://www.ultramonkey.org