LVS+KeepAlived高可用部署實戰應用

来源:https://www.cnblogs.com/jiagooushi/archive/2022/07/28/16529509.html
-Advertisement-
Play Games

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 高可用拓撲圖

file

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伺服器既要處理請求的接入,又要處理請求的響應。因此存在較大的性能瓶頸。

file

2.3.2 DR模式

​ DR(Direct Routing)模式是LVS的預設工作模式,也叫直接路由模式。只處理請求的接入,不處理請求的響應。因此性能高,瓶頸小。

file

2.3.3 TUN模式

​ TUN(Tunneling)模式需要伺服器支持IP隧道(IP tunneling,是路由器把一種網路層協議封裝到另一個協議中以跨過網路傳送到另一個路由器的處理過程)技術,限制較大,一般不用。

file

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實戰拓撲圖

file

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模式拓撲圖

file

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 實戰拓撲

file

為了測試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重新綁定到了主伺服器。
本文由傳智教育博學谷 - 狂野架構師教研團隊發佈
如果本文對您有幫助,歡迎關註和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力
轉載請註明出處!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為一個開發人員,都想寫出一手好的代碼,而不是別人稱的“屎山”,設計模式提供了一系列常見問題的解決方案,通過利用設計模式來儘可能統一規範,可以提高代碼的可維護性、可讀性、可擴展性。 ...
  • 更多精彩內容,歡迎關註公眾號:邏魔代碼 前言 用了多年的 MacOS 做開發,一系列諸如 Alfred、Item2、Oh-my-zsh 之類的工具,大大地提升了工作的效率和使用舒適度。新工作不給配 Mac 電腦,自己帶電腦每天背著實在麻煩,就花時間研究了下如何在 Windows 上配置一個高效的開發 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 一、MVC架構圖 Model 業務處理:業務邏輯(Service) 數據持久層:CRUD(Dao) View 展示數據 提供連接發起Servlet請求(a,form,img....) Controller(Servlet) 接收用戶的請求:(req:請求參數,Session信息) 交給業務層處理對應 ...
  • 1.認識Spring Security Spring Security提供了聲明式的安全訪問控制解決方案(僅支持基於Spring的應用程式),對訪問許可權進行認證和授權,它基於Spring AOP和Servlet過濾器,提供了安全性方面的全面解決方案。 除常規的認證和授權外,它還提供了 ACLs、LD ...
  • MyDisruptor V6版本介紹 在v5版本的MyDisruptor實現DSL風格的API後。按照計劃,v6版本的MyDisruptor作為最後一個版本,需要對MyDisruptor進行最終的一些細節優化。 v6版本一共做了三處優化: 解決偽共用問題 支持消費者線程優雅停止 生產者序列器中維護消 ...
  • Java數組 9.稀疏數組 什麼是稀疏數組? 當一個數組中大部分元素為0,或者為同一值的數組時,可以使用稀疏數組來保存該數組。 稀疏數組的處理方式是: 記錄數組一共有幾行幾列,有多少個不同的值 把具有不同值 的元素和行列及值記錄在一個小規模的數組中,從而縮小程式的規模 如下圖:左邊是原始數組,右邊是 ...
  • 線程的生命周期 一、通用的java生命周期 ​ 線程的生命周期通常有五種狀態。這五種狀態分別是:新建狀態、就緒狀態、運行狀態、阻塞狀態和死亡狀態。 **新建狀態:**指的是線程已經被創建,但是還不允許分配 CPU 執行。 就緒狀態: 指的是線程可以分配 CPU 執行。在這種狀態下,真正的操作系統線程 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...