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://www.linuxvirtualserver.org