集羣及高可用之LVS負載均衡(三種工作模式介紹)

linux自動化運維也好,雲計算自動化運維也罷,基礎技術都必須掌握嚴實,今天我們一起來完整的介紹一下真正的集羣以及高可用技術中的LVS負載均衡技術。博客的引入內容是參考博客園的一位博主的文字內容,又加以詳細補充完善,加上自己實踐的兩種LVS的工作模式。
參考的博客園:https://www.cnblogs.com/xiaocheche/p/7695024.html

1.1 什麼是集羣?

隨着互聯網的發展,大量的客戶端請求蜂擁而至,同時服務器的負載也越來越大,然而單臺服務器的負載又是有限的,這樣就會導致服務器響應客戶嘴請求的時間越長,模至產生拒絕服務的情況。

另外,目前的網站多 數是7x24小時提供不同斷網絡服務,如果僅採用單點服務器對外提供網絡服務,那麼在出現單點故障時,將導致整個網絡服務中斷。這時我們需要部署集羣架構,最終將成百上千臺主機有機地結合在一起, 以滿足當前大數據時代的海量訪問負載。

在部署集羣環境時可以選擇的產品有很多,有些是基於硬件實現的,有些是基於軟件實現的。其中負載均衡的硬件設備有F5的BIG-IP、Radware 的Apirector,以及梭子魚的負載均衡設備等,軟件有基於Linux的LVS、Nginx和HAProxY等產品。在集羣環境中的核心是負載均衡和高可用,最近幾次博客更新內容圍繞這兩點核心功能進行軟件實現。

1.2 LVS負載均衡簡介:(本博客中的結構圖和拓撲圖,我採用的是PPT繪製)

LVS(Linux Virtual Server)即Linux虛擬服務器,是由章文嵩博士主導開發的開源負載均衡項目。目前LVS已經被集成到Linux內核模塊中,(其體系結構圖如下所示:)

該項目在Linux內核中實現了 基於IP的數據請求 負載均衡調度方案,終端互聯網用戶從外部訪問公司的外部負載均衡服務器,終端用戶的WEB請求會發送給LVS調度器,調度器根據自己預設的算法決定將請求發送給後端的某臺WEB服務器。

比如輪詢算法 可以將外部的請求平均分發給後端的所有服務器,終端用戶訪問LVS調度器雖然會被轉發到後端真實的服務器,但如果真實服務器連接的是相同的存儲,提供的服務也都是相同的服務,最終用戶不管訪問哪臺真實的服務器,得到的服務內容都是一樣的,整個集羣對用戶而言都是透明的。

最後根據LVS工作模式的不同,真實服務器會選擇不同的方式將用戶所需要的數據發送給終端用戶,LVS工作模式分爲NAT模式,TUN模式以及DR模式;

在這裏插入圖片描述

1.3 基於NAT的LVS負載均衡:

NAT(Network Address Translation)即網絡地址轉換,其作用是通過數據報頭的修改,使位於企業內部的私有IP可以訪問外網,以及外部用戶可以訪問位於公司內部的私有IP地址主機,VS/NAT 的拓撲圖如下圖所示:
LVS負載調度器使用兩塊網卡配置不同的IP地址,eth1設置爲私鑰IP與內部網絡通過交換設備相互連接,eth0設置爲外網IP與外部網絡連通;

第一步:
用戶通過互聯網DNS服務器解析到公司負載均衡設備上面的外網IP地址,
相對於真實服務器而言,LVS的外網IP又稱爲VIP(Virtual IP Address),
用戶通過訪問VIP,即可連接後端的真實服務器,而這一切對用戶而言都是透明的,
用戶以爲自己訪問的就是真實的服務器,
但他並不知道自己訪問的VIP僅僅是一個調度器,
也不清楚後端的真實服務器到底在哪裏,有多少臺真實服務器;

第二步:用戶將數據請求發送至外網IP地址,此時LVS將根據預設的算法選擇後端的一臺真實服務器,將數據請求包發送給真實服務器,並且在轉發之前LVS會 修改數據包中的目標地址以及目標端口,目標地址與目標端口將被修改爲選中的真實服務器IP地址以及相應的端口;

第三步:真實的服務器將響應數據包返回給LVS調度器,調度器在得到響應數據包後會將源地址與源端口修改爲VIP及調度器相應的端口,修改完成後,由調度器將響應數據包發送給終端用戶,另外由於LVS調度器有一個連接Hash表,該表中會記錄連接請求及轉發信息,當同一個連接的下一個數據包發送給調度器時,從該Hash表中可以直接找到之前的連接記錄,並根據該記錄信息選出相同的真實服務器及端口信息;

在這裏插入圖片描述

1.4 基於TUN的LVS負載均衡

在LVS(NAT)模式的集羣環境中,由於所有的數據請求及響應的數據包都需要經過LVS調度器轉發,如果後端服務器的數量大於10臺,則調度器就會成爲整個 集羣環境的瓶頸,

我們知道數據請求包往往遠遠小於響應數據包的大小

因爲響應數據包中包含有客戶端需要的具體數據,所以LVS(TUN)的思路就是將請求與響應數據分離,讓調度器僅處理數據請求,而讓真實服務器將響應數據包直接返回給客戶端,

VS/TUN工作模式中的IP隧道(IP tunning)是一種數據包封裝技術,它 可以將原始數據包封裝並添加新的包頭(內容包括新的源地址及端口,目標地址及端口),
從而實現將一個目標爲調度器VIP的數據包封裝,通過隧道轉發給後端的 真實服務器,通過將客戶端發送調度器的原始數據包封裝,並在其基礎上添加新的數據包頭(修改目標地址爲調度器選擇出來的真實服務器的IP地址及對應端口)

LVS(TUN)模式要求真實服務器可以直接與外部網絡連接,真實服務器在收到請求數據包後直接給客戶端主機響應數據;
其拓撲圖如下:

在這裏插入圖片描述

1.5 基於DR的LVS負載均衡

在LVS(TUN)模式下,由於需要在LVS調度器與真實服務器之間創建隧道連接,這同樣會增加服務器的負擔,與LVS(TUN)類似,DR模式也叫直接路由模式,該模 式中LVS依然僅承擔數據的入站請求以及根據算法選出合理的真實服務器,最終由後端真實服務器負責將響應數據包發送返回給客戶端,

與隧道模式不同的是,直接路由模式要求調度器與後端服務器必須在一個局域網內,VIP地址需要在調度器與後端所有的服務器間共享,因爲最終的真實服務器給客戶端迴應數據包時需要設置源地 址爲VIP地址,目標IP爲客戶端IP,這樣客戶端訪問的是調度器的VIP地址,迴應的源地址也依然是該VIP地址(真實服務器上的VIP),

客戶端是感覺不到後端服務器存在的,由於多臺計算機都設置了同樣一個VIP地址,所以在直接路由模式中要求調度器的VIP地址是對外可見的,客戶端需要將請求數據包發送到調度器主機,而所 有的真實服務器的VIP地址必須配置在Non-ARP的網絡設備上,也就是該網絡設備並不會向外廣播自己的MAC及對應的IP地址,

真實服務器的VIP對外界是不可見的, 但真實服務器卻可以接收目標地址爲VIP的網絡請求,並在迴應數據包時將源地址設置爲該VIP地址,調度器根據算法在選出真實服務器後,在不修改數據報文的情況下,將數據幀的MAC地址修改爲選出的服務器的MAC地址,通過交換機將該數據幀轉發給真實服務器,整個過程中,真實服務器的VIP不需要對外界可見。
其拓撲圖如圖所示:

在這裏插入圖片描述

1.6 LVS複製均衡調度算法:

根據前面的介紹,我們瞭解了LVS的三種模式,但不管實際環境中採用的是哪種模式,調度器進行調度的策略與算法都是LVS的核心技術,LVS在內核中主要實現了以下 八種調度算法:
       輪詢調度;
       加權輪詢調度;
       最小連接調度;
       加權最小連接調度;
       基於局部性最少的連接;
       帶複製的基於局部性最少連接;
       目標地址散列調度;
       源地址散列調度;

輪詢算法(RR):

按依次循環的方式將請求調度到不同的服務器上,該算法最大的特定就是實現簡單,
輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器;  

加權輪詢算法(WRR):

主要是對輪詢算法的一種優化與補充,LVS會考慮每臺服務器的性能,並給每臺服務器添加一個權值,
如果服務器A的權值爲1,服務器B的權值爲2,則調度器調度到服務器B的請求回事服務器A的兩倍,
權值越高的服務器,處理的請求越多; 

最小連接調度算法(LC):

把請求調度到連接數最小的服務器上,而加權最小連接算法(WLC)則是給每個服務器一個權值,
調度器會盡可能保持服務器連接數量與權值之間的平衡;  

基於局部性的最少連接調度算法(lblc):

是請求數據包的目標IP地址的一種調度算法,該算法先根據請求的目標IP地址尋找最近目標IP地址所使用的服務器,
如果這臺服務器依然可用,並且有能力處理該請求,調度器會盡量選擇相同的服務器,
否則會繼續選擇其他可行的服務器;
帶複製的基於局 部性最少連接算法記錄的不是一個目標IP與一臺服務器之間連接記錄,
它會維護一個目標IP到一組服務器之間的映射關係,防止單點服務器負載過高; 

目標地址散列調度算法(DH):

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

源地址散列調度算法(SH):

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

LVS現在已經集成在Linux內核模塊中,但整個LVS環境中又分爲內核層與用戶層,
內核層複製核心算法的實現,用戶層需要安裝ipvsadm工具,通過命令將管理員需要 的工作模式與實現算法傳遞給內核來實現

LVS的內核模塊名稱爲Ip_vs,我們可以使用YUM方式安裝ipvsadm,也可以自行去官網下載使用源碼安裝;

1.7.1 YUM安裝:

YUM安裝需要確保本機可以連接YUM源,可以從YUM源中下載RPM格式軟件包;

[root@lvs ~]# yum install -y ipvsadm
1.7.2 源碼安裝:

源碼安裝需要使用YUM安裝相關的依賴軟件包,Ipvsadm源碼軟件可以從官方網站下載,下載後使用標準的make,make install,編譯,安裝即可;

[root@lvs ~]#yum  -y  install  gcc popt   popt-devel  popt-static  libn1  libn1-devel
[root@lvs ~]#wget  http://www.linuxvirtualserver.org/softwart/kernel-2.6/ipvsadm-1.26.tar.gz
[root@lvs ~]#tar  -xvf  ipvsadm-1.26.tar.gz  -C   /usr/src
[root@lvs ~]#cd  /usr/src/ipvsadm-1.26
[root@lvs ~]#make
[root@lvs ~]#make  install

1.7.3 命令介紹

相關命令:

無論使用哪種方式安裝ipvsadm軟件,安裝完成後都會生成一個同名的命令工具,我們需要使用該命令來管理配置LVS虛擬服務器組和相應的調度算法;

ipvsadm命令的描述和用法如下:
 描述:Linux虛擬服務器管理工具;
 用法:ipvsadm    選項    服務器地址    -s     算法
    ipvsadm    選項    服務器地址    -r     真實服務器地址【工作模式】【權重】……
 選項:
      -A    添加一個虛擬服務,使用IP地址,端口號,協議來唯一定義一個虛擬服務;
      -E    編輯一個虛擬服務;
      -D    刪除一個虛擬服務
      -C    清空虛擬服務表
      -R    從標準輸入中還原虛擬服務規則
      -S     保存虛擬服務規則至標準輸出,輸出的規則可以使用-R導入還原
      -a    在虛擬服務中添加一臺真實服務器
      -e    在虛擬服務中編輯一臺真實服務器
      -d     在虛擬服務中減少一臺真實服務器
       -L    顯示虛擬服務列表
       -t    使用TCP服務,該參數後需要跟主機與端口信息
      -u     使用UDP服務,該參數後需要跟主機與端口信息
      -s    指定LVS所採用的調度算法
       -r    設置真實服務器IP地址與端口信息
      -g    設置LVS工作模式爲DR直連路由模式
      -i     設置LVS工作模式爲TUN隧道模式
       -m     設置LVS工作模式爲NAT地址轉換模式
       -w     設置指定服務器的權重
      -c     連接狀態,需要配合-L使用
      -n     數字格式輸出

命令示例:

添加一個虛擬服務,設置調度算法爲輪詢,所有使用的TCP協議訪問10.0.3.168的80端口的請求,最終被調度器通過NAT模式轉發給了 192.168.10.3,192.168.10.4,192.168.10.5這三臺主機的80端口

[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.3:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.4:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.5:80 -m

查看LVS規則表:

[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  10.0.3.168:80 rr
  -> 192.168.10.3:80              Masq    1      0          0         
  -> 192.168.10.4:80              Masq    1      0          0         
  -> 192.168.10.5:80              Masq    1      0          0         
[root@lvs ~]# 

查看當前IPVS調度狀態:

[root@lvs ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
[root@lvs ~]# 

刪除爲虛擬服務提供WEB功能的真實服務器192.168.10.3

[root@lvs ~]# ipvsadm -d -t 10.0.3.168:80 -r 192.168.10.3

虛擬服務規則表備份與還原:

[root@lvs ~]# ipvsadm -Sn >/tmp/ip_vs.bak   #備份至文件
[root@lvs ~]# ipvsadm -C					#清空規則列表
[root@lvs ~]# ipvsadm -R < /tmp/ip_vs.bak  #從文件還原

修改虛擬服務的調度算法爲加權輪詢:

[root@lvs ~]# ipvsadm -E -t 10.0.3.168:80 -s wrr

創建一個使用WRR算法的虛擬服務,工作模式爲直接路由(DR)模式,在該虛擬服務上添加兩臺真實服務器,併爲每臺真實服務器設置權重:

[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -s wrr
[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -r 192.168.10.3:80 -g -w 1
[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -r 192.168.10.4:80 -g -w 2

下面將介紹LVS負載均衡應用案例:

基於NAT工作模式的負載均衡:
其工作模式的負載均衡架構圖可參考上圖:,服務器IP地址設置見表:所有訪問lvs.example.com的這臺主機的VIP地址的80端口的請求數據包都將被均衡的調度到三臺真實的服務器上。
表:(由於本地做實驗,外網就採用10.0.3.168,內網採用192.168.10.254)

服務器名稱 網絡接口 IP地址
lvs.example.com enp0s3 (內網)、enp0s8(外網) 10.0.3.168(外)、192.168.10.254(內)
web1.example.com enp0s3 192.168.10.3
web2.example.com enp0s3 192.168.10.4
web3.example.com enp0s3 192.168.10.5

LVS負載均衡調度器設置
首先,需要爲整個拓撲環境設置網絡參數,案例中使用靜態IP地址的方式配置網絡,由於lvs調度器使用了兩塊網卡,這裏需要對兩塊網卡進行配置:

[root@lvs ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s8
ONBOOT=yes
IPADDR=10.0.3.168
NETMASK=255.255.255.0
GATEWAY=10.0.3.1
DNS1=202.106.0.20

第二塊

[root@lvs ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=951bd2b2-f6b4-4a8b-9644-a57831d648fc
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.254
NETMASK=255.255.255.0
DNS1=202.106.0.20
[root@lvs ~]# systemctl restart network 
[root@lvs ~]# yum install -y ipvsadm

使用ipvsadm命令工具參加一個虛擬服務,併爲該虛擬服務設置一組具體的後端服務器主機和虛擬服務調度算法:

[root@lvs ~]# ipvsadm -A -t 10.0.3.168:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.3:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.4:80 -m
[root@lvs ~]# ipvsadm -a -t 10.0.3.168:80 -r 192.168.10.5:80 -m
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
[root@lvs ~]# sysctl -p
[root@lvs ~]# firewall-cmd --permanent --add-port=80/tcp
[root@lvs ~]# firewall-cmd --reload
[root@lvs ~]# systemctl start ipvsadm


下面開始修改後端真實的web服務器,(這裏爲了驗證調度,我把每個web的內容設置了不同,生產環境下,每個web的內容都應該提供相同的頁面)

[root@web1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.3
NETMASK=255.255.255.0
GATEWAY=192.168.10.254

[root@web1 ~]# yum install -y httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl restart network
[root@web1 ~]# echo "192.168.10.3" > /var/www/html/index.html
[root@web1 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web1 ~]# firewall-cmd --reload



下面web2和web3服務器的配置具體步驟和web1是一樣的。IP地址根據自己的需要修改

[root@web2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.4
NETMASK=255.255.255.0
GATEWAY=192.168.10.254

[root@web2 ~]# yum install -y httpd
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl restart network
[root@web2 ~]# echo "192.168.10.4" > /var/www/html/index.html
[root@web2 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web2 ~]# firewall-cmd --reload

Web3的操作:

[root@web3 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=255aeb57-20ca-47d0-b33c-258fd8caacd1
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.10.5
NETMASK=255.255.255.0
GATEWAY=192.168.10.254

[root@web3 ~]# yum install -y httpd
[root@web3 ~]# systemctl start httpd
[root@web3 ~]# systemctl restart network
[root@web3 ~]# echo "192.168.10.5" > /var/www/html/index.html
[root@web3 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web3 ~]# firewall-cmd --reload

驗證:
客戶端使用瀏覽器訪問http://10.0.3.168 ,最終可以訪問到真實的服務器鎖提供的頁面內容,由於LVS採用RR(輪詢)算法,所以不同的連接請求江北平均分配到不同的後端真實服務器上。由於本次是做實驗,所以不同的瀏覽器訪問的頁面結果會不同

在這裏插入圖片描述
在這裏插入圖片描述
下面將更新基於DR工作模式的負載均衡。

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