LVS 實現負載均衡原理及安裝配置詳解

一、負載均衡LVS基本介紹

LB集羣的架構和原理很簡單,就是當用戶的請求過來時,會直接分發到Director Server上,然後它把用戶的請求根據設置好的調度算法,智能均衡地分發到後端真正服務器(real server)上。爲了避免不同機器上用戶請求得到的數據不一樣,需要用到了共享存儲,這樣保證所有用戶請求的數據是一樣的。

LVS是 Linux Virtual Server 的簡稱,也就是Linux虛擬服務器。這是一個由章文嵩博士發起的一個開源項目,它的官方網是 http://www.linuxvirtualserver.org 現在 LVS 已經是 Linux 內核標準的一部分。使用 LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 操作系統實現一個高性能高可用的 Linux 服務器集羣,它具有良好的可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的性能。LVS 是一個實現負載均衡集羣的開源軟件項目,LVS架構從邏輯上可分爲調度層、Server集羣層和共享存儲。

二、LVS的基本工作原理
在這裏插入圖片描述

  1. 當用戶向負載均衡調度器(Director Server)發起請求,調度器將請求發往至內核空間

  2. PREROUTING鏈首先會接收到用戶請求,判斷目標IP確定是本機IP,將數據包發往INPUT鏈

  3. IPVS是工作在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和自己已定義好的集羣服務進行比對,如果用戶請求的就是定義的集羣服務,那麼此時IPVS會強行修改數據包裏的目標IP地址及端口,並將新的數據包發往POSTROUTING鏈

  4. POSTROUTING鏈接收數據包後發現目標IP地址剛好是自己的後端服務器,那麼此時通過選路,將數據包最終發送給後端的服務器

三、LVS的組成

LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。

1.ipvs(ip virtual server):一段代碼工作在內核空間,叫ipvs,是真正生效實現調度的代碼。
2. ipvsadm:另外一段是工作在用戶空間,叫ipvsadm,負責爲ipvs內核框架編寫規則,定義誰是集羣服務,而誰是後端真實的服務器(Real Server)

四、LVS相關術語

  1. DS:Director Server。指的是前端負載均衡器節點。
  2. RS:Real Server。後端真實的工作服務器。
  3. VIP:向外部直接面向用戶請求,作爲用戶請求的目標的IP地址。
  4. DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
  5. RIP:Real Server IP,後端服務器的IP地址。
  6. CIP:Client IP,訪問客戶端的IP地址。

下邊是三種工作模式的原理和特點總結。

五、LVS/NAT原理和特點

1、重點理解NAT方式的實現原理和數據包的改變
在這裏插入圖片描述
(1). 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP
(2). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(3). IPVS比對數據包請求的服務是否爲集羣服務,若是,修改數據包的目標IP地址爲後端服務器IP,然後將數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP
(4). POSTROUTING鏈通過選路,將數據包發送給Real Server
(5). Real Server比對發現目標爲自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲RIP,目標IP爲CIP
(6). Director Server在響應客戶端前,此時會將源IP地址修改爲自己的VIP地址,然後響應給客戶端。 此時報文的源IP爲VIP,目標IP爲CIP

2.LVS-NAT模型的特性

RS應該使用私有地址,RS的網關必須指向DIP

DIP和RIP必須在同一個網段內

請求和響應報文都需要經過Director Server,高負載場景中,Director Server易成爲性能瓶頸

支持端口映射

RS可以使用任意操作系統

缺陷:對Director Server壓力會比較大,請求和響應都需經過director server

六、LVS/DR原理和特點

1.重將請求報文的目標MAC地址設定爲挑選出的RS的MAC地址
在這裏插入圖片描述
(1) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP
(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(3) IPVS比對數據包請求的服務是否爲集羣服務,若是,將請求報文中的源MAC地址修改爲DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,然後將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址爲DIP的MAC地址,目標MAC地址爲RIP的MAC地址
(4) 由於DS和RS在同一個網絡中,所以是通過二層來傳輸。POSTROUTING鏈檢查目標MAC地址爲RIP的MAC地址,那麼此時數據包將會發至Real Server。
(5) RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之後,將響應報文通過lo接口傳送給eth0網卡然後向外發出。 此時的源IP地址爲VIP,目標IP爲CIP
(6) 響應報文最終送達至客戶端

2.LVS-DR模型的特性

	特點1:保證前端路由將目標地址爲VIP報文統統發給Director Server,而不是RS

	RS可以使用私有地址;也可以是公網地址,如果使用公網地址,此時可以通過互聯網對RIP進行直接訪問

	RS跟Director Server必須在同一個物理網絡中

	所有的請求報文經由Director Server,但響應報文必須不能進過Director Server

	不支持地址轉換,也不支持端口映射

	RS可以是大多數常見的操作系統

	RS的網關絕不允許指向DIP(因爲我們不允許他經過director)

	RS上的lo接口配置VIP的IP地址

	缺陷:RS和DS必須在同一機房中
  1. 特點1的解決方案:

    在前端路由器做靜態地址路由綁定,將對於VIP的地址僅路由到Director Server

    存在問題:用戶未必有路由操作權限,因爲有可能是運營商提供的,所以這個方法未必實用

    arptables:在arp的層次上實現在ARP解析時做防火牆規則,過濾RS響應ARP請求。這是由iptables提供的

    修改RS上內核參數(arp_ignore和arp_announce)將RS上的VIP配置在lo接口的別名上,並限制其不能響應對VIP地址解析請求。

七、LVS/Tun原理和特點

在原有的IP報文外再次封裝多一層IP首部,內部IP首部(源地址爲CIP,目標IIP爲VIP),外層IP首部(源地址爲DIP,目標IP爲RIP)
在這裏插入圖片描述
(1) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP 。
(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(3) IPVS比對數據包請求的服務是否爲集羣服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP爲爲DIP,目標IP爲RIP。然後發至POSTROUTING鏈。 此時源IP爲DIP,目標IP爲RIP
(4) POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(因爲在外層封裝多了一層IP首部,所以可以理解爲此時通過隧道傳輸)。 此時源IP爲DIP,目標IP爲RIP
(5) RS接收到報文後發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裏面還有一層IP首部,而且目標是自己的lo接口VIP,那麼此時RS開始處理此請求,處理完成之後,通過lo接口送給eth0網卡,然後向外傳遞。 此時的源IP地址爲VIP,目標IP爲CIP
(6) 響應報文最終送達至客戶端

LVS-Tun模型特性

RIP、VIP、DIP全是公網地址

RS的網關不會也不可能指向DIP

所有的請求報文經由Director Server,但響應報文必須不能進過Director Server

不支持端口映射

RS的系統必須支持隧道

其實企業中最常用的是 DR 實現方式,而 NAT 配置上比較簡單和方便,後邊實踐中會總結 DR 和 NAT 具體使用配置過程。

八、LVS的八種調度算法
1.輪叫調度 rr

這種算法是最簡單的,就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是簡單。輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器,不管後端 RS 配置和處理能力,非常均衡地分發下去。

  1. 加權輪叫 wrr

這種算法比 rr 的算法多了一個權重的概念,可以給 RS 設置權重,權重越高,那麼分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每臺服務器的性能,並給每臺服務器添加要給權值,如果服務器A的權值爲1,服務器B的權值爲2,則調度到服務器B的請求會是服務器A的2倍。權值越高的服務器,處理的請求越多。

  1. 最少鏈接 lc

這個算法會根據後端 RS 的連接數來決定把請求分發給誰,比如 RS1 連接數比 RS2 連接數少,那麼請求就優先發給 RS1

  1. 加權最少鏈接 wlc

這個算法比 lc 多了一個權重的概念。

  1. 基於局部性的最少連接調度算法 lblc

這個算法是請求數據包的目標 IP 地址的一種調度算法,該算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的服務器,如果這臺服務器依然可用,並且有能力處理該請求,調度器會盡量選擇相同的服務器,否則會繼續選擇其它可行的服務器

  1. 複雜的基於局部性最少的連接算法 lblcr

記錄的不是要給目標 IP 與一臺服務器之間的連接記錄,它會維護一個目標 IP 到一組服務器之間的映射關係,防止單點服務器負載過高。

  1. 目標地址散列調度算法 dh

該算法是根據目標 IP 地址通過散列函數將目標 IP 與服務器建立映射關係,出現服務器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該服務器。

  1. 源地址散列調度算法 sh

與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。

九、實踐LVS的NAT模式
在這裏插入圖片描述
實現結果如下:

1.使用NAT模式的羣集技術,LVS負載調度器是所有節點訪問Internet的網關服務器,其200.0.0.1也作爲整個羣集的VIP地址。
2.使用輪詢(rr)的調度算法。
3.web1和web2先搭建web服務,分別準備不同的網頁文件,供客戶端訪問,以此來確定client訪問LVS服務器的200.0.0.1,可以訪問到兩臺wbe服務器。
4.待client測試成功後,web1和web2便可以掛載NFS服務器提供的共享目錄,以此來爲client提供相同的網頁文件。
一、準備:
四臺服務器,一臺lvs、web1、web2、client
lvs有兩塊網卡,外網ip分別爲200.0.0.1,內網ip192.168.1.1
######注意兩臺web服務器的網關要指定內網ip
web1,ip爲192.168.1.10
web2,ip爲192.168.1.20
client,ip爲200.0.10
######注意防火牆,這裏爲了方便所有服務器直接關閉了
二、配置lvs服務器
開啓路由轉發功能:

[root@localhost /]# vim /etc/sysctl.conf 
...................       // 省略部分
net.ipv4.ip_forward = 1
[root@localhost /]# sysctl -p
net.ipv4.ip_forward = 1

配置負載分配策略:

[root@localhost /]# modprobe ip_vs                   # 加載 ip_vs 模塊
[root@localhost /]# cat /proc/net/ip_vs             # 查看版本信息,彈出如下所示,說明該模塊已啓動
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

ipvsadm 是在負載調度器上使用的 LVS 羣集管理工具,通過調用 ip_vs 模塊來添加、刪除服務器節點,以及查看羣集的運行狀態(需要手動安裝)。

[root@localhost /]# yum -y install ipvsadm              # 安裝 ipvsadm
[root@localhost /]# ipvsadm -v                       # 查看版本信息
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
[root@localhost /]# ipvsadm -C                 # 清除原有策略
[root@localhost /]# ipvsadm -A -t 200.0.0.1:80 -s rr           
[root@localhost /]# ipvsadm -a -t 200.0.0.1:80 -r 192.168.1.10:80 -m -w 1
[root@localhost /]# ipvsadm -a -t 200.0.0.1:80 -r 192.168.1.20:80 -m -w 1
[root@localhost /]# ipvsadm-save            # 保存策略
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.1.10:http -m -w 1
-a -t localhost.localdomain:http -r 192.168.1.20:http -m -w 1
[root@localhost /]# systemctl enable ipvsadm.service            # 設置爲開機自啓

配置節點服務器:
web1 配置:

[root@localhost /]# yum -y install httpd              # 安裝 http 服務
[root@localhost /]# echo aaaaaaaaaaa > /var/www/html/index.html            # 準備測試網頁
[root@localhost /]# systemctl start httpd               # 開啓服務
[root@localhost /]# systemctl enable httpd           # 開機自啓

web2 配置:

[root@localhost /]# yum -y install httpd              # 安裝 http 服務
[root@localhost /]# echo bbbbbbbbbbb > /var/www/html/index.html             # 準備測試網頁
[root@localhost /]# systemctl start httpd
[root@localhost /]# systemctl enable httpd

當然,在實際生產環境時,網頁內容都是一樣的,這裏爲了區分驗證從實驗的成功與否,我寫了兩個內容不同的測試文件。
在client測試一下 LVS 是否在工作:
在這裏插入圖片描述
刷新網頁:
在這裏插入圖片描述
十、實踐LVS的DR模式
在這裏插入圖片描述
一、準備:
四臺服務器,一臺lvs、web1、web2、client
lvs有兩塊網卡,ip分別爲200.0.0.1、200.0.0.254
web1,ip爲200.0.0.2 還需配置虛擬IP 200.0.0.254
web2,ip爲200.0.0.3 還需配置虛擬IP 200.0.0.254
client,ip爲200.0.10
######注意防火牆,這裏爲了方便所有服務器直接關閉了
1、配置虛擬IP地址(VIP)

[root@LVS network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0               #在虛接口配置VIP
[root@LVS network-scripts]# vim ifcfg-ens33:0           #改動以下配置項
           .............
IPADDR=200.0.0.254
NETMASK=255.255.255.0           #必須寫子網掩碼信息
NAME=ens33:0              #注意改網卡名稱
DEVICE=ens33:0
ONBOOT=yes
[root@LVS network-scripts]# systemctl restart network            #重啓網卡使更改生效
[root@LVS network-scripts]# ifconfig        #查詢相關IP是否配置正確
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 200.0.0.1  netmask 255.255.255.0  broadcast 200.0.0.255
        inet6 fe80::2e1e:d068:9c41:c688  prefixlen 64  scopeid 0x20<link>
                           ...........................

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 200.0.0.254  netmask 255.255.255.0  broadcast 200.0.0.255
        ether 00:0c:29:77:2c:03  txqueuelen 1000  (Ethernet)

2、調整/proc相應參數:

[root@LVS ~]# vim /etc/sysctl.conf             #寫入下面三行
                 ................
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@LVS ~]# sysctl -p              #刷新一下配置
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

3、配置負載分配策略:

[root@LVS ~]# modprobe ip_vs         #加載ip_vs模塊
[root@LVS ~]# yum -y install ipvsadm           #安裝ipvsadm工具
[root@LVS ~]# ipvsadm -C              #清除原有策略
[root@LVS ~]# ipvsadm -A -t 200.0.0.254:80 -s rr        #配置羣集VIP及添加相關節點
[root@LVS ~]# ipvsadm -a -t 200.0.0.254:80 -r 200.0.0.2:80 -g -w 1
[root@LVS ~]# ipvsadm -a -t 200.0.0.254:80 -r 200.0.0.3:80 -g -w 1
[root@LVS ~]# ipvsadm-save                        #保存策略
[root@LVS ~]# ipvsadm-save > /etc/sysconfig/ipvsadm           #導出策略備份
[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  200.0.0.254:80 rr
  -> 200.0.0.2:80                 Route   1      0          0         
  -> 200.0.0.3:80                 Route   1      0          0         

二、配置web節點服務器:

web節點服務器的VIP地址僅用來發送web響應數據包的源地址,並不需要監聽客戶機的訪問請求(由調度器監聽並分發)。因此使用虛接口lo:0來承載VIP地址,並添加一條路由記錄,將訪問VIP的數據包限制在本地。
1、配置虛擬IP地址(VIP):

[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0      #編輯該文件,只保留以下四行,並配置VIP
DEVICE=lo:0
IPADDR=200.0.0.254
NETMASK=255.255.255.255               #注意:子網掩碼必須是全爲1。也就是4個255。
ONBOOT=yes
[root@LVS network-scripts]# systemctl restart network            #重啓網卡使更改生效
[root@LVS network-scripts]# ifconfig        #查詢VIP是否配置正確 
                ............................
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 200.0.0.254  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)
[root@web1 ~]# route add -host 200.0.0.254 dev lo:0              #添加VIP本地訪問路由記錄
[root@web1 ~]# vim /etc/rc.local               #設置開機自動添加這條路由記錄              
                ................................
/sbin/route add -host 200.0.0.254 dev lo:0

2、調整/proc響應參數:

[root@web1 ~]# vim /etc/sysctl.conf                  #調整/proc響應參數,寫入下面六行
                    ...................
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# sysctl -p                #刷新一下
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

3、安裝並啓動httpd服務(可根據需求選擇搭建Nginx還是apache):

[root@web1 ~]# yum -y install httpd             #安裝http服務
[root@web1 ~]# echo 1111111111111 > /var/www/html/index.html          
#準備測試網頁,等看到負載均衡的效果後,再掛載共享存儲設備。
[root@web1 ~]# systemctl start httpd               #啓動http服務
[root@web1 ~]# systemctl enable httpd           #設置爲開機自啓動

重複以上三個步驟,配置其他web節點服務器(我這裏將另一個web節點的首頁文件改爲了:2222222222)。
三、client訪問VIP,以便測試LVS羣集:
在這裏插入圖片描述
在這裏插入圖片描述

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