LVS基礎-四種模式原理與實現

十五十六發表於2018-09-11

簡介

LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器叢集系統。本專案在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。現在 LVS 已經是 Linux 核心標準的一部分。使用 LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 作業系統實現一個高效能高可用的 Linux 伺服器叢集,它具有良好的可靠性、可擴充套件性和可操作性。從而以低廉的成本實現最優的效能。LVS 是一個實現負載均衡叢集的開源軟體專案,LVS架構從邏輯上可分為排程層、Server叢集層和共享儲存。

LVS叢集的型別

  • lvs-nat:修改請求報文的目標IP;
  • lvs-dr:操縱封裝新的MAC地址;
  • lvs-tun:在原請求IP報文之外新加一個IP首部;
  • lvs-fullnat:修改請求報文的源和目標IP;

ipvsadm命令:

ipvsadm命令:
ipvs工作在核心,ipvsadm用來管理ipvs的使用者空間工具
格式:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]               
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]

常用的命令:

新增一個叢集服務

ipvsadm -A -t|u|f service-address [-s scheduler] [-p [ti meout]]
-A:新增一個叢集服務
service-address:一般是vip,提供給使用者訪問的ip
-t|u|f:
        -t: TCP協議的埠,VIP:TCP_PORT
        -u: UDP協議的埠,VIP:UDP_PORT
        -f:firewall MARK,是一個數字;
-s:排程方法,預設wlc
-p:持久連結時間

刪除一個叢集服務

ipvsadm -D -t|u|f service-address
-t|u|f:
        -t: TCP協議的埠,VIP:TCP_PORT
        -u: UDP協議的埠,VIP:UDP_PORT
        -f:firewall MARK,是一個數字;

在叢集中新增一個RS

ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-a:在叢集中新增一個RS
-t|u|f:
        -t: TCP協議的埠,VIP:TCP_PORT
        -u: UDP協議的埠,VIP:UDP_PORT
        -f:firewall MARK,是一個數字;
 -r server-address :後端Real server ip
 [-g|i|m]: 
       -g:gateway, dr型別
       -i: ipip, tun型別
       -m: masquerade, nat型別
-w:指定權重

從叢集中刪除某個RS

ipvsadm -d -t|u|f service-address -r server-address

-d:刪除
-t|u|f:
        -t: TCP協議的埠,VIP:TCP_PORT
        -u: UDP協議的埠,VIP:UDP_PORT
        -f:firewall MARK,是一個數字;
 -r server-address :後端Real server ip

清空定義的所有內容

ipvsadm -C

檢視:

ipvsadm -L|l [options]
options:
        --numeric, -n:用數字的格式輸出ip和埠
        --exact:expand numbers (display exact values)
        --connection, -c:輸出當前ipvs連線
        --stats:輸出狀態資訊
        --rate :檢視速率

儲存和過載:

ipvsadm -S  #儲存規則
ipvsadm -R  #過載規則

相關術語

  • DS:Director Server。指的是前端負載均衡器節點。
  • RS:Real Server。後端真實的工作伺服器。
  • VIP:Virtual ip向外部直接面向使用者請求,作為使用者請求的目標的IP地址。
  • DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
  • RIP:Real Server IP,後端伺服器的IP地址。
  • CIP:Client IP,訪問客戶端的IP地址。

排程方法

  1. 輪叫排程 rr
    這種演算法是最簡單的,就是按依次迴圈的方式將請求排程到不同的伺服器上,該演算法最大的特點就是簡單。輪詢演算法假設所有的伺服器處理請求的能力都是一樣的,排程器會將所有的請求平均分配給每個真實伺服器,不管後端 RS 配置和處理能力,非常均衡地分發下去。
  2. 加權輪叫 wrr
    這種演算法比 rr 的演算法多了一個權重的概念,可以給 RS 設定權重,權重越高,那麼分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr演算法的一種優化和補充, LVS 會考慮每臺伺服器的效能,並給每臺伺服器新增要給權值,如果伺服器A的權值為1,伺服器B的權值為2,則排程到伺服器B的請求會是伺服器A的2倍。權值越高的伺服器,處理的請求越多。
  3. 最少連結 lc
    這個演算法會根據後端 RS 的連線數來決定把請求分發給誰,比如 RS1 連線數比 RS2 連線數少,那麼請求就優先發給 RS1
  4. 加權最少連結 wlc
    這個演算法比 lc 多了一個權重的概念。
  5. 基於區域性性的最少連線排程演算法 lblc
    這個演算法是請求資料包的目標 IP 地址的一種排程演算法,該演算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的伺服器,如果這臺伺服器依然可用,並且有能力處理該請求,排程器會盡量選擇相同的伺服器,否則會繼續選擇其它可行的伺服器
  6. 複雜的基於區域性性最少的連線演算法 lblcr
    記錄的不是要給目標 IP 與一臺伺服器之間的連線記錄,它會維護一個目標 IP 到一組伺服器之間的對映關係,防止單點伺服器負載過高。
  7. 目標地址雜湊排程演算法 dh
    該演算法是根據目標 IP 地址通過雜湊函式將目標 IP 與伺服器建立對映關係,出現伺服器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該伺服器。
  8. 源地址雜湊排程演算法 sh
    與目標地址雜湊排程演算法類似,但它是根據源地址雜湊演算法進行靜態分配固定的伺服器資源

nat模式

這裡寫圖片描述
過程

  1. 當使用者訪問Director Server,資料包會先進入核心空間的PREPOUTING鏈,這時候源ip地址為cip(使用者自己的ip),目的ip為vip
  2. 在PREPOUTING鏈上檢查發現,vip是自己,於是傳送到核心空間的INPUT鏈
  3. ipvs工作在INPUT鏈上,發現vip是叢集服務。修改資料包的目的ip為後端伺服器的rip(後端伺服器可以不止一個,上圖只是假設分配給了第一臺real server)然後傳送資料包到POSTROUTING鏈
  4. Director Server將資料包傳送到rip1
  5. rip1收到請求做出處理,構建響應報文,此時資料包源地址為rip1,目的地址為cip
  6. 當響應的資料包到達Director Server,Director Server會自動將源ip改為vip,這時候返回給使用者的報文源ip為vip,目的ip為cip

nat模式特點

  • RIP和DIP必須在同一個IP網路,且應該使用私網地址;RS的閘道器要指向DIP;
  • 請求報文和響應報文都必須經由Director轉發;Director易於成為系統瓶頸;
  • 支援埠對映,可修改請求報文的目標PORT;
  • vs必須是Linux系統,rs可以是任意系統;

實驗測試:
拓撲圖
這裡寫圖片描述

DIP:192.168.253.141
RIP1:192.168.253.140
RIP2:192.168.253.129

實驗內容:負載均衡一個web服務。RS1和RS2提供web服務。DR負責將請求分發到2個RS上,因為是校園網,沒辦法使用橋接網路。所以這裡DR伺服器上DIP和VIP都是192.168.253.141

第一步:現在DR上下載ipvsadm,ipvs的使用者空間管理工具

yum install ipvsadm

第二步:在DR上新建一個叢集服務

##新建一個叢集服務
ipvsadm -A -t 192.168.253.141:80 -s rr  
##新增2個RS
ipvsadm -a -t 192.168.253.141:80 -r 192.168.253.140:80 -m -w 1
ipvsadm -a -t 192.168.253.141:80 -r 192.168.253.129:80 -m -w 1

第三步:在RS1和RS2上搭建web服務。

RS1:
yum install httpd
echo "192.168.253.140" > /var/www/html/index.html
systemctl  start httpd

RS2:
yum install httpd
echo "192.168.253.129" > /var/www/html/index.html
systemctl  start httpd

第四步:測試
這裡寫圖片描述
成功。

DR模式

通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的介面的MAC,目標MAC是某挑選出的RS的RIP所在介面的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

這裡寫圖片描述

過程:

  1. 使用者傳送請求到DR,首先進入DR核心空間的PREROUTING鏈,檢查發現VIP是自己,於是將資料包傳送到INPUT鏈
  2. INPUT鏈上工作著ipvs,檢查是否是叢集服務,如果是則將目標MAC地址修改為後端服務Real server的mac地址,然後將資料包傳送到POSTROUTING鏈,此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RS的MAC地址
  3. 當RS收到資料包的時候,拆開的時候,發現mac是自己,於是接受報文發往INPUT鏈再到使用者空間處理,然後將響應報文傳送出去。這裡不需要將資料包傳送到DR,可以通過別的網路卡出去。 此時的源IP地址為VIP,目標IP為CIP,源MAC地址為RSMAC,目的MAC地址為CMAC
  4. 資料包到達客戶端

DR模式特點:

  1. 確保前端路由器將目標IP為VIP的請求報文發往Director,因為RS和DR都擁有VIP,如果前端的路由器發起arp廣播詢問誰是VIP擁有者,這時候如果DR和RS都應答自己擁有VIP就會出現爭搶。導致DR無法正常分配請求給後端RS。解決的方法有幾種

    • 在前端閘道器做靜態繫結,將VIP的mac繫結在DR上
    • 在RS上使用arptables;在arp的層次上實現在ARP解析時做防火牆規則,過濾RS響應ARP請求。缺點:配置麻煩,複雜
    • 在RS上修改核心引數(arp_announce,arp_ignore)以限制arp通告及應答級別;(最常用)
      限制響應級別:arp_ignore
      0:預設值,表示可使用本地任意介面上配置的任意地址進行響應;
      1: 僅在請求的目標IP配置在本地主機的接收到請求報文介面上時,才給予響應;
      限制通告級別:arp_announce
      0:預設值,把本機上的所有介面的所有資訊向每個介面上的網路進行通告;
      1:儘量避免向非直接連線網路進行通告;
      2:必須避免向非本網路通告;
  2. RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網路;RIP的閘道器不能指向DIP,以確保響應報文不會經由Director;

  3. RS跟Director要在同一個物理網路;
  4. 請求報要文經由Director,但響應不能經由Director,而是由RS直接發往Client;
  5. 不支援埠對映;

實驗測試:
環境:
DR:
VIP:192.168.253.192
DIP:192.168.253.141
RS1:
VIP:192.168.253.192(lo:0介面上)
RIP1:192.168.253.140
RS2:
VIP:192.168.253.192(lo:0介面上)
RIP1:192.168.253.129

第一步:在DR上設定VIP

ifconfig ens33:0 192.168.253.192 up

第二步:在DR上建立叢集服務

ipvsadm -A -t 192.168.253.192:80 -s rr
ipvsadm -a -t 192.168.253.192:80 -r 192.168.253.129 -g  -w 1
ipvsadm -a -t 192.168.253.192:80 -r 192.168.253.140 -g  -w 1

第三步:在RS1上配置VIP,修改核心引數

配置VIP
ifconfig lo:0 192.168.253.192/32   up
修改核心引數
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

第四步:在RS2上配飾VIP,修改核心引數

ifconfig lo:0 192.168.253.192/32   up
修改核心引數
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

第五步:測試,別的伺服器上測試
這裡寫圖片描述

根據這個過程我們可以作2個指令碼,一個用於DR配置,另一個用於RS配置
DR端配置指令碼

#!/bin/bash
#
vip='192.168.253.192'
iface='en33:0'
mask='255.255.255.255'
port='80'
rs1='192.168.253.140'
rs2='192.168.253.129'
scheduler='rr'
type='-g'

case $1 in
start)
    ifconfig $iface $vip netmask $mask broadcast $vip up
    iptables -F

    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    ;;
stop)
    ipvsadm -C
    ifconfig $iface down
    ;;
*)
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac    

RS端配置指令碼

#!/bin/bash
#
vip=192.168.253.192
mask='255.255.255.255'

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig lo:0 $vip netmask $mask broadcast $vip up
    route add -host $vip dev lo:0
    ;;
stop)
    ifconfig lo:0 down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ;;
*) 
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac    

tun模式(不常用)

轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);

特點:
(1) DIP, VIP, RIP都應該是公網地址;
(2) RS的閘道器不能,也不可能指向DIP;
(3) 請求報文要經由Director,但響應不能經由Director;
(4) 不支援埠對映;
(5) RS的OS得支援隧道功能;

fullnat模式(不常用)

通過同時修改請求報文的源IP地址和目標IP地址進行轉發;此型別預設不支援;

(1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網路;因此,RIP的閘道器一般不會指向DIP;
(2) RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但Director還要將其發往Client;
(3) 請求和響應報文都經由Director;
(4) 支援埠對映;

參考:
https://www.cnblogs.com/lipengxiang2009/p/7451050.html

相關文章