- LVS(Linux Virtual Server)
- 1. 概述
- 1.1 LVS簡介
- 1.2 LVS架構
- 2. LVS工作模式
- 2.1 NAT模式(Network Address Translation)
- 2.2 DR模式(Direct Routing)
- 2.3 TUN模式(IP Tunneling)
- 3. LVS排程演算法
- 3.1 輪詢(Round Robin)
- 3.2 最小連線數(Least Connections)
- 3.3 加權輪詢(Weighted Round Robin)
- 3.4 加權最小連線數(Weighted Least Connections)
- 3.5 基於區域性性的最少連線數(Locality-Based Least Connections)
- 3.6 基於區域性性的最少連線數(帶複製)(Locality-Based Least Connections with Replication)
- 3.7 目標地址雜湊(Destination Hashing)
- 3.8 源地址雜湊(Source Hashing)
- 4. LVS配置示例
- 4.1 NAT模式配置示例
- 4.1.1 安裝LVS工具,開啟核心轉發模組
- 4.1.2 關閉所有節點的防火牆,selinux
- 4.1.3 配置LVS
- 4.1.4 配置nginx
- 4.1.5 配置閘道器
- 4.1.6 訪問叢集
- 4.2 DR模式配置例項
- 4.2.1 配置VIP
- 4.2.2 修改核心引數
- 4.2.3 配置LVS
- 4.2.4 客戶端驗證
- 4.3 配置永久生效
- 4.1 NAT模式配置示例
- 1. 概述
LVS(Linux Virtual Server)
我會先寫工作原理然後再寫配置步驟,配置步驟不懂的可以再返回來看一下工作原理
1. 概述
1.1 LVS簡介
LVS(Linux Virtual Server)是一種基於Linux作業系統的負載均衡解決方案。它透過將請求分發到多個後端伺服器上,實現高可用性和可擴充套件性。LVS常用於網站、資料庫等需要高併發訪問的場景。
1.2 LVS架構
-
IPVS(IP Virtual Server): LVS的核心元件,負責實現負載均衡功能。
-
排程器(Director): LVS中的負載均衡器,接收來自客戶端的請求,並根據排程演算法將請求轉發到真實伺服器。
-
真實伺服器(Real Server): 實際處理客戶端請求的伺服器。
-
虛擬IP(VIP): 提供給客戶端訪問的IP地址,實際由排程器管理。
2. LVS工作模式
2.1 NAT模式(Network Address Translation)
- 工作原理
- 在NAT模式下,負載均衡器(排程器)接收客戶端的請求,然後將請求轉發給真實伺服器,真實伺服器處理請求後,將響應資料傳送回負載均衡器,再由負載均衡器返回給客戶端。負載均衡器充當了中間人的角色,類似於郵遞員收集信件並分發給不同的地址,再將回復的信件送回給發件人。
- 優缺點:
- 優點: 適用於私有網路,配置簡單。可以隱藏真實伺服器的IP,增加安全性。
- 缺點: 由於所有流量都經過負載均衡器,負載均衡器的效能和頻寬成為瓶頸。
- 配置步驟
- 新增虛擬服務
- 新增真實伺服器
- 設定真實伺服器的閘道器
2.2 DR模式(Direct Routing)
- 工作原理
- 在DR模式下,客戶端請求透過負載均衡器傳送到真實伺服器,但真實伺服器的響應直接返回給客戶端,而不經過負載均衡器。可以將其類比為一個快遞公司的排程中心(負載均衡器),負責將快遞單(請求)分配給不同的快遞員(真實伺服器),但快遞員直接將快遞(響應)送到客戶手中。
- 優缺點:
- 優點: 高效能,因為響應資料不經過負載均衡器,減少了負載均衡器的負擔,適合大流量場景。
- 缺點: 網路配置複雜,要求負載均衡器和真實伺服器在同一物理網路中。
- 配置步驟
- 新增虛擬服務
- 新增真實伺服器
- 配置真實伺服器的迴環介面(lo)
2.3 TUN模式(IP Tunneling)
- 工作原理: 在TUN模式下,客戶端請求透過IP隧道(如GRE隧道)從負載均衡器傳送到真實伺服器,真實伺服器處理請求後,直接將響應資料返回給客戶端。這類似於透過地下通道(隧道)將信件送到目標地點,目標地點直接回覆信件。
- 優缺點:
- 優點: 適用於跨網路負載均衡,負載均衡器和真實伺服器可以在不同的物理網路中。
- 缺點: 網路配置複雜,需要隧道支援,增加了網路管理的複雜性。
- 配置步驟
- 新增虛擬服務
- 新增真實伺服器
- 配置真實伺服器的隧道介面(tunl0)
3. LVS排程演算法
3.1 輪詢(Round Robin)
- 簡介: 將請求依次分發給每個真實伺服器,迴圈進行。
- 工作原理: 類似於輪流發牌,每個伺服器依次收到一個請求。
- 適用場景: 適用於負載較為均衡的場景。
3.2 最小連線數(Least Connections)
- 簡介: 將請求分發給當前連線數最少的伺服器。
- 工作原理: 類似於選擇最空閒的售貨員來處理顧客。
- 適用場景: 適用於伺服器處理時間差異較大的場景。
3.3 加權輪詢(Weighted Round Robin)
- 簡介:根據伺服器權重進行輪詢,權重高的伺服器分配更多的請求。
- 工作原理: 類似於根據員工的工作能力分配任務,能力強的分配更多工。
- 適用場景: 適用於伺服器效能差異較大的場景
3.4 加權最小連線數(Weighted Least Connections)
- 簡介: 將請求分發給當前連線數最少且權重最高的伺服器。
- 工作原理: 類似於在最空閒的售貨員中選擇最有經驗的來處理顧客。
- 適用場景: 適用於伺服器效能和處理時間差異都較大的場景。
3.5 基於區域性性的最少連線數(Locality-Based Least Connections)
- 簡介: 優先將請求分配給之前處理過相同客戶端請求的伺服器。
- 工作原理: 類似於優先選擇熟悉客戶需求的售貨員。
- 適用場景: 適用於需要會話保持的場景,如購物車、線上交易等。
3.6 基於區域性性的最少連線數(帶複製)(Locality-Based Least Connections with Replication)
- 簡介: 在基於區域性性的最少連線數基礎上,考慮了伺服器複製問題,防止某一伺服器過載。
- 工作原理: 類似於多個售貨員同時處理同一客戶的需求,但優先選擇最空閒的。
- 適用場景: 適用於大規模分散式系統。
3.7 目標地址雜湊(Destination Hashing)
- 簡介: 根據請求的目標地址計算雜湊值,並將其分配到對應的伺服器。
- 工作原理: 類似於將郵件按郵政編碼分發到不同的郵局。
- 適用場景: 適用於固定的目標地址請求分配。
3.8 源地址雜湊(Source Hashing)
-
簡介: 根據請求的源地址計算雜湊值,並將其分配到對應的伺服器。
-
工作原理: 類似於將郵件按發件人地址分發到不同的郵局。
-
適用場景: 適用於固定的源地址請求分配。
4. LVS配置示例
4.1 NAT模式配置示例
節點 | IP |
---|---|
LVS | 192.168.200.170(public) 192.168.100.164(internal) |
Nginx01 | 192.168.100.163 |
Nginx02 | 192.168.100.162 |
透過這個規劃表大家就可以看出來,提供服務的Nginx是在一個內網裡面,客戶端不可能訪問到的,接下來看需求
- 需求:LVS有2個網路卡,一個為對外提供服務的網路卡,網段為
192.168.200.0/24
,另一個是連線內部真實伺服器的IP段192.168.100.0/24
,現在要求配置LVS,使得客戶端訪問192.168.200.170:80,然後LVS會根據輪詢策略來將請求轉發到對應的Nginx伺服器上
4.1.1 安裝LVS工具,開啟核心轉發模組
[root@oe01 ~]# yum install ipvsadm -y
[root@oe01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@oe01 ~]# sysctl -p
net.ipv4.ip_forward = 1
安裝就只需要安裝這個包就可以了,不需要啟動任何服務
4.1.2 關閉所有節點的防火牆,selinux
# 所有節點執行這些命令
[root@oe01 ~]# systemctl disable --now firewalld
[root@oe01 ~]# setenforce 0
4.1.3 配置LVS
# 1. 新增虛擬服務
[root@oe01 ~]# ipvsadm -A -t 192.168.200.170:80 -s rr
# 2. 新增真實伺服器
[root@oe01 ~]# ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.163:80 -m
[root@oe01 ~]# ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.162:80 -m
# 檢視
[root@oe01 ~]# 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.200.170:80 rr
-> 192.168.100.162:80 Masq 1 0 0
-> 192.168.100.163:80 Masq 1 0 0
這樣LVS就配置好了,我們來解釋一下引數
- 第一步新增服務裡面的引數解釋
- -A : 建立一個虛擬服務(service)
- -t :指定協議為tcp 地址為192.168.200.170:80,這個就是對外提供服務的地址+埠,如果是UDP的話就是 -u
- -s :指定工作模式為輪詢,rr就是輪詢
- 第二步的引數:
- -a:這是是小寫a,指定的是新增一個伺服器(server)
- -t:這個還是與之前的一樣,可以換一個理解方式,把他理解成服務名,因為在LVS裡面這個就可以代表服務名
- -r:real-server真實伺服器的地址+埠
- -m:指定NAT模式
- -i: 指定Tun模式
- -g: 指定DR模式
到這裡,我們LVS上的操作就做完了,然後我們需要到Nginx上配置
4.1.4 配置nginx
我們將2個nginx的index.html檔案改為hello,nginx01
和hello nginx02
# 第一臺nginx
[root@oe02 ~]# echo "hello nginx01" > /usr/share/nginx/html/index.html
# 第二臺nginx
[root@oe03 ~]# echo "hello nginx02" > /usr/share/nginx/html/index.html
這樣我們的Nginx就配置好了,但是你現在使用客戶端去訪問192.168.200.170
這個地址的話是出不來的,我們還需要給nginx配置閘道器,閘道器指向LVS的192.168.100.164
這個地址
4.1.5 配置閘道器
[root@oe02 ~]# ip route add default via 192.168.100.100 dev ens33
[root@oe03 ~]# ip route add default via 192.168.100.100 dev ens33
這樣我們的配置也完成了,我們來使用客戶端訪問一下
4.1.6 訪問叢集
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02
看這個命令提示符就可以看出來,我們訪問已經被輪詢到不同的節點上了,我們可以在LVS節點上看見連線
[root@oe01 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:04 TIME_WAIT 192.168.200.1:56457 192.168.200.170:80 192.168.100.162:80
TCP 01:04 TIME_WAIT 192.168.200.1:56455 192.168.200.170:80 192.168.100.163:80
TCP 01:02 TIME_WAIT 192.168.200.1:56453 192.168.200.170:80 192.168.100.162:80
TCP 01:05 TIME_WAIT 192.168.200.1:56458 192.168.200.170:80 192.168.100.163:80
到這裡NAT模式就配置結束了
4.2 DR模式配置例項
節點 | IP | 網路卡模式 |
---|---|---|
LVS | 192.168.200.170 192.168.200.200(VIP) |
NAT模式 |
Nginx01 | 192.168.200.171 192.168.200.200(VIP) |
NAT模式 |
Nginx02 | 192.168.200.172 192.168.200.200(VIP) |
NAT模式 |
4.2.1 配置VIP
首先每個節點都要配置一個VIP
[root@oe01 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
[root@oe02 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
[root@oe03 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
這個dummy就是一個本地的環回口,所有的節點的這個地址都配置的相同,因為這是個本地環回口,不會產生IP衝突,就像你的電腦的127.0.0.1一樣,所以不用擔心IP衝突
4.2.2 修改核心引數
以下操作在LVS配置
# 開啟IP轉發
[root@oe01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@oe01 ~]# sysctl -p
net.ipv4.ip_forward=1
LVS的配置就完成了,接下來修改後端Nginx的核心
以下操作在RS(真實伺服器)上,每個RS都要做
[root@oe02 ~]# vim /etc/sysctl.conf
net.ipv4.conf.dummy02.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy02.arp_announce = 2
net.ipv4.conf.dummy02.arp_ignore = 1
- 作用:當收到一個ARP請求時,如果該請求的目標IP地址不是該網路卡上的本地地址,則忽略此請求。
- 通俗解釋:這條配置會讓
dummy02
這個網路卡只響應那些明確指向它自己IP地址的ARP請求,避免不必要的ARP響應。
net.ipv4.conf.all.arp_ignore = 1
- 作用:全域性設定,影響系統中所有的網路卡。所有網路卡都會忽略那些目標IP地址不是自己IP的ARP請求。
- 通俗解釋:這讓整個系統的所有網路卡只對直接發給它們IP地址的ARP請求做出響應,增加安全性和網路效能。
net.ipv4.conf.all.arp_announce = 2
- 作用:全域性設定,控制系統在傳送ARP請求時的源IP地址選擇策略。設定為
2
表示使用最匹配的(即與目的地在同一子網內的)IP地址。 - 通俗解釋:這可以減少網路中出現ARP衝突的可能性,因為系統會選擇最合適的IP地址來傳送ARP請求。
net.ipv4.conf.dummy02.arp_announce = 2
- 作用:僅影響
dummy02
網路卡,作用與上一條相同,即在dummy02
網路卡上傳送ARP請求時也使用最匹配的源IP地址。 - 通俗解釋:這讓
dummy02
網路卡在傳送ARP請求時更精確地選擇它的源IP地址,減少網路中可能的衝突。
4.2.3 配置LVS
在LVS節點上
[root@oe01 ~]# ipvsadm -A -t 192.168.200.200:80 -s rr
[root@oe01 ~]# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.171:80 -g
[root@oe01 ~]# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.172:80 -g
- -g:是指定路由模式,也就是DR
所有的配置就做完了,接下來我們驗證一下
4.2.4 客戶端驗證
C:\Users\86156>curl 192.168.200.200
hello nginx01
C:\Users\86156>curl 192.168.200.200
hello nginx02
C:\Users\86156>curl 192.168.200.200
hello nginx01
C:\Users\86156>curl 192.168.200.200
hello nginx02
客戶端可以成功訪問到後端的nginx,配置就做好了
4.3 配置永久生效
剛剛我們寫的那些LVS的配置都是臨時生效的,重啟之後就不存在了,想要他永久生效的話可以執行一條命令讓他生成一個檔案,然後開啟服務就可以了
[root@oe01 ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@oe01 ~]# cat /etc/sysconfig/ipvsadm
-A -t oe01:http -s rr
-a -t oe01:http -r 192.168.200.171:http -g -w 1
-a -t oe01:http -r 192.168.200.172:http -g -w 1
[root@oe01 ~]# systemctl enable --now ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.