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 訪問叢集

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

安裝就只需要安裝這個包就可以了,不需要啟動任何服務

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模式

到這裡,我們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模式就配置結束了

相關文章