LVS介紹與配置

FuShudi發表於2024-07-05

目錄
  • 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 配置永久生效

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,nginx01hello 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
  1. net.ipv4.conf.dummy02.arp_ignore = 1
  • 作用:當收到一個ARP請求時,如果該請求的目標IP地址不是該網路卡上的本地地址,則忽略此請求。
  • 通俗解釋:這條配置會讓dummy02這個網路卡只響應那些明確指向它自己IP地址的ARP請求,避免不必要的ARP響應。
  1. net.ipv4.conf.all.arp_ignore = 1
  • 作用:全域性設定,影響系統中所有的網路卡。所有網路卡都會忽略那些目標IP地址不是自己IP的ARP請求。
  • 通俗解釋:這讓整個系統的所有網路卡只對直接發給它們IP地址的ARP請求做出響應,增加安全性和網路效能。
  1. net.ipv4.conf.all.arp_announce = 2
  • 作用:全域性設定,控制系統在傳送ARP請求時的源IP地址選擇策略。設定為2表示使用最匹配的(即與目的地在同一子網內的)IP地址。
  • 通俗解釋:這可以減少網路中出現ARP衝突的可能性,因為系統會選擇最合適的IP地址來傳送ARP請求。
  1. 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.

相關文章