1、解決LVS server單點故障html
若是集羣中只有一臺LVS server提供數據包分發服務,若是宕機,則會致使全部的業務重點,由於全部的請求都沒法到達後面的Real server。nginx
此時咱們能夠採用多臺LVS server造成主備模型,來解決單點故障的問題。須要解決的細節有如下幾個方面:後端
1)備機如何得知主機宕機瀏覽器
要解決這個問題,有兩種解決方案:服務器
2)主機宕機後,哪臺備機接替成爲主機網絡
有兩個策略:負載均衡
在Keepalived的方案中,咱們選用主機廣播和謙讓兩種模式來解決LVS server單點故障問題。oop
2、解決Real server宕機檢測問題測試
Real server發生宕機時,必須動態的從LVS server上剔除該宕機的Real server。因此必需要有監控機制。url
1)經過ping的方式查看主機狀態:只能證實主機三層網絡是否正常,而沒法證實業務是否正常。
2)Real server提供一個專用頁面,讓一個第三方程序定時訪問,若是返回200,則表示業務正常。
Keepalived提供第二種方案來確保業務的監控準確性。
3、Keepalived原理
VRRP協議(虛擬路由冗餘協議)—— Virtual Router Redundancy Protocol
做用是在LVS server宕機時,將VIP漂移到備機上,能夠實現短期內的業務切換。
Keepalived是用戶控件的程序,能夠代替ipvsadm來直接調用內核LVS提供的接口,因此咱們無需安裝ipvsadm軟件。可是ipvsadm能夠提供一些方面的命令來查看LVS的運行狀態,例如ipvsadm -lnc,因此建議安裝。
yum install keepalived -y
Keepalived是經過配置文件來進行配置的,咱們無需手工配置LVS,因此在啓動keepalived後,全部LVS配置都會自動完成。
# 配置文件 vi /etc/keepalived/keepalived.conf
# 查看日誌 tail /var/log/message
3、Keepalived實驗
1.系統準備
準備四臺乾淨的虛擬機位於同一局域網,網段爲192.168.1.0。
四臺虛擬機IP分別是:
LVS server 1:192.168.1.199 (DIP)
LVS server 2:192.168.1.200 (DIP)
Real server 1:192.168.1.201 (RIP)
Real server 2:192.168.1.202 (RIP)
2.爲兩臺LVS server安裝ipvsadm(也能夠不安裝)
yum install ipvsadm -y
# 若是以前手工配置過LVS,則清除配置
ipvsadm -C
3.配置兩臺Real server
修改配置使其能夠隱藏VIP:
# 只響應詢問本身地址的請求,不迴應位於lo的VIP echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore # 只主動播報與本接口地址匹配的信息 echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce # 爲全部網卡添加一樣配置,好比後續添加新的網卡 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
給lo配置VIP:
ifconfig lo:2 192.168.1.10 netmask 255.255.255.255
安裝httpd:
yum install httpd -y
在httpd的發佈目錄下寫一個簡單的頁面index.html:
cd /var/www/html vi index.html from real-server-1
啓動httpd服務:
systemctl start httpd
4.安裝keepalived
爲兩臺LVS server都安裝keepalived:
yum install keepalived -y
5.配置keepalived
備份配置文件:
cd /etc/keepalived cp keepalived.conf keepalived.conf.bak
查看配置文件:
[root@lvs-server-2 keepalived]# more keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
咱們能夠看到,配置文件中是按模塊配置的,主要有三大模塊:
global_defs:全局配置,配置一些郵件信息,出現問題的時候能夠發郵件給管理者。
vrrp_instance:VRRP冗餘協議配置。
virtual_server:虛擬服務配置(也就是配置LVS server的冗餘,其中包含後端的多個Real server配置)
vrrp_instance配置部分:
# 這是模板
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } }
解釋:
1.state能夠有MASTER和BACKUP兩種,例如企業中多臺LVS的主備配置不同,配置最好的設置爲MASTER,其餘設爲BACKUP。當Master宕機,則有某臺BACKUP接替,能MASTER搶修好了,MASTER會搶回主機角色。
注意:這種主修復好後馬上搶回主機角色的模式,主要用於LVS這種四層負載,由於LVS無需保存業務上下文,主備切換的成本很低。主備機器除了一個擁有VIP,一個沒有VIP的區別意外,其餘都是同樣的,主備都是隨時監測Real server的狀態,實時更新Real server的列表,因此不管是主機仍是備機,他們都能提供正確的服務。
而像nginx那種基於7層業務的負載均衡,則在主備切換的先後須要進行大量元數據的同步,若是主機修復好後,立刻搶回主機的角色,則須要在搶回以前鎖定備機,進行元數據同步,此時會致使備機沒法提供業務。切換成本很高。
2.interface配置的是心跳廣播使用哪一個網卡,能夠和業務公用一個網卡,例如eth0,也能夠單獨走一個網絡(使用eth1)。
3.virtual_router_id是一套keepalived的ID,例如一個企業可能有多套keepalived,使用該ID區分,以避免混淆。
4.priority就是優先級,每臺機器無論主備都應該是不同的,例如主機是100,備機是9九、9八、97......,用於備機接替主機時謙讓選舉。
5.advert_int、authentication 是用做驗證,無需關心。
6.virtual_ipaddress:192.168.1.10/24 dev eth0 label eth0:8
virtual_ipaddress { 192.168.1.10/24 dev eth0 label eth0:8 }
若是配置不知道怎麼配,可使用man查看幫助文檔:
man 5 keepalived.conf
在幫助文檔中搜索關鍵字,例如 virtual_ipaddress。
配置完後以下:
# 這是當前實驗的配置(LVS server 1) vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.10/24 dev eth0 label eth0:8 } }
以上配置提供給Keepalived自動去配置LVS server的VIP,固然只有MASTER纔會被真正配置VIP,由於配有VIP的LVS就是提供服務的LVS。
virtual_server配置部分:
virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
解釋:
如下幾項是對LVS內核的配置:
1.virtual_server 後面的IP地址就是VIP地址以及端口,例如咱們配爲192.168.1.10 80。
2.lb_algo是轉發模式,rr爲輪詢。
3.lb_kind負載均衡的模式,咱們選擇DR。
4.persistence_timeout:例如某個用戶頻繁訪問,若是該timeout設置爲0,則每次訪問均可能被分配到不一樣的Real server,一次訪問Real server可能會爲該用戶分配內存空間和建立一些對象。若是每次訪問都被分配到不一樣的Real server,則意味着這些Real server都要爲該用戶分配一些內存空間和建立一些對象,這樣回形成服務器資源的浪費。因此咱們設置該timeout爲長一點的時間,在這個時間範圍會,一個用戶重複訪問資源,都將其分到同一個Real server(也就是在LVS上記錄他上次分到的Real server,一段時間內的其餘請求也發給那個Real server)。正常業務時能夠設置爲180s。咱們這裏配置爲0,用於測試。
至此LVS就算配置完了,後面的real_server是對Real server的配置:
1.real_server後面的IP和端口就是真實提供服務的real server的IP以及Httpd的端口,這裏是192.168.1.201 80。
2.weight是Real server的權重,若是一臺爲1,一臺爲2,則第二臺被分配到的連接數量是第一臺的兩倍。
3. SSL_GET開始,就是Real server的健康檢查部分,這裏的SSL是對應https協議。咱們這裏採用的是http協議,因此修改成HTTP_GET。
4.url是提供給keepalived訪問的一個頁面,專門用來判斷Real server的業務是否正常。這裏用index.html頁面代替。用返回狀態200所謂判斷依據。
url { path / status_code 200 }
5.connect_timeout是訪問測試頁面超時的時間,nb_get_retry是重試次數,delay_before_retry是重試前延遲時間,能夠保持默認。
配置完以下:
virtual_server 192.168.1.10 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 0 protocol TCP real_server 192.168.1.201 80 { weight 1 SSL_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.202 80 { weight 1 SSL_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
這樣就將LVS內核以及須要健康檢查的兩臺Real server都配置好了。
除了以上三個主要部分的配置,後面的配置模板能夠所有刪除了。
配置另外一臺LVS server:
將配置好的配置文件拷貝到另一臺須要配置得LVS server,只須要修改vrrp_instance 模塊中的state,將其修改成BACKUP。並將priority修改成99。
6.啓動keepalived
啓動MASTER機器的keepalive:
systemctl start httpalived
啓動後,咱們查看ifconfig:
[root@lvs-server-1 keepalived]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.199 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 240e:398:c0:ddc0:20c:29ff:fe86:f385 prefixlen 64 scopeid 0x0<global> inet6 fe80::20c:29ff:fe86:f385 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:86:f3:85 txqueuelen 1000 (Ethernet) RX packets 62538 bytes 65619264 (62.5 MiB) RX errors 0 dropped 6988 overruns 0 frame 0 TX packets 4348 bytes 615699 (601.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0:8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.10 netmask 255.255.255.0 broadcast 0.0.0.0 ether 00:0c:29:86:f3:85 txqueuelen 1000 (Ethernet) lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
發現keepalive爲咱們自動建立了VIP(MASTER上)。
啓動備機BACKUP的keepalive:
systemctl start keepalived
[root@lvs-server-2 keepalived]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 240e:398:c0:ddc0:20c:29ff:fea5:7756 prefixlen 64 scopeid 0x0<global> inet6 fe80::20c:29ff:fea5:7756 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a5:77:56 txqueuelen 1000 (Ethernet) RX packets 28544 bytes 23854439 (22.7 MiB) RX errors 0 dropped 7251 overruns 0 frame 0 TX packets 3701 bytes 669310 (653.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
咱們發現備機BACKUP啓動keepalived後,並無建立VIP,符合咱們的預期。
7.驗證負載均衡
使用ipvsadm -ln分別在主備LVS server上查看負載均衡狀況:
查詢結果一致:
[root@lvs-server-1 keepalived]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.10:80 rr -> 192.168.1.201:80 Route 1 0 1 -> 192.168.1.202:80 Route 1 0 1
咱們發現VIP和下掛的Real server都被正確監控。
此時使用瀏覽器來訪問VIP:
發現沒法打開頁面,咱們ping一下VIP:
發現也沒法ping通。
檢查keepalived配置文件,發如今global_defs中有一行爲vrrp_strict,在兩臺LVS server上都將其註釋掉:
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }
而後再次嘗試ping,就可以ping通了,再次嘗試瀏覽器訪問VIP:
此時,發現可以正常訪問了。。
8.測試異常狀況
測試四種狀況:
1)MASTER宕機時
2)MASTER恢復時
3)Real server宕機時
4)Real server恢復時
當LVS server的MASTER機器宕機時(使用down掉網卡來模擬):
檢查備機BACKUP也就是LVS server 2的網卡信息:
[root@lvs-server-2 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 240e:398:c0:ddc0:20c:29ff:fea5:7756 prefixlen 64 scopeid 0x0<global> inet6 fe80::20c:29ff:fea5:7756 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a5:77:56 txqueuelen 1000 (Ethernet) RX packets 4668 bytes 417590 (407.8 KiB) RX errors 0 dropped 1135 overruns 0 frame 0 TX packets 2830 bytes 292478 (285.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0:8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.100 netmask 255.255.255.0 broadcast 0.0.0.0 ether 00:0c:29:a5:77:56 txqueuelen 1000 (Ethernet) lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
發現備機被自動添加了VIP,說明keepalived運行正常。
當LVS MASTER恢復時(使網卡UP):
檢查備機BACKUP的網卡信息:
[root@lvs-server-2 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 240e:398:c0:ddc0:20c:29ff:fea5:7756 prefixlen 64 scopeid 0x0<global> inet6 fe80::20c:29ff:fea5:7756 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a5:77:56 txqueuelen 1000 (Ethernet) RX packets 5009 bytes 449806 (439.2 KiB) RX errors 0 dropped 1244 overruns 0 frame 0 TX packets 3127 bytes 315912 (308.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
發現eth:8消失。
檢查恢復的主機MASTER的網卡信息:
[root@lvs-server-1 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.199 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 240e:398:c0:ddc0:20c:29ff:fe86:f385 prefixlen 64 scopeid 0x0<global> inet6 fe80::20c:29ff:fe86:f385 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:86:f3:85 txqueuelen 1000 (Ethernet) RX packets 3271 bytes 313970 (306.6 KiB) RX errors 0 dropped 1063 overruns 0 frame 0 TX packets 3090 bytes 274434 (268.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0:7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.100 netmask 255.255.255.0 broadcast 0.0.0.0 ether 00:0c:29:86:f3:85 txqueuelen 1000 (Ethernet) lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 30 bytes 2520 (2.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 30 bytes 2520 (2.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
發現eth0:7被從新設置,也就是VIP漂移回MASTER了。keepalived運行正常。
當Real server 1的Httpd服務宕掉時:
[root@real-server-1 ~]# systemctl stop httpd
檢查兩個LVS的負載信息:
# MASTER [root@lvs-server-1 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.100:80 rr -> 192.168.1.202:80 Route 1 1 0
# BACKUP [root@lvs-server-2 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.100:80 rr -> 192.168.1.202:80 Route 1 1 0
咱們發現兩個LVS server上Real server列表中都將Real server 1剔除,keepalived運行正常。
當Real server 1的Httpd服務恢復時:
[root@real-server-1 ~]# systemctl start httpd
檢查兩個LVS的負載信息:
# MASTER [root@lvs-server-1 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.100:80 rr -> 192.168.1.201:80 Route 1 1 0 -> 192.168.1.202:80 Route 1 1 0
# BACKUP [root@lvs-server-2 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.100:80 rr -> 192.168.1.201:80 Route 1 0 0 -> 192.168.1.202:80 Route 1 1 0
咱們發現Real server 1又被正確的添加進了列表中,keepalived運行正常。