天天看點

使用LVS實作負載均衡原理及安裝配置詳解

    負載均衡叢集是 load balance 叢集的簡寫,翻譯成中文就是負載均衡叢集。常用的負載均衡開源軟體有nginx、lvs、haproxy,商業的硬體負載均衡裝置F5、Netscale。這裡主要是學習 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的基本工作原理

使用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方式的實作原理和資料包的改變。

使用LVS實作負載均衡原理及安裝配置詳解

(a). 當使用者請求到達Director Server,此時請求的資料封包會先到核心空間的PREROUTING鍊。 此時封包的源IP為CIP,目标IP為VIP 

(b). PREROUTING檢查發現資料包的目标IP是本機,将資料包送至INPUT鍊

(c). IPVS比對資料包請求的服務是否為叢集服務,若是,修改資料包的目标IP位址為後端伺服器IP,然後将資料包發至POSTROUTING鍊。 此時封包的源IP為CIP,目标IP為RIP 

(d). POSTROUTING鍊通過選路,将資料包發送給Real Server

(e). Real Server比對發現目标為自己的IP,開始建構響應封包發回給Director Server。 此時封包的源IP為RIP,目标IP為CIP 

(f). 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位址

使用LVS實作負載均衡原理及安裝配置詳解

(a) 當使用者請求到達Director Server,此時請求的資料封包會先到核心空間的PREROUTING鍊。 此時封包的源IP為CIP,目标IP為VIP

(b) PREROUTING檢查發現資料包的目标IP是本機,将資料包送至INPUT鍊

(c) IPVS比對資料包請求的服務是否為叢集服務,若是,将請求封包中的源MAC位址修改為DIP的MAC位址,将目标MAC位址修改RIP的MAC位址,然後将資料包發至POSTROUTING鍊。 此時的源IP和目的IP均未修改,僅修改了源MAC位址為DIP的MAC位址,目标MAC位址為RIP的MAC位址 

(d) 由于DS和RS在同一個網絡中,是以是通過二層來傳輸。POSTROUTING鍊檢查目标MAC位址為RIP的MAC位址,那麼此時資料包将會發至Real Server。

(e) RS發現請求封包的MAC位址是自己的MAC位址,就接收此封包。處理完成之後,将響應封包通過lo接口傳送給eth0網卡然後向外發出。 此時的源IP位址為VIP,目标IP為CIP 

(f) 響應封包最終送達至用戶端

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必須在同一機房中

3. 特點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)

使用LVS實作負載均衡原理及安裝配置詳解

(a) 當使用者請求到達Director Server,此時請求的資料封包會先到核心空間的PREROUTING鍊。 此時封包的源IP為CIP,目标IP為VIP 。

(c) IPVS比對資料包請求的服務是否為叢集服務,若是,在請求封包的首部再次封裝一層IP封包,封裝源IP為為DIP,目标IP為RIP。然後發至POSTROUTING鍊。 此時源IP為DIP,目标IP為RIP 

(d) POSTROUTING鍊根據最新封裝的IP封包,将資料包發至RS(因為在外層封裝多了一層IP首部,是以可以了解為此時通過隧道傳輸)。 此時源IP為DIP,目标IP為RIP

(e) RS接收到封包後發現是自己的IP位址,就将封包接收下來,拆除掉最外層的IP後,會發現裡面還有一層IP首部,而且目标是自己的lo接口VIP,那麼此時RS開始處理此請求,處理完成之後,通過lo接口送給eth0網卡,然後向外傳遞。 此時的源IP位址為VIP,目标IP為CIP

LVS-Tun模型特性

  • RIP、VIP、DIP全是公網位址
  • RS的網關不會也不可能指向DIP
  • 不支援端口映射
  • RS的系統必須支援隧道

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

八、LVS的八種排程算法

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

與目标位址散列排程算法類似,但它是根據源位址雜湊演算法進行靜态配置設定固定的伺服器資源。

九、實踐LVS的NAT模式

1、實驗環境

三台伺服器,一台作為 director,兩台作為 real server,director 有一個外網網卡(172.16.254.200) 和一個内網ip(192.168.0.8),兩個 real server 上隻有内網 ip (192.168.0.18) 和 (192.168.0.28),并且需要把兩個 real server 的内網網關設定為 director 的内網 ip(192.168.0.8)

2、安裝和配置

兩個 real server 上都安裝 nginx 服務
# yum install -y nginx

Director 上安裝 ipvsadm
# yum install -y ipvsadm      

Director 上編輯 nat 實作腳本

使用LVS實作負載均衡原理及安裝配置詳解
# vim /usr/local/sbin/lvs_nat.sh
# 編輯寫入如下内容:
#! /bin/bash
# director伺服器上開啟路由轉發功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 關閉 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
# director設定 nat 防火牆
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
# director設定 ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 172.16.254.200:80 -s wrr
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1      
使用LVS實作負載均衡原理及安裝配置詳解

儲存後,在 Director 上直接運作這個腳本就可以完成 lvs/nat 的配置

/bin/bash /usr/local/sbin/lvs_nat.sh      

檢視ipvsadm設定的規則

ipvsadm -ln      

3、測試LVS的效果

通過浏覽器測試2台機器上的web内容 http://172.16.254.200 。為了區分開,我們可以把 nginx 的預設頁修改一下:

在 RS1 上執行
# echo "rs1rs1" >/usr/share/nginx/html/index.html

在 RS2 上執行
# echo "rs2rs2" >/usr/share/nginx/html/index.html      

注意,切記一定要在兩台 RS 上設定網關的 IP 為 director 的内網 IP。

十、實踐LVS的DR模式

三台機器:

  • Director節點:  (eth0 192.168.0.8  vip eth0:0 192.168.0.38)
  • Real server1: (eth0 192.168.0.18 vip lo:0 192.168.0.38)
  • Real server2: (eth0 192.168.0.28 vip lo:0 192.168.0.38)

2、安裝

兩個 real server 上都安裝 nginx 服務
# yum install -y nginx

Director 上安裝 ipvsadm
# yum install -y ipvsadm      

3、Director 上配置腳本

使用LVS實作負載均衡原理及安裝配置詳解
# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.0.38
rs1=192.168.0.18
rs2=192.168.0.28
ifconfig eth0:0 down
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s wrr 
$ipv -a -t $vip:80 -r $rs1:80 -g -w 3
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1      
使用LVS實作負載均衡原理及安裝配置詳解

執行腳本:

# bash /usr/local/sbin/lvs_dr.sh      

4、在2台 rs 上配置腳本:

使用LVS實作負載均衡原理及安裝配置詳解
# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.0.38
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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      
使用LVS實作負載均衡原理及安裝配置詳解

rs 上分别執行腳本:

bash /usr/local/sbin/lvs_dr_rs.sh      

5、實驗測試

測試方式同上,浏覽器通路 http://192.168.0.38

注意:在 DR 模式下,2台 rs 節點的 gateway 不需要設定成 dir 節點的 IP 。

參考連結位址:http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

十一、LVS結合keepalive

LVS可以實作負載均衡,但是不能夠進行健康檢查,比如一個rs出現故障,LVS 仍然會把請求轉發給故障的rs伺服器,這樣就會導緻請求的無效性。keepalive 軟體可以進行健康檢查,而且能同時實作 LVS 的高可用性,解決 LVS 單點故障的問題,其實 keepalive 就是為 LVS 而生的。

4台節點

  • Keepalived1 + lvs1(Director1):192.168.0.48
  • Keepalived2 + lvs2(Director2):192.168.0.58
  • Real server1:192.168.0.18
  • Real server2:192.168.0.28
  • IP: 192.168.0.38

2、安裝系統軟體

Lvs + keepalived的2個節點安裝

# yum install ipvsadm keepalived -y      

Real server + nginx服務的2個節點安裝

# yum install epel-release -y
# yum install nginx -y      

3、設定配置腳本

Real server節點2台配置腳本:

使用LVS實作負載均衡原理及安裝配置詳解
# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.0.38
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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

2節點rs 上分别執行腳本:
bash /usr/local/sbin/lvs_dr_rs.sh      
使用LVS實作負載均衡原理及安裝配置詳解

keepalived節點配置(2節點):

使用LVS實作負載均衡原理及安裝配置詳解
主節點( MASTER )配置檔案
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.38
    }
}

virtual_server 192.168.0.38 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.0.18 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.0.28 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}      
使用LVS實作負載均衡原理及安裝配置詳解

從節點( BACKUP )配置檔案

拷貝主節點的配置檔案keepalived.conf,然後修改如下内容:

state MASTER -> state BACKUP
priority 100 -> priority 90      

keepalived的2個節點執行如下指令,開啟轉發功能:

# echo 1 > /proc/sys/net/ipv4/ip_forward      

4、啟動keepalive

先主後從分别啟動keepalive
service keepalived start      

5、驗證結果

實驗1

手動關閉192.168.0.18節點的nginx,service nginx stop 在用戶端上去測試通路 http://192.168.0.38 結果正常,不會出現通路18節點,一直通路的是28節點的内容。

實驗2

手動重新開啟 192.168.0.18 節點的nginx, service nginx start 在用戶端上去測試通路 http://192.168.0.38 結果正常,按照 rr 排程算法通路18節點和28節點。

實驗3

測試 keepalived 的HA特性,首先在master上執行指令 ip addr ,可以看到38的vip在master節點上的;這時如果在master上執行 service keepalived stop 指令,這時vip已經不再master上,在slave節點上執行 ip addr 指令可以看到 vip 已經正确漂到slave節點,這時用戶端去通路 http://192.168.0.38 通路依然正常,驗證了 keepalived的HA特性。

lvs 介紹:http://www.it165.net/admin/html/201401/2248.html

作者:liwei0526vip 出處:http://www.cnblogs.com/liwei0526vip 歡迎轉載,也請保留這段聲明。謝謝!

繼續閱讀