LVS+KeepAlived高可用部署實戰(zhàn)
1. 構建高可用集群
1.1 什么是高可用集群
高可用集群(High Availability Cluster,簡稱HA Cluster)沈撞,是指以減少服務中斷時間為目的得服務器集群技術微渠。它通過保護用戶得業(yè)務程序?qū)ν獠块g斷提供的服務,把因為軟件掀淘,硬件沛贪,認為造成的故障對業(yè)務得影響降低到最小程度褒墨。總而言之就是保證公司業(yè)務7*24小時不宕機
1.2 高可用衡量標準
衡量集群的可用性(HA)高低橘原,可以從MTTF(平均無故障時間)和MTTR(平均故障維修時間)進行考量樟蠕,公式為:HA=MTTF/(MTTF+MTTR)*100%,具體衡量標準可以參考下表
基本可用性 | 2個9 | 99% | 年度宕機時間:87.6小時 |
---|---|---|---|
較高可用性 | 3個9 | 99.9% | 年度宕機時間:8.8小時 |
具有故障自動恢復 | 4個9 | 99.99% | 年度宕機時間:53分鐘 |
極高可用性 | 5個9 | 99.999% | 年度宕機時間:5分鐘 |
1.3 高可用保障
對集群中的服務器進行負載均衡靠柑、健康監(jiān)測寨辩,并在服務器出現(xiàn)故障時能進行故障轉(zhuǎn)移,自動切換到正常服務器是高可用保障的必要手段歼冰。
1.3.1 負載均衡
常見的負載均衡手段如下:
硬件負載均衡靡狞,如F5
軟件負載均衡,如nginx隔嫡、haproxy甸怕、lvs
幾種軟件負載均衡技術比較
技術 | 優(yōu)點 | 缺點 |
---|---|---|
nginx | 可以針對http應用做一些分流的策略; 對網(wǎng)絡穩(wěn)定性的依賴非常小 安裝和配置簡單腮恩,測試方便 能支撐幾萬的并發(fā)量 可作為靜態(tài)網(wǎng)頁和圖片服務器 | 僅支持http毅往、https和Email協(xié)議 只支持通過端口進行健康檢測 |
haproxy | 支持通過URL進行健康檢測 單純做負載均衡寥裂,效率高于nginx 支持TCP的負載均衡,可以對mysql集群負載 | 不支持POP/SMTP協(xié)議 不支持HTTP cache功能 多進程模式支持不夠好 重載配置需要重啟進程 |
lvs | 抗負載能力強,工作在網(wǎng)絡4層吠谢,性能最好 配置性比較低 工作穩(wěn)定 只分發(fā)請求合是,無流量產(chǎn)生火窒,保證IO性能 應用范圍比較廣 | 不支持正則表達式處理 不能做動靜分離 大型網(wǎng)站實施復雜 沒有專門用于windows的版本 |
1.3.2 健康監(jiān)測和自動切換
常見的健康監(jiān)測和自動切換軟件有keepAlived和heartBeat甚垦,其二者對比如下:
Keepalived使用更簡單:從安裝、配置释液、使用全释、維護等角度上對比,Keepalived都比Heartbeat要簡單
Heartbeat功能更強大:Heartbeat雖然復雜误债,但功能更強大浸船,配套工具更全妄迁,適合做大型集群管理,而Keepalived主要用于集群倒換李命,基本沒有管理功能
1.4 高可用拓撲圖
file
2. 軟件負載均衡技術LVS
2.1 LVS簡介
2.1.1 什么是lvs
LVS是Linux Virtual Server的簡寫登淘,在1998年5月由章文嵩博士成立。
工作在OSI模型的四層项戴,基于IP進行負載均衡。
在linux2.2內(nèi)核時槽惫,IPVS就已經(jīng)以內(nèi)核補丁的形式出現(xiàn)周叮。
從2.4版本以后,IPVS已經(jīng)成為linux官方標準內(nèi)核的一部分界斜。
2.1.2 lvs官方資料鏈接
a. lvs項目介紹 http://www.linuxvirtualserver.org/zh/lvs1.html
b. lvs集群的體系結構 http://www.linuxvirtualserver.org/zh/lvs2.html
c. lvs集群中的IP負載均衡技術 http://www.linuxvirtualserver.org/zh/lvs3.html
d. lvs集群的負載調(diào)度 http://www.linuxvirtualserver.org/zh/lvs4.html
e. lvs中文站點 http://zh.linuxvirtualserver.org
2.2 lvs拓撲
2.2.1 lvs術語
LVS服務器(DS)
集群中節(jié)點服務器(RS)
虛擬IP地址(VIP)仿耽,用于向客戶端提供服務的IP地址(配置于負載均衡器上)
真實服務器的IP地址(RIP), 集群中節(jié)點服務器的IP地址
負載均衡器IP地址(DIP)各薇,負載均衡器的IP地址项贺,物理網(wǎng)卡上的IP
客戶端主機IP地址(CIP),終端請求用戶的主機IP地址
2.2.2 工作原理和拓撲圖
LVS負載均衡調(diào)度技術是在linux內(nèi)核中實現(xiàn)的峭判,使用配置LVS時开缎,不是直接配置內(nèi)核中的IPVS,而是通過IPVS的管理工具IPVSADM來管理配置林螃,LVS集群負載均衡器接受所有入站客戶端的請求奕删,并根據(jù)算法來決定由哪個集群的節(jié)點來處理請求。
2.3 lvs的三種工作模式
2.3.1 NAT模式
NAT(Network Address Translation)模式是基于NAT技術實現(xiàn)的疗认。在此模式中完残,LVS服務器既要處理請求的接入,又要處理請求的響應横漏。因此存在較大的性能瓶頸谨设。
file
2.3.2 DR模式
DR(Direct Routing)模式是LVS的默認工作模式,也叫直接路由模式缎浇。只處理請求的接入扎拣,不處理請求的響應。因此性能高素跺,瓶頸小鹏秋。
file
2.3.3 TUN模式
TUN(Tunneling)模式需要服務器支持IP隧道(IP tunneling,是路由器把一種網(wǎng)絡層協(xié)議封裝到另一個協(xié)議中以跨過網(wǎng)絡傳送到另一個路由器的處理過程)技術亡笑,限制較大侣夷,一般不用。
file
2.4 LVS調(diào)度算法
2.4.1 靜態(tài)調(diào)度算法
調(diào)度算法 | 說 明 |
---|---|
RR | roundrobin輪詢調(diào)度 |
WRR | Weighted RR加權輪詢調(diào)度 |
SH | Soure Hashing源地址哈希調(diào)度 |
DH | Destination Hashing目標地址哈希調(diào)度 |
2.4.2 動態(tài)調(diào)度算法
調(diào)度算法 | 說 明 |
---|---|
LC | Least Connections最小連接數(shù)調(diào)度 |
WLC | Weighted LC加權最小連接數(shù)調(diào)度 (默認*) |
SED | Shortest Expection Delay初始連接高權重優(yōu)先 |
NQ | Nerver Queue 第一輪平均分配仑乌,后續(xù)SED |
LBLC | Locality-Based LC 動態(tài)的DH算法 |
LBLCR | LBLC with Replication 帶復制功能的LBLC |
FO | Weighted Fail Over百拓,linux內(nèi)核4.15后新增的調(diào)度算法 |
OVF | Overflow-connection琴锭,linux內(nèi)核4.15后新增的調(diào)度算法 |
2.5 lvs基本命令
對于lvs的操作,主要是通過ipvsadm軟件實現(xiàn)衙传,常用的lvs操作命令如下:
2.5.1 集群服務管理
命令 | 說 明 |
---|---|
ipvsadm -A -t IP -s 調(diào)度算法 | 此命令用來添加一個lvs策略决帖,IP指VIP,調(diào)度算法是12種調(diào)度算法的一種 |
ipvsadm -C | 此命令用來清除一個lvs策略 |
ipvsadm -S | 此命令用來保存一個lvs策略 |
ipvsadm -R | 此命令用來加載一個lvs策略 |
ipvsadm -L | 此命令用來查看策略 |
2.5.2 集群RS管理
命令 | 說 明 |
---|---|
ipvsadm -a -t IP1 -r IP2 -m|g|i | 添加一臺RS蓖捶,IP1指VIP地回,IP2指RIP,-m|g|i中m是NAT俊鱼,g是DR刻像, |
ipvsadm -d -t IP1 -r IP2 | 此命令用來刪除一臺RS,IP1指VIP并闲,IP2指RIP |
2.6 lvs實戰(zhàn)
2.6.1 NAT模式實戰(zhàn)
**NAT實戰(zhàn)拓撲圖**
file
**NAT模式實現(xiàn)**
按照上面的拓撲圖细睡,進行NAT實戰(zhàn),步驟如下:
**A**. 準備4臺linux虛擬機帝火,并確定每臺虛擬機的角色溜徙,為了方便區(qū)分,可以對每臺虛擬機設置新的主機名犀填,比如 LVS服務器可以設置主機名為lvs蠢壹,設置方式如下
#設置主機名
hostnamectl set-hostname lvs
#斷開遠程連接
logout
#重新連接即可看到主機名已經(jīng)更改
然后對四臺虛擬機分別進行配置如下:
**RS1和RS2配置**
1) 配置網(wǎng)卡為NAT模式
2) 下載安裝httpd服務,命令如下
yum install -y httpd
3) 設置首頁內(nèi)容(RS2把內(nèi)容改為this is RS2)
echo this is RS01 > /var/www/html/index.html
4) 啟動httpd
systemctl start httpd
5) 在RS1和RS2上測試訪問九巡,能輸出 this is RS01或this is RS02即為成功
[root@rs01 ~]# curl localhost
this is RS01
6) RS1設置靜態(tài)IP為192.168.116.131知残,RS2設置靜態(tài)IP為192.168.116.132。
RS1和RS2指定網(wǎng)關為192.168.116.130比庄,子網(wǎng)掩碼255.255.255.0
7) 查看網(wǎng)關是否生效
[root@rs01 html]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.116.130 0.0.0.0 UG 100 0 0 ens33
192.168.116.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
**LVS服務器配置**
1) 安裝ipvsadm
yum install -y ipvsadm
2) 設置雙網(wǎng)卡
僅主機網(wǎng)卡一塊求妹,IP配置為192.168.5.131,此IP是接受外部請求的VIP
NAT網(wǎng)卡一塊佳窑,IP配置為192.168.116.130制恍,此IP是與后端RS服務器通信的DIP
3) 配置ip_forward轉(zhuǎn)發(fā)
vi /etc/sysctl.conf
#添加如下內(nèi)容并保存退出
net.ipv4.ip_forward = 1
#執(zhí)行如下命令使修改生效
sysctl -p
4) 使用ipvsadm進行負載均衡配置
#指定負載80端口的VIP,并指定調(diào)度策略為輪詢
[root@lvs01 ~]# ipvsadm -A -t 192.168.5.131:80 -s rr
#添加兩臺RS神凑,并指定負載均衡工作模式為NAT
[root@lvs01 ~]# ipvsadm -a -t 192.168.5.131:80 -r 192.168.116.131 -m
[root@lvs01 ~]# ipvsadm -a -t 192.168.5.131:80 -r 192.168.116.132 -m
#查看上述配置是否生效
[root@lvs01 ~]# 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.5.131:80 rr
-> 192.168.116.131:80 Masq 1 0 0
-> 192.168.116.132:80 Masq 1 0 0
**client虛擬機配置和測試**
配置網(wǎng)卡為僅主機模式净神,IP為192.168.5.130,網(wǎng)關無需配置即可溉委。
在client上測試負載均衡效果鹃唯,如下:
[root@client ~]# curl 192.168.5.131
this is RS02
[root@client ~]# curl 192.168.5.131
this is RS01
[root@client ~]# curl 192.168.5.131
this is RS02
[root@client ~]# curl 192.168.5.131
this is RS01
NAT模式存在的問題-->LVS性能瓶頸
2.6.2 DR模式實戰(zhàn)
小貼士: ARP(Address Resolution Protocol)地址解析協(xié)議,是根據(jù)IP地址獲取物理地址(MAC)的一個 TCP/IP協(xié)議瓣喊。主機發(fā)送信息時將包含目標IP地址的ARP請求廣播到局域網(wǎng)絡上的所有主機坡慌,并接收返 回消息,以此確定目標的物理地址藻三;收到返回消息后將該IP地址和物理地址存入本機ARP緩存中并 保留一定時間洪橘,下次請求時直接查詢ARP緩存以節(jié)約資源跪者。
**DR模式拓撲圖**
file
**DR模式實現(xiàn)**
通過對比NAT模式和DR模式的拓撲圖可以發(fā)現(xiàn),需要讓LVS和RS在同一個網(wǎng)段熄求,并且在兩個RS服務器上也需要綁定VIP渣玲。所以DR模式實驗可以在剛才的基礎上進行,步驟如下:
1) 在RS1和RS2上進行如下ARP抑制操作弟晚,并配置VIP到lo網(wǎng)卡上忘衍,如下:
#arp抑制
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
#配置VIP到lo網(wǎng)卡 這里的子網(wǎng)掩碼需要4個255
[root@rs01 html]# ifconfig lo:9 192.168.116.134 netmask 255.255.255.255
[root@rs01 html]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.131 netmask 255.255.255.0 broadcast 192.168.116.255
inet6 fe80::cc13:177d:ec0:60d2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::b105:ad45:a07e:f946 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:20:b6:01 txqueuelen 1000 (Ethernet)
RX packets 1262 bytes 105801 (103.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 582 bytes 70559 (68.9 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 50 bytes 5310 (5.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 50 bytes 5310 (5.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:9: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.116.134 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
注意:RS1和RS2在之前進行NAT模式實驗時設置了網(wǎng)關為LVS的DIP,這里進行DR試驗時需要把網(wǎng)關刪除
2) 在LVS服務器上關閉之前的ens37網(wǎng)卡(注意:你的網(wǎng)卡名稱可能不是這個)
ifdown ens37
ifconfig ens37 down
3) 在lvs的ens33網(wǎng)卡上綁定VIP192.168.116.134
[root@lvs01 ~]# ifconfig ens33:9 192.168.116.134/24
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.130 netmask 255.255.255.0 broadcast 192.168.116.255
inet6 fe80::3264:bc00:653f:77b2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::cc13:177d:ec0:60d2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::b105:ad45:a07e:f946 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:38:1d:eb txqueuelen 1000 (Ethernet)
RX packets 717 bytes 62082 (60.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 244 bytes 37732 (36.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.134 netmask 255.255.255.0 broadcast 192.168.116.255
ether 00:50:56:38:1d:eb 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
4) 在lvs服務器上清空LVS策略卿城,并重新設置DR模式策略
#查看策略
[root@lvs01 ~]# 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.5.131:80 rr
-> 192.168.116.131:80 Masq 1 0 0
-> 192.168.116.132:80 Masq 1 0 0
#清空策略
[root@lvs01 ~]# ipvsadm -C
#再次查看策略
[root@lvs01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
設置DR策略
#設置規(guī)則
[root@lvs01 ~]# ipvsadm -A -t 192.168.116.134:80 -s rr
#添加RS
[root@lvs01 ~]# ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.131 -g
[root@lvs01 ~]# ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.132 -g
#查看策略
[root@lvs01 ~]# 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.116.134:80 rr
-> 192.168.116.131:80 Route 1 0 0
-> 192.168.116.132:80 Route 1 0 0
5) 修改client服務器配置枚钓,更改使用NAT網(wǎng)卡,并設置IP為192.168.116.133
6) 在client測試效果
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
7) 在LVS服務器上查看調(diào)度情況
[root@lvs01 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:30 FIN_WAIT 192.168.116.133:45810 192.168.116.134:80 192.168.116.131:80
TCP 01:31 FIN_WAIT 192.168.116.133:45812 192.168.116.134:80 192.168.116.132:80
TCP 01:32 FIN_WAIT 192.168.116.133:45814 192.168.116.134:80 192.168.116.131:80
TCP 01:30 FIN_WAIT 192.168.116.133:45808 192.168.116.134:80 192.168.116.132:80
2.6.3 四個問題
a. 如果后端某臺RS服務器掛了會出現(xiàn)什么問題藻雪?
b.如果LVS服務器掛了會出現(xiàn)什么問題?
` c. 如何獲知RS服務器狀態(tài)?
d. 如何進行故障轉(zhuǎn)移秘噪、自動切換?
3. KeepAlived
3.1 keepAlived簡介
Keepalived的作用是**檢測服務器狀態(tài)**狸吞,如果有一臺web服務器宕機勉耀,或工作出現(xiàn)故障,Keepalived將檢測到蹋偏,并**將有故障的服務器從系統(tǒng)中剔除便斥,同時使用其他服務器代替該服務器的工作**,當服務器工作正常后Keepalived自動將服務器加入到服務器群中威始。
3.2 keepAlived主要特點
3.2.1 健康檢查
檢查方式 | 說 明 |
---|---|
tcp_check | 工作在第4層枢纠,keepalived向后端服務器發(fā)起一個tcp連接請求,如果后端服務器沒有響應或超時黎棠,那么這個后端將從服務器池中移除 |
http_get | 工作在第5層晋渺,向指定的URL執(zhí)行http請求,將得到的結果用md5加密并與指定的md5值比較看是否匹配脓斩,不匹配則從服務器池中移除木西;此外還可以指定http返回碼來判斷檢測是否成功。HTTP_GET可以指定多個URL用于檢測随静,這個一臺服務器有多個虛擬主機的情況下比較好用八千。 |
misc_check | 用腳本來檢測,腳本如果帶有參數(shù)燎猛,需將腳本和參數(shù)放入雙引號內(nèi) |
ssl_get | 和http_get相似恋捆,不同的只是用SSL連接 |
smtp_check | 主要用于郵件系統(tǒng)SMTP協(xié)議的檢測 |
3.2.2 故障遷移
**VRRP協(xié)議**
在現(xiàn)實的網(wǎng)絡環(huán)境中。主機之間的通信都是通過配置靜態(tài)路由或者(默認網(wǎng)關)來完成的重绷,而主機之間的路由器一旦發(fā)生故障沸停,通信就會失效,因此這種通信模式當中昭卓,路由器就成了一個單點瓶頸星立,為了解決這個問題爽茴,就引入了VRRP協(xié)議。
VRRP協(xié)議是一種容錯的主備模式的協(xié)議绰垂,保證當主機的下一跳路由出現(xiàn)故障時室奏,由另一臺路由器來代替出現(xiàn)故障的路由器進行工作,**通過VRRP可以在網(wǎng)絡發(fā)生故障時透明的進行設備切換而不影響主機之間的數(shù)據(jù)通信**劲装。
**故障遷移原理**
在 Keepalived 服務正常工作時胧沫,**主 Master 節(jié)點會不斷地向備節(jié)點發(fā)送(多播的方式)心跳消息,用以告訴備 Backup 節(jié)點自己還活著**占业,當主 Master 節(jié)點發(fā)生故障時绒怨,就無法發(fā)送心跳消息,備節(jié)點也就因此無法繼續(xù)檢測到來自主 Master 節(jié)點的心跳了谦疾,于是調(diào)用自身的接管程序南蹂,接管主 Master 節(jié)點的 IP 資源及服務。而當主 Master 節(jié)點恢復時念恍,備 Backup 節(jié)點又會釋放主節(jié)點故障時自身接管的 IP 資源及服務六剥,恢復到原來的備用角色。
3.3 keepAlived原理
Keepalived工作在TCP/IP參考模型的三層峰伙、四層疗疟、五層,其原理如下:
工作層 | 說 明 |
---|---|
網(wǎng)絡層 | Keepalived通過ICMP協(xié)議向服務器集群中的每一個節(jié)點發(fā)送一個ICMP數(shù)據(jù)包(有點類似與Ping的功能)瞳氓,如果某個節(jié)點沒有返回響應數(shù)據(jù)包策彤,那么認為該節(jié)點發(fā)生了故障,Keepalived將報告這個節(jié)點失效匣摘,并從服務器集群中剔除故障節(jié)點店诗。 |
傳輸層 | Keepalived在傳輸層里利用了TCP協(xié)議的端口連接和掃描技術來判斷集群節(jié)點的端口是否正常。 比如對于常見的WEB服務器80端口音榜∨尤常或者SSH服務22端口,Keepalived一旦在傳輸層探測到這些端口號沒有數(shù)據(jù)響應和數(shù)據(jù)返回囊咏,就認為這些端口發(fā)生異常恕洲,然后強制將這些端口所對應的節(jié)點從服務器集群中剔除掉。 |
應用 層 | Keepalived的運行方式更加全面化和復雜化梅割,用戶可以通過自定義Keepalived工作方式霜第。 例如:可以通過編寫程序或者腳本來運行Keepalived,而Keepalived將根據(jù)用戶的設定參數(shù)檢測各種程序或者服務是否正常户辞,如果Keepalived的檢測結果和用戶設定的不一致時泌类,Keepalived將把對應的服務器從服務器集群中剔除。 |
3.4 分布式選主策略
3.4.1 僅設置priority
在一個一主多備的Keepalived集群中,priority值最大的將成為集群中的MASTER節(jié)點刃榨,而其他都是BACKUP節(jié)點弹砚。在MASTER節(jié)點發(fā)生故障后,BACKUP節(jié)點之間將進行“民主選舉”枢希,通過對節(jié)點優(yōu)先級值priority和weight的計算桌吃,選出新的MASTER節(jié)點接管集群服務。
3.4.2 設置priority和weight
**weight值為正數(shù)時**
在vrrp_script中指定的腳本如果檢測成功苞轿,那么MASTER節(jié)點的權值將是weight值與priority值之和茅诱;如果腳本檢測失效,那么MASTER節(jié)點的權值保持為priority值
MASTER 節(jié)點vrrp_script腳本檢測失敗時搬卒,如果MASTER節(jié)點priority值小于BACKUP節(jié)點weight值與priority值之和瑟俭,將發(fā)生主、備切換契邀。
MASTER節(jié)點vrrp_script腳本檢測成功時摆寄,如果MASTER節(jié)點weight值與priority值之和大于BACKUP節(jié)點weight值與priority值之和,主節(jié)點依然為主節(jié)點坯门,不發(fā)生切換微饥。
**weight值為負數(shù)時**
在vrrp_script中指定的腳本如果檢測成功,那么MASTER節(jié)點的權值仍為priority值田盈,當腳本檢測失敗時畜号,MASTER節(jié)點的權值將是priority值與weight值之差
MASTER節(jié)點vrrp_script腳本檢測失敗時缴阎,如果MASTER節(jié)點priority值與weight值之差小于BACKUP節(jié)點priority值允瞧,將發(fā)生主、備切換蛮拔。
MASTER節(jié)點vrrp_scrip腳本檢測成功時述暂,如果MASTER節(jié)點priority值大于BACKUP節(jié)點priority值時,主節(jié)點依然為主節(jié)點建炫,不發(fā)生切換畦韭。
weight設置標準
對于weight值的設置,有一個簡單的標準肛跌,即weight值的絕對值要大于MASTER和BACKUP節(jié)點priority值之差艺配。由此可見,對于weight值的設置要非常謹慎衍慎,如果設置不好转唉,主節(jié)點發(fā)生故障時將導致集群角色選舉失敗,使集群陷于癱瘓狀態(tài)稳捆。
4. LVS+keepAlived實戰(zhàn)
4.1 實戰(zhàn)拓撲
file
為了測試lvs的高可用赠法,這里需要增加一臺lvs服務器,需在此服務器上安裝ipvsadm乔夯。
4.2 keepAlived安裝和配置
4.2.1 安裝keepAlived
在兩臺lvs服務器上都需要安裝keepAlived砖织,安裝命令如下:
yum install -y keepalived
keepAlived安裝完成后款侵,在/etc/keepalived目錄下有一個keepalived.conf配置文件,內(nèi)容如下:
! 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#標識當前l(fā)vs是主新锈,根據(jù)實際lvs服務器規(guī)劃確定,可選值MASTER和BACKUP
interface eth0#lvs服務器提供服務器的網(wǎng)卡眶熬,根據(jù)實際服務器網(wǎng)卡進行修改
virtual_router_id 51#lvs提供的服務所屬ID壕鹉,目前無需修改
priority 100#lvs服務器的優(yōu)先級,主服務器最高聋涨,備份服務器要低于主服務器
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#virtual_ipaddress用于配置VIP和LVS服務器的網(wǎng)卡綁定關系晾浴,一般需要修改
#示例: 192.168.116.134/24 dev ens33 label ens33:9
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
#配置lvs服務策略,相當于ipvsadm -A -t 192.168.116.134:80 -s rr牍白,一般需要修改
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr#配置lvs調(diào)度算法脊凰,默認輪詢
lb_kind NAT#配置lvs工作模式,可以改為DR
persistence_timeout 50#用于指定同一個client在多久內(nèi)茂腥,只去請求第一次提供服務的RS狸涌,為查看輪詢效 果,這里需要改為0
protocol TCP#TCP協(xié)議
#配置RS信息最岗,相當于ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.131 -g
real_server 192.168.201.100 443 {
weight 1#當前RS的權重
SSL_GET {#SSL_GET健康檢查帕胆,一般改為HTTP_GET
#兩個url可以刪除一個,url內(nèi)的內(nèi)容改為path /和status_code 200般渡,digest刪除
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
#下面的配置實際是兩組lvs服務的配置懒豹,含義和上面的lvs服務配置一致。如果用不到驯用,下面的配置可以全部刪除
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4.2.2 配置keepAlived
基于上述配置文件和實戰(zhàn)拓撲圖及服務器規(guī)劃脸秽,對兩臺lvs服務器分別修改keepalived.conf配置如下:
**lvs主服務器**
! 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 ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.134/24 dev ens33 label ens33:9
}
}
virtual_server 192.168.116.134 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.116.131 80 {
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.116.132 80 {
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
lvs備份服務器
! 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 BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.134/24 dev ens33 label ens33:9
}
}
virtual_server 192.168.116.134 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.116.131 80 {
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.116.132 80 {
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注意:配置文件中的key和大括號之間一定要有空格
4.2.3 啟動keepAlived
在兩臺lvs服務器上分別啟動keepAlived,命令如下:
service keepalived start
4.3 高可用測試
4.3.1 測試環(huán)境檢查
上述步驟執(zhí)行完畢后蝴乔,可以在lvs主服務器和備份服務器分別執(zhí)行ifconfig命令记餐,可以查看到VIP被綁定到了主服務器,如下:
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.130 netmask 255.255.255.0 broadcast 192.168.116.255
inet6 fe80::3264:bc00:653f:77b2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::cc13:177d:ec0:60d2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::b105:ad45:a07e:f946 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:38:1d:eb txqueuelen 1000 (Ethernet)
RX packets 1574 bytes 135506 (132.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 840 bytes 96383 (94.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.134 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:50:56:38:1d:eb 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
這樣薇正,就可以在客戶端請求VIP192.168.116.134來進行測試片酝。
4.3.2 測試負載均衡
在客戶端發(fā)起請求,測試負載均衡挖腰,如下:
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
4.3.3 測試RS高可用
關閉一臺RS后(這里可以使用**ifconfig 網(wǎng)卡名 down**命令暫時關閉網(wǎng)卡)雕沿,客戶端繼續(xù)發(fā)起請求,查看是否可以正常訪問曙聂,如下:
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
會發(fā)現(xiàn)晦炊,此時客戶端可以正常訪問,但只有RS2在提供服務。這說明断国,keepAlived檢測到了RS1服務器異常贤姆,將其剔除了。
此時再啟動RS1服務器稳衬,客戶端繼續(xù)訪問霞捡,會發(fā)現(xiàn)響應結果如下,keepAlived檢測到RS1服務器恢復正常薄疚,又將其加入服務列表了碧信。
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
4.3.4 測試LVS高可用
這里主要進行兩個測試:
**測試lvs主服務宕機**
使用ifconfig 網(wǎng)卡名 down命令,關閉主服務器網(wǎng)卡街夭,此時主服務器不能提供服務砰碴。觀察備份服務器是否將VIP綁定到自己,以及客戶端是否可以繼續(xù)正常訪問板丽。如下:
關閉主服務器網(wǎng)卡
[root@lvs01 keepalived]# ifconfig ens33 down
觀察備份服務器呈枉,會發(fā)現(xiàn)VIP已經(jīng)綁定過來了。這里實際是keepAlived檢測到了主服務器的異常埃碱,而做出的故障轉(zhuǎn)移和自動切換猖辫。
[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.135 netmask 255.255.255.0 broadcast 192.168.116.255
inet6 fe80::3264:bc00:653f:77b2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::cc13:177d:ec0:60d2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::b105:ad45:a07e:f946 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:3a:95:05 txqueuelen 1000 (Ethernet)
RX packets 1891 bytes 167840 (163.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 830 bytes 77459 (75.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.134 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:50:56:3a:95:05 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 6 bytes 528 (528.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 528 (528.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
觀察客戶端是否可以繼續(xù)正常訪問
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
**測試lvs主服務器恢復**
上述測試通過后,可以開啟主服務器網(wǎng)卡砚殿,讓其能夠提供服務啃憎,然后觀察VIP是否會回到主服務器。
開啟主服務器網(wǎng)卡
ifconfig ens33 up
查看主服務器和備份服務器
**主服務器**
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.130 netmask 255.255.255.0 broadcast 192.168.116.255
inet6 fe80::3264:bc00:653f:77b2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::cc13:177d:ec0:60d2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::b105:ad45:a07e:f946 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:38:1d:eb txqueuelen 1000 (Ethernet)
RX packets 2323 bytes 219033 (213.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1953 bytes 189317 (184.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.134 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:50:56:38:1d:eb 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 7 bytes 616 (616.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7 bytes 616 (616.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
**備份服務器**
[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.116.135 netmask 255.255.255.0 broadcast 192.168.116.255
inet6 fe80::3264:bc00:653f:77b2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::cc13:177d:ec0:60d2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::b105:ad45:a07e:f946 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:3a:95:05 txqueuelen 1000 (Ethernet)
RX packets 2182 bytes 197998 (193.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1117 bytes 100885 (98.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 6 bytes 528 (528.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 528 (528.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
會發(fā)現(xiàn)似炎,VIP重新綁定到了主服務器辛萍。
本文由育博學谷狂野架構師發(fā)布
如果本文對您有幫助,歡迎關注和點贊名党;如果您有任何建議也可留言評論或私信叹阔,您的支持是我堅持創(chuàng)作的動力
轉(zhuǎn)載請注明出處挠轴!