Keepalived kasutamine
Sissejuhatus
Keepalived http://www.keepalived.org/ tarkvaraga saab kontrollida kahe koostööd tegeva arvuti võrguseadistusi sh automatiseerida võrguseadistuste muutmist vastuseks mingitele sündmustele (nt ühe arvuti võrgust kadumine). Keepalived sobib kasutamiseks nt
- võrgusõlmes, nt kahe õlalise tulemüüri klastri pidamisel, kus vip aadressiks on ülejäänud arvutite default gw aadress
- rakendusserveris, nt kahe õlalise NginX klastri pidamisel, kus vip aadressiks on rakendusserveri ip aadress kuhu brauserid pöörduvad
Lisaks puhtale võrguseadistustega tegelemisele on Keepalived integreeritud http://www.linux-vs.org/ lahendusega. Keepalived implementeerib VRRP (virtual router redundancy protocol) protokolli. Käesolevas tekstis tegeldakse ainult Keepalived kasutamisega rakendusserveris.
Tööpõhimõte
Keepalived on võrgule orienteeritud lahendus erinevalt nt Pacemaker rakendustele orienteeritud lahendusest; st Keepalived tegeleb ainult node'ide vahel ip aadresside, ruutingute jms sättimisega; Pacemaker hoolitseb selle eest, et erinevates node'des töötaksid täpselt sellised rakendused nagu tarvis (nt et sama failisüsteem ei oleks külge ühendatud mitmes kohas).
Keepalived kasutamist kirjeldab selline skeem
__________ | | -------------------| bauser | |__________| internet | _____|_____ | | | ruuter | |___________| | 192.168.10.254 | | ---|----------------|------------------------|----- | | 192.168.10.191 __|__ vip 192.168.10.193 __|__ 192.168.10.192 | | | | | | keepalived | | keepalived | | nginx protsess | | nginx protess |_____| |_____| NginX A <--- multicast sõnumid ---> NginX B
kus
- NginX A arvuti native ip aadress on 192.168.10.191
- NginX B arvuti native ip aadress on 192.168.10.192
- NginX klastri vip (virtual ip) aadress on 192.168.10.193
- NginX protsess on binditud * liidesele
- vip mac aadressi ei ole kasutusel
- aadressi üleandmisel kasutatakse gratitous arp'i
- igal ajahetkel on vip aadress ühe või teise node küljes (ja need aadressi ei anta käest kätte millisekundis tuhat korda vaid siis kui üks node rikneb, toimub plaaniline hooldustöö vms)
- kui teenus on seotud vip aadressiga (ja tavaliselt on), siis teine node istub tühjalt kõrval, st ei paku teenust
- keepalived ei võimalda active-active lahendust ühs vip aadressi jaoks (erinevalt nt OpenBSD carp süsteemist, https://man.openbsd.org/carp
- mitme vip aadressi kasutamisel on võimalik active-active lahendus
Tarkvara paigaldamine
Tarkvara paigaldamiseks sobib öelda
# apt-get install keepalived
tulemusena paigaldatakse
- sõltuvausena ipvsadm pakett
- seadistusfailide näited, nt /usr/share/doc/keepalived/samples/keepalived.conf.vrrp
Seadistamine
Käesolevas punktis tutvustatakse mõnda seadistamise näidet
- ühe vip aadressi kasutamine
- kahe vip aadressi kasutamine (nii saavutatakse mõlema õla mingil määral võrdne käigushoidmine)
- policy routing
Ühe VIP ip aadressi kasutamine
Toodud seadistus realiseerib Tööpõhimõte skeemil kujutatud olukorra, kaks node'i annavad vip ip aadressi käest kätte.
NginX A
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { imre@auul.pri.ee } notification_email_from keepalived@auul.pri.ee smtp_server 192.168.1.250 smtp_connect_timeout 30 router_id MORAAL_A } vrrp_instance VI_1 { state MASTER interface ens18 garp_master_delay 10 smtp_alert virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass parool } virtual_ipaddress { 192.168.10.193/24 } }
NginX B
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { imre@auul.pri.ee } notification_email_from keepalived@auul.pri.ee smtp_server 192.168.1.250 smtp_connect_timeout 30 router_id MORAAL_B } vrrp_instance VI_1 { state BACKUP interface ens18 garp_master_delay 10 smtp_alert virtual_router_id 51 priority 80 advert_int 1 authentication { auth_type PASS auth_pass parool } virtual_ipaddress { 192.168.10.193/24 } }
kus
- virtual_ipaddress - direktiivi kirjeldatud ip aadress/mask seadistatakse master rolli minekul, ja eemaldatakse backup rolli minekul
- kõrgema priority väärtusega node osutub master'iks
Kahe VIP ip aadressi kasutamine
Toodud seadisus on ühe VIP ip aadressi kasutamise edasiarendus, klastris on kaks node'i, kummalgi on primaarselt oma vip aadress, st kokku kaks vip aadressi; ja nad üks node teenindab vajadusel mõlemat vip aadressi.
NginX A
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { imre@auul.pri.ee } notification_email_from keepalived@auul.pri.ee smtp_server 192.168.1.250 smtp_connect_timeout 30 router_id MORAAL_A } vrrp_instance VI_1 { state MASTER interface ens18 garp_master_delay 10 smtp_alert virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass parool1 } virtual_ipaddress { 192.168.10.193/24 } } vrrp_instance VI_2 { state BACKUP interface ens18 garp_master_delay 10 smtp_alert virtual_router_id 52 priority 80 advert_int 1 authentication { auth_type PASS auth_pass parool2 } virtual_ipaddress { 192.168.10.194 } }
NginX B
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen } notification_email_from keepalived@auul.pri.ee smtp_server 192.168.1.250 smtp_connect_timeout 30 router_id MORAAL_B } vrrp_instance VI_1 { state BACKUP interface ens18 garp_master_delay 10 smtp_alert virtual_router_id 51 priority 80 advert_int 1 authentication { auth_type PASS auth_pass parool1 } virtual_ipaddress { 192.168.10.193 } } vrrp_instance VI_2 { state MASTER interface ens18 garp_master_delay 10 smtp_alert virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass parool2 } virtual_ipaddress { 192.168.10.194 } }
Policy routing kasutamine
Ubuntu v. 16.04 paketihalduse Keepalived v. 1.2.19 ei sisalda otseselt policy routing kasutamist. Selle siiski kasutamiseks tuleb policy routing teha tavalisel viisil ning kasutada lisaks vip ip aadresse tavalisel viisil. (Nii kulub ip aadresse küll rohkem tõenäoliselt.) Tundub, et uuemates Ubuntu versioonides uuem Keepalived tarkvara võimaldab paremini töötada alternatiivsete ruutingutabelitega.
Kasutamine
- Failover toimub automaatselt, nt ühe arvuti poweroff puhul
- Switchover esilekutsumiseks sobib ühes arvutis keepalived protsessi töö lõpetada
# systemctl stop keepalived
- Töötamise ajal on võrgus multicast paketid (on näha, et vrid 51 osas on üks arvuti master ja vrid 52 osas teine)
# tcpdump -ni any host 224.0.0.18 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 19:35:35.761184 IP 192.168.10.191 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 24 19:35:35.761341 IP 192.168.10.192 > 224.0.0.18: VRRPv2, Advertisement, vrid 52, prio 100, authtype simple, intvl 1s, length 20 19:35:36.761721 IP 192.168.10.191 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 24 19:35:36.761896 IP 192.168.10.192 > 224.0.0.18: VRRPv2, Advertisement, vrid 52, prio 100, authtype simple, intvl 1s, length 20 19:35:37.762857 IP 192.168.10.191 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 24 ...
- Parasjagu kehtestatud võrguseadistuse küsimiseks sobib öelda nt
# ip addr show
Paketifilter
Kui vrrp liiklus toimub multicast peal, siis sobib kasutada kõigis osalistes nt sellist paketifiltrit
# vrrp -A INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT -A OUTPUT -o eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
Märkused
- Kui arvuti vaikelüüsi jääb arp cache peale vale ip aadress nö kinni võib olla abiks öelda
# arping -i eth0 -c 3 -p -s e5:22:5b:bd:3c:32 -S 10.20.39.45 10.20.39.33
kus
- -s mac on õige võrguliidese mac (mida soovitakse gw'le õpetada)
- -S ip - õige võrguliidese ip aadress
- 10.20.39.33 - vaikelüüsi ip aadress
- Testimiseks on hea öelda nt
# wget --bind-address=10.20.39.45 http://moraal.ee/
2020 märkused
global_defs { notification_email { imre@auul.pri.ee } notification_email_from imre@localhost smtp_server localhost smtp_connect_timeout 30 script_user dwalin enable_script_security } # VRRP Instance definition vrrp_script chk_test { script "/bin/echo 4 >> /var/tmp/kata/fail" } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 101 advert_int 1 authentication { auth_type PASS auth_pass teretere } virtual_ipaddress { 10.100.13.27/24 } track_script { chk_test } } # Virtual Server definition virtual_server 10.100.13.27 5434 { delay_loop 5 lb_algo rr lb_kind NAT protocol TCP real_server 10.100.13.24 5432 { weight 1 TCP_CHECK { connect_port 5432 connect_timeout 5 } } } kus * TODO
Kasulikud lisamaterjalid
- http://www.formilux.org/archives/haproxy/1003/3259.html
- https://huinn.wordpress.com/2012/01/02/keepalived-2-active-servers/
- https://deviantony.wordpress.com/2014/07/18/load-balancing-and-high-availability-with-haproxy-and-keepalived/
- https://www.auul.pri.ee/wiki/Iptables_kasutamine_Debianiga#Policy_routing
- https://tobrunet.ch/2013/07/keepalived-check-and-notify-scripts/