LVS實現負載均衡

LVS是Linux Virtual Server的簡稱,即Linux虛擬服務器。從Linux內核2.4版本之後,已經將LVS內置於內核中,提供負載均衡技術。


目錄

  • LVS理論基礎
  • ipvsadm命令
  • DR和NAT實驗
  • LVS持久連接
  • LVS健康監測

LVS理論基礎

1、LVS的優勢
高併發能力強  LVS基於內核網絡層工作,有着超強的併發處理能力,單臺LVS可以承受上萬的併發連接。
穩定性高    LVS是基於4層的負載均衡軟件,因此LVS在所有負載均衡軟件中性能最強,穩定性最高,消耗CPU和內存少。
應用範圍廣  LVS是工作在4層,所以它可以對應用層的所有協議作負載均衡,包括http、DNS、ftp等。
2、LVS的組件
ipvsadm LVS已經集成於內核中,用戶是無法直接操作內核空間的程序的,因此需要一個用戶空間的管理工具,ipvsadm就是一個用戶空間的命令行工具,用於管理集羣。
ipvs   工作於內核netfilter INIPUT鉤子上的一個程序,並且根據ipvsadm定義的規則實現請求的轉發。
查看Linux內核是否支持ipvs:

`grep -i -C 10 --color=auto ipvs  /boot/config-2.6.32-696.el6.x86_64`

3、LVS的工作流程
LVS實現負載均衡
1、用戶請求的數據包到達負載均衡器的內核空間,首先經過的是內核的PREROUTING鏈,
2、因爲請求的數據包的目的地址一定是本機,然後將數據包送到INPUT鏈,
3、ipvs就工作在INPUT鏈上,ipvs利用ipvsadm定義的規則工作,ipvs對數據包進行檢查,如果目的地址和端口不在規則裏邊,則將數據包送往用戶空間,
4、如果目的地址和端口在規則裏邊,則將數據包的目的地址和端口修改爲後端真實服務器,然後將修改後的數據包送往POSTROUTING鏈,
5、最後經過POSTROUTING鏈將數據包轉發給後端服務器。
4、LVS的工作模式
NAT ①客戶端發送數據包至負載均衡器,數據包的源IP是CIP,目的IP是VIP。數據包首先到達的是內核空間的PREROUTING鏈,②PREROUTING鏈判斷目的IP是VIP,確定VIP是本地IP,然後將其送往INPUT鏈。③INPUT鏈上的ipvs將數據包的目的IP修改爲RIP,然後發送給POSTROUTING鏈。④POSTROUTING鏈將數據包發送至後端服務器處理。⑤處理完之後,以源IP爲RIP,目的IP爲CIP的響應數據包返回給負載均衡器,⑥LVS收到之後再次修改數據包的IP地址,將數據包的源IP修改爲VIP,目的IP保持不變仍爲CIP,然後發往客戶端。
LVS實現負載均衡
NAT工作模式中,請求的流量和迴應的流量都必須經過前端的調度器,一次調度器成爲了整個服務器集羣的瓶頸,一旦調度器宕機,則整個集羣將出去癱瘓狀態,因此就出現了DR工作模式。
DR Direct Routing,①客戶端發送數據包至負載均衡器,數據包的源IP是CIP,目的IP是VIP。數據包首先到達的是內核空間的PREROUTING鏈,②PREROUTING鏈判斷目的IP是VIP,確定VIP是本地IP,然後將其送往INPUT鏈。③ipvs將數據包通過DIP的網卡發送給POSTROUTING鏈,其中源MAC自動修改爲DIP的MAC(因爲從DIP的網卡發送出去的),並且將目的MAC修改爲RIP的MAC,源IP和目的IP保持不變,④POSTROUTING鏈將數據包發送給交換機,交換機根據RIP的MAC地址將數據包送往指定的後端服務器,⑤處理外後將數據包通過lo接口轉發至eth0接口,由eth0將數據包發送出去,此時數據包的源IP和MAC是VIP:VIP的MAC,目的IP和MAC是CIP:CIP的MAC,⑥響應數據包最終交付給客戶端。
LVS實現負載均衡
DR工作模式的特點:因爲DR工作模式是根據MAC進行數據包轉發,因此RS跟負載均衡器必須在同一個局域網(廣播域)中;所有的請求報文都經過負載均衡器,所有的響應報文不經過負載均衡器;因爲DR工作模式的響應報文是RS直接回應的,因此負載均衡器和RS必須都配置同一個VIP地址,RS的lo接口配置VIP,這樣一來同一個局域網會有多個相同的IP,在進行ARP廣播的時候會出現紊亂,這時需要通過修改RS的內核參數從而阻止RS對ARP廣播進行迴應,這樣只有負載均衡器對VIP的ARP請求進行迴應;由於DR工作模式僅需要分析數據包的MAC首部,因此DR的處理能力特別高,擁有和硬件負載均衡設備相媲美的網絡吞吐和負載均衡能力。
TUN ①客戶端發送請求至負載均衡器,該數據包的源IP是CIP,目的IP是VIP,②LVS收到數據包後,將該數據包的首部再封裝一層IP首部,其中源IP爲DIP,目的IP爲RIP,將重整後的數據包送往後端服務器,③RS兩次處理該數據包,將響應數據包通過lo接口送往eth0接口,然後直接發送給客戶端。
LVS實現負載均衡
其中NAT和DR調度算法必須保證調度器和RS在同一個局域網中,也就是他們無法跨網段通信,而TUN調度算法則可以使得調度器和RS在不同的局域網中。
另外,通過對NAT工作模式進行改進,可以使得其跨網段通信,改進之後的工作模式爲fullnat模式。工作流程和原理如圖所示,
LVS實現負載均衡
5、LVS的調度算法
1、輪詢(rr)
請求按順序輪流分配到後端服務器上,後端每臺服務器接受請求的概率是一樣的。
2、加權輪詢(wrr)
LVS根據後端服務器的處理能力給後端每臺服務器設置權值。LVS可以自動詢問真實服務器的負載情況,然後動態的調整權值,權值大的收到請求的概率大。
3、目標地址散列(dh)
根據請求的目標IP地址,得出hash值,進而找出對應的服務器,這種調度算法適用於緩存服務器的負載均衡。
4、源地址散列(sh)
根據請求的源IP地址,得出hash值,進而找出對應的服務器,這種調度算法適用於session共享的情況。
5、最少連接(lc)
動態地將請求調度到後端連接數最少的服務器上。這種調度算法適用於後端每臺服務器性能相近的情況下。
6、加權最少連接(默認)(wlc)
LVS動態調整後端服務器的權值,權值大的將承受較大比例的活動連接負載。
7、最短延遲調度(sed)
8、永不排隊/最少隊列調度(nq)

ipvsadm命令

ipvs是集成與內核空間的,用戶無法直接操作,因此需要藉助管理工具ipvsadm,通過定義規則使得ipvs工作,類似於iptables。同樣該工具可以藉助yum安裝和源碼安裝。
常用選項:
-A --add-server 新加一條虛擬服務器記錄
-E --edit-server 編輯虛擬服務器記錄
-D --delete-server 刪除一條虛擬服務器記錄
-C --clear   清空所有的虛擬服務器記錄
-S --save   保存虛擬服務器規則
-R --restore  恢復虛擬服務器規則,從-S保存的規則中恢復
-t --tcp-service 表示tcp服務,指虛擬服務器
-u --udp-service 表示udp服務,指虛擬服務器
-s --schedule 使用的調度算法
  rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq  the default scheduler is wlc
-p  代表持久連接
-f  代表防火牆的標記
例子:
  ipvsadm -A -t 192.168.239.129:80 -s wlc
  ipvsadm -E -t 192.168.239.129:80 -s rr
  ipvsadm -S > /etc/sysconfig/ipvsadm
  ipvsadm -R < /etc/sysconfig/ipvsadm
-a 添加一條新的真實主機記錄
-r 添加真實主機的地址
-m 指定LVS的工作模式爲NAT
-w 指定真實服務器的權值
-g 指定LVS的工作模式爲DR(默認)
-i 指定LVS的工作模式爲TUN
例子:
  ipvsadm -a -t 192.168.239.129:80 -r 192.168.239.130 -m -w 1
-e 編輯一條虛擬服務器記錄中的某條真實服務器
-d 刪除一條虛擬服務器記錄中的某條真實服務器
-L|-l 列出所有的虛擬服務器記錄
-Z 清空當前的連接數(-l會顯示虛擬服務器中連接數量)
例子:
  ipvsadm -e -t 192.168.239.129:80 -r 192.168.239.130 -g -w 3
  ipvsadm -d -t 192.168.239.129:80 -r 192.168.239.230

實驗

LVS-DR模型
環境拓撲:

主機 IP 功能
LVS 192.168.239.250 調度器
Web1 192.168.239.129 RS
Web2 192.168.239.133 RS

前端負載均衡器的配置:

# 配置VIP至網卡別名
[root@LVS ~]# ifconfig eth0:0 192.168.239.250  netmask 255.255.255.0 up
# 定義LVS規則
[root@LVS ~]# ipvsadm -A -t 192.168.239.250:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.239.250:80 -r 192.168.239.129:80 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.239.250:80 -r 192.168.239.133:80 -g -w 2
[root@LVS ~]# 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.239.250:80 wrr
  -> 192.168.239.129:80           Route   1      0          0         
  -> 192.168.239.133:80           Route   2      0          0

後端RS的配置(兩臺RS的配置過程一樣,下面僅以Web1爲例):

[root@Web1 web]# ifconfig lo:0 192.168.239.250 broadcast 192.168.239.250 netmask 255.255.255.255 up
[root@Web1 web]# route add -host 192.168.239.250 dev lo:0
# 抑制ARP
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

上面的配置過程中有幾個問題要說明:
① 把VIP綁定至RS的lo迴環接口上邊,並且廣播地址爲自身和子網掩碼爲4個255,這樣做是爲了防止VIP衝突。
② 關於arp_ignore和arp_announce兩個內核參數的意義,請參考ARP抑制
然後在兩臺RS上邊部署Nginx的Web環境,分別往首頁寫入靜態內容
This is Web1
This is Web2
然後在瀏覽器的地址列中輸入VIP--192.168.239.250,刷新頁面,頁面內容能夠實現調轉說明負載均衡功能實現。
LVS實現負載均衡
LVS實現負載均衡
LVS-NAT模型
環境拓撲

主機 IP 功能
LVS VIP:192.168.0.105 調度器
LVS DIP:192.168.239.130 調度器
Web1 192.168.239.129 RS
Web2 192.168.239.133 RS

前端負載均衡配置:
LVS實現負載均衡

[root@LVS ~]# ipvsadm -A -t 192.168.0.105:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.105:80 -r 192.168.239.129:80 -m -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.0.105:80 -r 192.168.239.133:80 -m -w 2
# 這樣ipvs的規則已經定義完成
# 因爲NAT工作模式涉及到地址轉換,因此需要修改內核的ip_forward參數
[root@LVS ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 修改完成之後使其生效
[root@LVS ~]# sysctl -p

後端RS的配置:

# 因爲NAT的工作模式中,請求數據和迴應數據都需要經過調度器,因此需要將後端服務器的默認網關指向調度器的DIP
[root@Web1 ~]# route add default -gw 192.168.239.130
[root@Web2 ~]# route add default -gw 192.168.239.130

測試:
分別配置RS的web服務器,我這裏將html文本內容作爲後端RS的web內容,

[root@Web1 ~]# curl localhost
This is web1
[root@Web2 ~]# curl localhost
This is web2

然後訪問調度的VIP,查看返回的web內容,出現如下圖的效果說明負載均衡已經實現。
LVS實現負載均衡

LVS持久連接

HTTP協議是一種無狀態的協議,即每次發送請求之後就會馬上斷開連接。假如這種無狀態的協議運用在LVS負載均衡中,就會出現這樣的情況,以購物網站爲例子,用戶瀏覽一商品並加入購物車,這時候請求被送往RS1,然後就斷開連接,之後用戶又瀏覽一商品並加入購物車,這時候請求又被送往RS2,這樣用戶再次訪問購物車的時候,反饋給用戶的信息是購物車裏只有一件商品(假如請求被調度到RS1或RS2的其中一臺),這樣肯定是不行的。
解決這種問題的辦法是可以利用源地址hash調度算法,當然還可以利用LVS的持久連接。

# 基於上面例子中的NAT模型試驗,爲其增加持久連接
[root@LVS ~]# ipvsadm -E -t 192.168.0.105:80  -s wrr -p

LVS實現負載均衡
現在規劃這樣一個場景,客戶通過訪問VIP發來http請求,需要將80端口的請求和8080端口的請求在一定時間範圍內調度到後端同一臺服務器上,就是端口聯姻。完成這樣的需求需要藉助防火牆的標記持久連接。爲了看到測試的效果,規劃這樣的環境拓撲:

主機 IP 備註(或html頁面內容)
LVS VIP:192.168.0.105 調度器(NAT)
LVS DIP:192.168.239.130 調度器(NAT)
Web1 192.168.239.129:80 This is web1 with 80
Web1 192.168.239.129:8080 This is web1 with 8080
Web2 192.168.239.133:80 This is web2 with 80
Web2 192.168.239.133:8080 This is web2 with 8080

前端調度器的配置:

# 在防火牆上將VIP的80端口請求和8080端口請求都標記爲100
[root@LVS ~]# iptables -F
[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.105 -p tcp --dport 80 -j MARK --set-mark 100
[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.105 -p tcp --dport 8080 -j MARK --set-mark 100
# 利用標記添加ipvs規則(藉助ipvsadm命令的-f選項)
[root@LVS ~]# ipvsadm -C
[root@LVS ~]# ipvsadm -A -f 100 -s wrr -p
[root@LVS ~]# ipvsadm -a -f 100 -r 192.168.239.129 -m -w 1
[root@LVS ~]# ipvsadm -a -f 100 -r 192.168.239.133 -m -w 2

後端RS的配置:

# 開通後端服務器的80端口和8080端口的服務,然後他們各自的訪問內容分別如下
[root@Web1 ~]# curl http://localhost:80
This is web1 with 80
[root@Web1 ~]# curl http://localhost:8080
This is web1 with 8080
[root@Web2 ~]# curl http://localhost:80
This is web2 with 80
[root@Web2 ~]# curl http://localhost:8080
This is web2 with 8080
# 因爲是NAT的工作模式,因此需要將後端RS的網關指向DIP
[root@Web1 ~]# route add default gw 192.168.239.130 
[root@Web2 ~]# route add default gw 192.168.239.130

最後訪問VIP的80端口和8080端口,發現請求都會被調度到同一臺RS上。
LVS實現負載均衡

LVS健康監測

LVS本身是無法監測後端服務器的狀態的,即使後端某臺服務器宕機,LVS還是會把請求調度到這臺宕機的服務器上邊,這樣用戶就會無法得到響應,這對用戶的體驗是極差的。因此爲LVS加入了後端服務器健康狀態檢測機制,只有後端正常的服務器纔會接受請求。
這裏引入一個新的軟件包ldirectord,這個軟件包會爲系統開啓一個名叫ldirectord的守護進程,該進程專門用來管理ipvs的規則。該軟件的rpm包下載地址如下:
ldirectord-3.9.6(centos6)下載
下載完成之後完成安裝即可。安裝命令如下:

[root@LVS ~]# yum -y localinstall ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

ldirectord軟件包的主配置文件爲
  /etc/ha.d/ldirectord.cf
其中軟件包中會默認提供一個主配置文件的模板文件供參考,它是
  /usr/share/doc/ldirectord-3.9.6/ldirectord.cf
以實驗的LVS-DR模型的環境拓撲爲例,這裏使用ldirectord定義ipvs的規則,而不再使用ipvsadm命令。ldirectord的主配置文件的主要參數與其意義如下:

checktimeout=5      # 超時時間
checkinterval=1      # 兩次檢查的時間間隔
autoreload=yes      # 如果ldirectord的配置文件更新,是否主動重讀配置文件
logfile="/var/log/ldirectord.log"    # 定義日誌文件
quiescent=no         # 當後端某臺服務器故障的時候,yes表示將節點的權值降爲0,no表示將節點剔除ipvs的規則,當恢復正常後自動恢復值ipvs規則中
virtual=192.168.239.250:80   # 虛擬IP:port
    real=192.168.239.129:80 gate 1  # RS的IP:port+<工作模式>+[權值]
    real=192.168.239.133:80 gate 2
    service=http
    scheduler=wrr     # 調度算法
    #persistent=600
    protocol=tcp
# ldirectord實際上是根據下面參數來具體地監控RS是否正常
    checktype=negotiate  # ldirectord進程監控RS的方法
    checkport=80             # 監控的Port
    request="check.html" # 監控的文件
    receive="This web is OK" # 監控的文件內容

VIP的設置和後端服務器的ARP抑制的相關操作請參考實驗的LVS-DR模型,這裏不再重寫。
在後端的服務器的web根目錄下放入監控的文件

[root@Web1 web]# pwd
/data/web
[root@Web1 web]# cat check.html 
This web is OK
[root@Web2 web]# pwd
/data/web
[root@Web2 web]# cat check.html
This web is OK

開啓ldirectord進程,ipvsadm查看ipvs規則如下
LVS實現負載均衡
現在將後端Web1的監控的頁面內容改成其他內容,再次查看ipvs規則,結果如下圖。

[root@Web1 web]# pwd
/data/web
[root@Web1 web]# cat check.html 
This web is Down

LVS實現負載均衡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章