LVS+KeepAlived高可用部署實戰 1. 構建高可用集群 1.1 什麼是高可用集群 高可用集群(High Availability Cluster,簡稱HA Cluster),是指以減少服務中斷時間為目的得伺服器集群技術。它通過保護用戶得業務程式對外部間斷提供的服務,把因為軟體,硬體,認 ...
LVS+KeepAlived高可用部署實戰
1. 構建高可用集群
1.1 什麼是高可用集群
高可用集群(High Availability Cluster,簡稱HA Cluster),是指以減少服務中斷時間為目的得伺服器集群技術。它通過保護用戶得業務程式對外部間斷提供的服務,把因為軟體,硬體,認為造成的故障對業務得影響降低到最小程度。總而言之就是保證公司業務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 高可用保障
對集群中的伺服器進行負載均衡、健康監測,併在伺服器出現故障時能進行故障轉移,自動切換到正常伺服器是高可用保障的必要手段。
1.3.1 負載均衡
常見的負載均衡手段如下:
硬體負載均衡,如F5
軟體負載均衡,如nginx、haproxy、lvs
幾種軟體負載均衡技術比較
技術 | 優點 | 缺點 |
---|---|---|
nginx | 可以針對http應用做一些分流的策略; 對網路穩定性的依賴非常小 安裝和配置簡單,測試方便 能支撐幾萬的併發量 可作為靜態網頁和圖片伺服器 | 僅支持http、https和Email協議 只支持通過埠進行健康檢測 |
haproxy | 支持通過URL進行健康檢測 單純做負載均衡,效率高於nginx 支持TCP的負載均衡,可以對mysql集群負載 | 不支持POP/SMTP協議 不支持HTTP cache功能 多進程模式支持不夠好 重載配置需要重啟進程 |
lvs | 抗負載能力強,工作在網路4層,性能最好 配置性比較低 工作穩定 只分發請求,無流量產生,保證IO性能 應用範圍比較廣 | 不支持正則表達式處理 不能做動靜分離 大型網站實施複雜 沒有專門用於windows的版本 |
1.3.2 健康監測和自動切換
常見的健康監測和自動切換軟體有keepAlived和heartBeat,其二者對比如下:
Keepalived使用更簡單:從安裝、配置、使用、維護等角度上對比,Keepalived都比Heartbeat要簡單
Heartbeat功能更強大:Heartbeat雖然複雜,但功能更強大,配套工具更全,適合做大型集群管理,而Keepalived主要用於集群倒換,基本沒有管理功能
1.4 高可用拓撲圖
2. 軟體負載均衡技術LVS
2.1 LVS簡介
2.1.1 什麼是lvs
LVS是Linux Virtual Server的簡寫,在1998年5月由章文嵩博士成立。
工作在OSI模型的四層,基於IP進行負載均衡。
在linux2.2內核時,IPVS就已經以內核補丁的形式出現。
從2.4版本以後,IPVS已經成為linux官方標準內核的一部分。
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集群的負載調度 http://www.linuxvirtualserver.org/zh/lvs4.html
e. lvs中文站點 http://zh.linuxvirtualserver.org
2.2 lvs拓撲
2.2.1 lvs術語
LVS伺服器(DS)
集群中節點伺服器(RS)
虛擬IP地址(VIP),用於向客戶端提供服務的IP地址(配置於負載均衡器上)
真實伺服器的IP地址(RIP), 集群中節點伺服器的IP地址
負載均衡器IP地址(DIP),負載均衡器的IP地址,物理網卡上的IP
客戶端主機IP地址(CIP),終端請求用戶的主機IP地址
2.2.2 工作原理和拓撲圖
LVS負載均衡調度技術是在linux內核中實現的,使用配置LVS時,不是直接配置內核中的IPVS,而是通過IPVS的管理工具IPVSADM來管理配置,LVS集群負載均衡器接受所有入站客戶端的請求,並根據演算法來決定由哪個集群的節點來處理請求。
2.3 lvs的三種工作模式
2.3.1 NAT模式
NAT(Network Address Translation)模式是基於NAT技術實現的。在此模式中,LVS伺服器既要處理請求的接入,又要處理請求的響應。因此存在較大的性能瓶頸。
2.3.2 DR模式
DR(Direct Routing)模式是LVS的預設工作模式,也叫直接路由模式。只處理請求的接入,不處理請求的響應。因此性能高,瓶頸小。
2.3.3 TUN模式
TUN(Tunneling)模式需要伺服器支持IP隧道(IP tunneling,是路由器把一種網路層協議封裝到另一個協議中以跨過網路傳送到另一個路由器的處理過程)技術,限制較大,一般不用。
2.4 LVS調度演算法
2.4.1 靜態調度演算法
調度演算法 | 說 明 |
---|---|
RR | roundrobin輪詢調度 |
WRR | Weighted RR加權輪詢調度 |
SH | Soure Hashing源地址哈希調度 |
DH | Destination Hashing目標地址哈希調度 |
2.4.2 動態調度演算法
調度演算法 | 說 明 |
---|---|
LC | Least Connections最小連接數調度 |
WLC | Weighted LC加權最小連接數調度 *(預設) |
SED | Shortest Expection Delay初始連接高權重優先 |
NQ | Nerver Queue 第一輪平均分配,後續SED |
LBLC | Locality-Based LC 動態的DH演算法 |
LBLCR | LBLC with Replication 帶複製功能的LBLC |
FO | Weighted Fail Over,linux內核4.15後新增的調度演算法 |
OVF | Overflow-connection,linux內核4.15後新增的調度演算法 |
2.5 lvs基本命令
對於lvs的操作,主要是通過ipvsadm軟體實現,常用的lvs操作命令如下:
2.5.1 集群服務管理
命令 | 說 明 |
---|---|
ipvsadm -A -t IP -s 調度演算法 | 此命令用來添加一個lvs策略,IP指VIP,調度演算法是12種調度演算法的一種 |
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實戰
2.6.1 NAT模式實戰
NAT實戰拓撲圖
NAT模式實現
按照上面的拓撲圖,進行NAT實戰,步驟如下:
A. 準備4台linux虛擬機,並確定每台虛擬機的角色,為了方便區分,可以對每台虛擬機設置新的主機名,比如 LVS伺服器可以設置主機名為lvs,設置方式如下
#設置主機名
hostnamectl set-hostname lvs
#斷開遠程連接
logout
#重新連接即可看到主機名已經更改
然後對四台虛擬機分別進行配置如下:
RS1和RS2配置
1) 配置網卡為NAT模式
2) 下載安裝httpd服務,命令如下
yum install -y httpd
3) 設置首頁內容(RS2把內容改為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設置靜態IP為192.168.116.131,RS2設置靜態IP為192.168.116.132。
RS1和RS2指定網關為192.168.116.130,子網掩碼255.255.255.0
7) 查看網關是否生效
[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) 設置雙網卡
僅主機網卡一塊,IP配置為192.168.5.131,此IP是接受外部請求的VIP
NAT網卡一塊,IP配置為192.168.116.130,此IP是與後端RS伺服器通信的DIP
3) 配置ip_forward轉發
vi /etc/sysctl.conf
#添加如下內容並保存退出
net.ipv4.ip_forward = 1
#執行如下命令使修改生效
sysctl -p
4) 使用ipvsadm進行負載均衡配置
#指定負載80埠的VIP,並指定調度策略為輪詢
[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虛擬機配置和測試
配置網卡為僅主機模式,IP為192.168.5.130,網關無需配置即可。
在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模式實戰
小貼士: ARP(Address Resolution Protocol)地址解析協議,是根據IP地址獲取物理地址(MAC)的一個 TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到區域網絡上的所有主機,並接收返 回消息,以此確定目標的物理地址;收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並 保留一定時間,下次請求時直接查詢ARP緩存以節約資源。
DR模式拓撲圖
DR模式實現
通過對比NAT模式和DR模式的拓撲圖可以發現,需要讓LVS和RS在同一個網段,並且在兩個RS伺服器上也需要綁定VIP。所以DR模式實驗可以在剛纔的基礎上進行,步驟如下:
1) 在RS1和RS2上進行如下ARP抑制操作,並配置VIP到lo網卡上,如下:
#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網卡 這裡的子網掩碼需要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模式實驗時設置了網關為LVS的DIP,這裡進行DR試驗時需要把網關刪除
2) 在LVS伺服器上關閉之前的ens37網卡(註意:你的網卡名稱可能不是這個)
ifdown ens37
ifconfig ens37 down
3) 在lvs的ens33網卡上綁定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策略
#設置規則
[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網卡,並設置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伺服器上查看調度情況
[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伺服器掛了會出現什麼問題?
b.如果LVS伺服器掛了會出現什麼問題?
` c. 如何獲知RS伺服器狀態?
d. 如何進行故障轉移、自動切換?
3. KeepAlived
3.1 keepAlived簡介
Keepalived的作用是檢測伺服器狀態,如果有一臺web伺服器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的伺服器從系統中剔除,同時使用其他伺服器代替該伺服器的工作,當伺服器工作正常後Keepalived自動將伺服器加入到伺服器群中。
3.2 keepAlived主要特點
3.2.1 健康檢查
檢查方式 | 說 明 |
---|---|
tcp_check | 工作在第4層,keepalived向後端伺服器發起一個tcp連接請求,如果後端伺服器沒有響應或超時,那麼這個後端將從伺服器池中移除 |
http_get | 工作在第5層,向指定的URL執行http請求,將得到的結果用md5加密並與指定的md5值比較看是否匹配,不匹配則從伺服器池中移除;此外還可以指定http返回碼來判斷檢測是否成功。HTTP_GET可以指定多個URL用於檢測,這個一臺伺服器有多個虛擬主機的情況下比較好用。 |
misc_check | 用腳本來檢測,腳本如果帶有參數,需將腳本和參數放入雙引號內 |
ssl_get | 和http_get相似,不同的只是用SSL連接 |
smtp_check | 主要用於郵件系統SMTP協議的檢測 |
3.2.2 故障遷移
VRRP協議
在現實的網路環境中。主機之間的通信都是通過配置靜態路由或者(預設網關)來完成的,而主機之間的路由器一旦發生故障,通信就會失效,因此這種通信模式當中,路由器就成了一個單點瓶頸,為瞭解決這個問題,就引入了VRRP協議。
VRRP協議是一種容錯的主備模式的協議,保證當主機的下一跳路由出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,通過VRRP可以在網路發生故障時透明的進行設備切換而不影響主機之間的數據通信。
故障遷移原理
在 Keepalived 服務正常工作時,主 Master 節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備 Backup 節點自己還活著,當主 Master 節點發生故障時,就無法發送心跳消息,備節點也就因此無法繼續檢測到來自主 Master 節點的心跳了,於是調用自身的接管程式,接管主 Master 節點的 IP 資源及服務。而當主 Master 節點恢復時,備 Backup 節點又會釋放主節點故障時自身接管的 IP 資源及服務,恢復到原來的備用角色。
3.3 keepAlived原理
Keepalived工作在TCP/IP參考模型的三層、四層、五層,其原理如下:
工作層 | 說 明 |
---|---|
網路層 | Keepalived通過ICMP協議向伺服器集群中的每一個節點發送一個ICMP數據包(有點類似與Ping的功能),如果某個節點沒有返迴響應數據包,那麼認為該節點發生了故障,Keepalived將報告這個節點失效,並從伺服器集群中剔除故障節點。 |
傳輸層 | Keepalived在傳輸層里利用了TCP協議的埠連接和掃描技術來判斷集群節點的埠是否正常。 比如對於常見的WEB伺服器80埠。或者SSH服務22埠,Keepalived一旦在傳輸層探測到這些埠號沒有數據響應和數據返回,就認為這些埠發生異常,然後強制將這些埠所對應的節點從伺服器集群中剔除掉。 |
應用 層 | Keepalived的運行方式更加全面化和複雜化,用戶可以通過自定義Keepalived工作方式。 例如:可以通過編寫程式或者腳本來運行Keepalived,而Keepalived將根據用戶的設定參數檢測各種程式或者服務是否正常,如果Keepalived的檢測結果和用戶設定的不一致時,Keepalived將把對應的伺服器從伺服器集群中剔除。 |
3.4 分散式選主策略
3.4.1 僅設置priority
在一個一主多備的Keepalived集群中,priority值最大的將成為集群中的MASTER節點,而其他都是BACKUP節點。在MASTER節點發生故障後,BACKUP節點之間將進行“民主選舉”,通過對節點優先順序值priority和weight的計算,選出新的MASTER節點接管集群服務。
3.4.2 設置priority和weight
weight值為正數時
在vrrp_script中指定的腳本如果檢測成功,那麼MASTER節點的權值將是weight值與priority值之和;如果腳本檢測失效,那麼MASTER節點的權值保持為priority值
MASTER 節點vrrp_script腳本檢測失敗時,如果MASTER節點priority值小於BACKUP節點weight值與priority值之和,將發生主、備切換。
MASTER節點vrrp_script腳本檢測成功時,如果MASTER節點weight值與priority值之和大於BACKUP節點weight值與priority值之和,主節點依然為主節點,不發生切換。
weight值為負數時
在vrrp_script中指定的腳本如果檢測成功,那麼MASTER節點的權值仍為priority值,當腳本檢測失敗時,MASTER節點的權值將是priority值與weight值之差
MASTER節點vrrp_script腳本檢測失敗時,如果MASTER節點priority值與weight值之差小於BACKUP節點priority值,將發生主、備切換。
MASTER節點vrrp_scrip腳本檢測成功時,如果MASTER節點priority值大於BACKUP節點priority值時,主節點依然為主節點,不發生切換。
weight設置標準
對於weight值的設置,有一個簡單的標準,即weight值的絕對值要大於MASTER和BACKUP節點priority值之差。由此可見,對於weight值的設置要非常謹慎,如果設置不好,主節點發生故障時將導致集群角色選舉失敗,使集群陷於癱瘓狀態。
4. LVS+keepAlived實戰
4.1 實戰拓撲
為了測試lvs的高可用,這裡需要增加一臺lvs伺服器,需在此伺服器上安裝ipvsadm。
4.2 keepAlived安裝和配置
4.2.1 安裝keepAlived
在兩台lvs伺服器上都需要安裝keepAlived,安裝命令如下:
yum install -y keepalived
keepAlived安裝完成後,在/etc/keepalived目錄下有一個keepalived.conf配置文件,內容如下:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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#標識當前lvs是主,根據實際lvs伺服器規劃確定,可選值MASTER和BACKUP
interface eth0#lvs伺服器提供伺服器的網卡,根據實際伺服器網卡進行修改
virtual_router_id 51#lvs提供的服務所屬ID,目前無需修改
priority 100#lvs伺服器的優先順序,主伺服器最高,備份伺服器要低於主伺服器
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#virtual_ipaddress用於配置VIP和LVS伺服器的網卡綁定關係,一般需要修改
#示例: 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調度演算法,預設輪詢
lb_kind NAT#配置lvs工作模式,可以改為DR
persistence_timeout 50#用於指定同一個client在多久內,只去請求第一次提供服務的RS,為查看輪詢效 果,這裡需要改為0
protocol TCP#TCP協議
#配置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內的內容改為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
基於上述配置文件和實戰拓撲圖及伺服器規劃,對兩台lvs伺服器分別修改keepalived.conf配置如下:
lvs主伺服器
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 測試環境檢查
上述步驟執行完畢後,可以在lvs主伺服器和備份伺服器分別執行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 測試負載均衡
在客戶端發起請求,測試負載均衡,如下:
[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 網卡名 down命令暫時關閉網卡),客戶端繼續發起請求,查看是否可以正常訪問,如下:
[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
會發現,此時客戶端可以正常訪問,但只有RS2在提供服務。這說明,keepAlived檢測到了RS1伺服器異常,將其剔除了。
此時再啟動RS1伺服器,客戶端繼續訪問,會發現響應結果如下,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 網卡名 down命令,關閉主伺服器網卡,此時主伺服器不能提供服務。觀察備份伺服器是否將VIP綁定到自己,以及客戶端是否可以繼續正常訪問。如下:
關閉主伺服器網卡
[root@lvs01 keepalived]# ifconfig ens33 down
觀察備份伺服器,會發現VIP已經綁定過來了。這裡實際是keepAlived檢測到了主伺服器的異常,而做出的故障轉移和自動切換。
[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
觀察客戶端是否可以繼續正常訪問
[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主伺服器恢復
上述測試通過後,可以開啟主伺服器網卡,讓其能夠提供服務,然後觀察VIP是否會回到主伺服器。
開啟主伺服器網卡
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
會發現,VIP重新綁定到了主伺服器。
本文由傳智教育博學谷 - 狂野架構師教研團隊發佈
如果本文對您有幫助,歡迎關註和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力
轉載請註明出處!