負載均衡LVS原理及其應用

一、LB常用解決方案

    1. 硬件負載均衡解決方案: 

        F5公司: BIG-IP

        Citrix公司: Netscaler

        A10公司: A10

        Array 

        Redware

    2. Linux: LVS

        1. 完成Linux Virtual Server作者 (章文嵩,花名段正明)

        2. ipvs工作于netfilter框架上

        3. ipvs: 框架,工作在內核中,工作在input鏈上,需要依賴于規則完成轉發。 如果發現發往本機INPUT鏈的請求,如果能匹配到集群規則,直接轉發至post-routing鏈發出主機。 

        4. 規則: 簡單來說就是把ip加端口定義為ipvs集群服務,ipvs會為此請求定義一個或多個后端服務

                        目標地址未必會改,但是報文會被強行轉發給后端的服務器。 

        5. ipvs組件: ipvsadm(用戶空間,用來編寫規則) + ipvs(內核空間) 

        6. ipvs工作在第四層: 

            1) 成為四層交換、四層路由。 做第四層轉發。

            2) 只能基于ip和port轉發,無法在應用層,session級別轉發

            3) 不用到達應用層空間,就能轉發

        7. lvs 性能很好,但是由于只第四層,不能到用戶空間,因此不能進行更加精細的控制。 在精細控制方面,haproxy和Ngnix可以更好的實現。 

        8. lvs通常作為總入口,更精細化的切割可能使用,haproxy或者Nginx實現 

        9. 報文的信息流: CIP<–>VIP–DIP<–>RIP

            1) CIP: Client ip 

            2) VIP: virtual ip 

            3) DIP: Director IP 

            4) RIP: Real server Ip 

        客戶端請求,被VIP端口接收后,從DIP接口被轉發出去,并轉發至RIP

二、LVS類型: 

    1. NAT(dNAT): 

        訪問過程如下

            1) CIP訪問VIP 

            2) VIP接收報文后,做dNAT,指向某一個RIP 

            3) RIP拿到接收到報文后進行回應

            4) 此時需要,RIP網關指向DIP,也就是Director server. 否則若在互聯網上,即便報文是可以回應給CIP客戶端,但是由于CIP并沒有請求RIP服務器,因此報文會被丟棄。 

        NAT特性

            1) RS應該使用私有地址

            2) RS的網關必須指向DIP 

            3) RIP 和 DIP 必須在一同意網段內

            4) 進出的報文,無論請求還是響應,都必須經過Director Server, 請求報文由DS完成目標地址轉換,響應報文由DS完成源地址轉換 

        5) 在高負載應用場景中,DS很可能成為系統性能瓶頸。 

        6) 支持端口映射。

        7) 內部RS可以使用任意支持集群服務的任意操作系統。

         lvs_NAT.png

    2. DR 

        1)讓前端路由將請求發往VIP時,只能是Dirctor上的VIP

                禁止RS響應對VIP的ARP廣播請求:

            (1) 在前端路由上實現靜態MAC地址VIP的綁定;

                前提:得有路由器的配置權限;

                缺點:Directory故障轉時,無法更新此綁定;

            (2) arptables

                前提:在各RS在安裝arptables程序,并編寫arptables規則

                缺點:依賴于獨特功能的應用程序

            (3) 修改Linux內核參數

                前提:RS必須是Linux;

                缺點:適用性差; 

                    Linux的工作特性:IP地址是屬于主機,而非某特定網卡;也就是說,主機上所有的網卡都會向外通告

                        需要先配置參數,然后配置IP,因為只要IP地址配置完成則開始想外通告mac地址

                        為了使響應報文由配置有VIP的lo包裝,使源地址為VIP,需要配置路由經過lo網卡的別名,最終由eth0發出

                        兩個參數的取值含義:

                    arp_announce:定義通告模式

                        0: default, 只要主機接入網絡,則自動通告所有為網卡mac地址

                        1: 盡力不通告非直接連入網絡的網卡mac地址

                        2: 只通告直接進入網絡的網卡mac地址

                    arp_ignore:定義收到arp請求的時響應模式

                        0: 只有arp 廣播請求,馬上響應,并且響應所有本機網卡的mac地址

                        1: 只響應,接受arp廣播請求的網卡接口mac地址

                        2: 只響應,接受arp廣播請求的網卡接口mac地址,并且需要請求廣播與接口地址屬于同一網段

                        3: 主機范圍(Scope host)內生效的接口,不予響應,只響應全局生效與外網能通信的網卡接口

                        4-7: 保留位

                        8: 不響應一切arp廣播請求

                配置方法: 

                    全部網卡

                        arp_ignore 1

                        arp_announce 2 

                    同時再分別配置每個網卡,eth0和lo

                        arp_ignore 1

                        arp_annource 2 

         2) 特性

            (1)RS是可以使用公網地址,此時可以直接通過互聯網連入,配置,監控RS服務器

            (2)RS的網不能指向DIP

            (3)RS跟DS要在同一物理網絡內,最好在一同一網段內

            (4)請求報文經過Director但是相應報文不經過Director

            (5)不支持端口映射

            (6)RS可以使用,大多數的操作系統,至少要可以隱藏VIP

        LVS DR1.png

LVS DR2.png

    3. LVS TUN: IP隧道,IP報文中套IP報文 

        1)RIP,DIP,VIP都必須是公網地址

        2)RS網關不會指向DIP

        3)請求報文經過Director,但相應報文一定不經過Director

        4)不支持端口映射

        5)RS的OS必須得支持隧道功能

            LVS TUN.png

    4. FULLNAT: 必須內核打補丁才能使用,使得各RS主機可以跨vlan. 源IP和目標IP都修改。 

        LVS FULLNAT.png

二、LVS調度算法: 

    1. 靜態方法:僅根據算法本身進行調度

        rr: Round Robin

        wrr: Weighted RR

        sh: source hashing,源地址進行hash,然后分配到特定的服務器

        dh: destination hashing

            用于多前端防火墻的場景中,使得訪問從一個防火墻進同時還從這個防火墻出來。 

    2. 動態方法:根據算法及RS當前的負載狀況

        lc: Least Connection

            Overhead=Active*256+Inactive

            結果中,最小者勝出;

        wlc: Weighted LC

            Overhead=(Active*256+Inactive)/weight

        sed: Shortest Expect Delay

            Overhead=(Active+1)*256/weight

        nq: Nerver Queue,在Sed基礎上,開局時候先輪尋一圈。 

        lblc: Locality-based Least Connection (基于本地的最小連接) dh+lc

        lblcr: Replicated and Locality-based Least Connection 后端服務器是緩存服務器時, 可以綁定連接到某一緩存服務器中。

    3. LVS缺陷: 

    不能檢測后端服務器的健康狀況,總是發送連接到后端。 

    Session持久機制:

        1、session綁定:始終將同一個請求者的連接定向至同一個RS(第一次請求時仍由調度方法選擇);沒有容錯能力,有損均衡效果;

        2、session復制:在RS之間同步session,因此,每個RS持集群中所有的session;對于大規模集群環境不適用;

        3、session服務器:利用單獨部署的服務器來統一管理session; 

三、ipvsadm使用方法

    1.相關命令

    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]    
    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 [-g|i|m] [-w weight] [-x upper] [-y lower]
    ipvsadm -d -t|u|f service-address -r server-address
    ipvsadm -L|l [options]
    ipvsadm -Z [-t|u|f service-address]

    2. 集群服務相關

    -A: 添加一個集群服務
	-t: tcp
	-u: udp
	-f: firewall mark,
	    通常用于將兩個或以上的服務綁定為一個服務進行處理時使用
	    例如httpd和https
	    iptables mongo表一起使用
	    
            service-address:
		-t IP:port
		-u ip:port
		-f firewall_mark

	-s 調度方法,默認為wlc
	-p timeout: persistent connection, 持久連接
	-E 修改定義過的集群服務
	-D -t|u|f service-address:刪除指定的集群服務

    3. RS相關

    -a:向指定的Cluster services中添加RS
        -t|-u|-f service-address:指明將RS添加至哪個Cluster Service中
        -r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS類型才允許此處使用跟集群服務中不同的端口
    LVS類型:
        -g: Gateway模式,就是DR模型(默認)
        -i: ipip模式,TUN模型
        -m: masquerade地址偽裝自動完成后半段的原地址轉換,NAT
    指定RS權重:
        -w # 省略權重為1
        -e: 修改指定的RS屬性
        -d -t|u|f service-address -r server-address:從指定的集群服務中刪除某RS

    4. 清空所有的集群服務:

    -C

    5. 保存規則:(使用輸出重定向)

    ipvsadm-save 
    ipvsadm -S

    6. 載入指定的規則:(使用輸入重定向)

    ipvsadm-restore
    ipvsadm -R

    7. 查看ipvs規則等:

    -L [options]
        -n: 數字格式顯示IP地址
        -c: 顯示連接數相關信息
        --stats: 顯示統計數據
        --rate: 速率
        --exact:顯示統計數據的精確值
        --timeout: 超時時間
    -Z: 計數器清零;

四、LVS NAT模型的實現: 

    1. 集群環境: 一臺Director, 兩臺后端Real Server RS1,RS2

    Director: 兩網卡    
    eth0: 192.168.98.133/24 
    eth1: 172.25.136.10/24
    eth0:1: 192.168.98.128/24 作為VIP地址
    
    RS1: 
    eth0: 172.25.136.11 
    
    RS2: 
    eth0: 172.25.136.12
    Director的eth1和RS1,RS2的eth0在模擬在同一物理網絡內,使用VMnet2    
    物理機windows 7 作為客戶端,在192.168.98.0網絡內

    2. 為RS添加網關指向Director

    RS1:    
        # ifconfig eth0 172.25.136.11/24 
        # route add default gw 172.25.136.10 
    RS2: 
        # ifconfig eth0 172.25.136.12/24 
        # route add default gw 172.25.136.10 
        添加完路由條目后,應該可以ping通Director 192.168.98.0網段的兩個地址。

     3. 修改內核參數,開啟轉發功能

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

    4. 在RS1和RS2上面創建測試頁,并在Director驗證服務

    RS1上
        # echo 'web from RS1' > /var/www/html/index.html 
        # service httpd start 
    RS2上
        # echo 'web from RS2' > /var/www/html/index.html 
        # service httpd start 
    Director上驗證 
        # curl 172.25.136.11 
          web from RS1
        # curl 172.25.136.12 
          web from RS2

    5. 在Director添加集群服務

    # ipvsadm -A -t 192.168.98.128:80 -s wlc    
    # ipvsadm -a -t 192.168.98.128:80  -r 172.25.136.11:80 -m -w 1
    # ipvsadm -a -t 192.168.98.128:80  -r 172.25.136.12:80 -m -w 3

    6. 通過物理機瀏覽器訪問192.168.98.128, 正常情況,就可以看到輪尋的兩個RS的主頁了。 

    訪問幾次后,查看統計數據如下,大概接入報文比例3:1, 說明wlc生效了    
    # ipvsadm -L --stats 
        IP Virtual Server version 1.2.1 (size=4096)
        Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
          -> RemoteAddress:Port
        TCP  192.168.98.128:http                45      227      227    32215    19245
          -> 136-11.priv25.nus.edu.sg:htt       12       62       62     8571     6055
          -> 136-12.priv25.nus.edu.sg:htt       33      165      165    23644    13190

五、LVS DR模型,當DIP,VIP,RIP都為公網地址時(實驗環境中,把這三個地址全部放在同一物理網絡中)

    1. 地址規劃: 

    Director:     
        eth0: 192.168.98.133 作為ssh通信地址
        eth0:1: 192.168.98.128 作為VIP, 可以進行浮動
    RS1: 
        eth0: 192.168.98.129/24 作為RIP1 
        lo:1 : 192.168.98.128 作為隱藏的VIP
    RS1: 
        eth0: 192.168.98.130 作為RIP2 
        lo:2: 192.168.98.128 作為隱藏VIP

    2. 配置地址 

    Director: 
        # ifconfig eth0 192.168.98.133/24 up 
        # ifconfig eth0:1 192.168.98.128/24 up 
    RS1 
        # ifconfig eth0 192.168.98.129/24 up 
    RS2 
        # ifconfig eth0 192.168.98.130/25 up

    3. 修改RS1,RS3的內核參數,關閉lo的arp通告和lo的arp響應,并配置隱藏地址

    RS1: 
        # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
        # echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
        # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
        # echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        設置RS1的隱藏VIP地址, 并禁止其向外發廣播
        # ifconfig lo:1 192.168.98.128 netmask 255.255.255.255 broadcast 192.168.98.128
    RS2: 
        # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
        # echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
        # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
        # echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
            設置RS2的隱藏VIP地址,并禁止其向外發廣播
        # ifconfig lo:1 192.168.98.128 netmask 255.255.255.255 broadcast 192.168.98.128

    4. 為RS1和RS2添加路由條目,保證其發出報文經過eth0之前,還要先經過lo:1 VIP, 使得源地址成為VIP 

    RS1:     
        # route add 192.168.98.128 dev lo:1
    RS2:
        # route add 192.168.98.128 dev lo:1

    5. 此時在Director上面添加,集群服務

    # ipvsadm -A -t 192.168.98.128:80 -s wlc    
    # ipvsadm -a -t 192.168.98.128:80  -r 192.168.98.129:80 -g -w 1
    # ipvsadm -a -t 192.168.98.128:80  -r 192.168.98.130:80 -g -w 3

六、LVS持久連接:

1. PCC:將來自于同一個客戶端發往VIP的所有請求統統定向至同一個RS;

    可以通過修改輪尋算法為sh算法實現
    # ipvsadm -E -t 192.168.98.128:80 -s sh 
        [root@www ~]# curl 192.168.98.128 
        eb from RS2
        [root@www ~]# curl 192.168.98.128 
        web from RS2
        [root@www ~]# curl 192.168.98.128 
        web from RS2
        [root@www ~]# curl 192.168.98.128 
        web from RS2
        [root@www ~]# curl 192.168.98.128 
        web from RS2
        [root@www ~]# curl 192.168.98.128 
        web from RS2

    2. PPC:將來自于一個客戶端發往某VIP的某端口的所有請求統統定向至同一個RS;

    3. PFMC: 端口綁定,port affinity, 基于防火墻標記,將兩個或以上的端口綁定為同一個服務

    防火墻打標記
     # iptables -t mangle -A PREROUTING -d VIP -p tcp --dport CS_Port -j MARK --set-mark #  (0-99)
    定義集群服務:
     # ipvsadm -A -f #(防火墻打的標記)

原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/10598

(0)
以馬內利以馬內利
上一篇 2015-12-24 16:44
下一篇 2015-12-28 15:47

相關推薦

  • 學習總結

    課上練習整理

    Linux干貨 2017-11-19
  • bash的工作特性之命令執行狀態返回值和命令行展開

    bash的工作特性之命令執行狀態返回值和命令行展開 bash的工作特性之命令執行狀態返回值和命令行展開 執行狀態返回值 命令行展開 執行狀態返回值     Linux下每一條命令或每一個進程執行完成會返回一個狀態碼. 0:成功執行 1-255:執行過程中出現異?;蚍钦M顺?nbsp;在Shell腳本中,最后…

    Linux干貨 2016-11-05
  • 第八周:網絡基礎知識和shell腳本練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別; 網橋:是連接兩個局域網的基于MAC地址數據存儲轉發設備,工作于數據鏈路層 集線器:所有端口處于同一個廣播域和沖突域中,帶寬共享,工作于物理層 二層交換機:多端口網橋,一個端口一個沖突域,默認所有端口位于同一個廣播域中,可以劃分vlan,隔離廣播域,帶寬獨享 三層交換機:具有路由功…

    Linux干貨 2016-11-21
  • 進程和計劃任務

    1、進程概念 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等; 進程是運行中的程序的一個副本,是被載入內存的一個指令集合; 進程ID(PID )號碼被用來標記各個進程; UID、GID 和SELinux 語境決定對文件系統的存取和訪問權限,這些權限通常從執行進程的用戶來繼承并且存在生命周期; task struct:Linux內核存…

    Linux干貨 2016-09-13
  • 第一周學習內容

    1、LINUX的三大主流版本:debian slackware redhat 2、一個完整的操作系統是由內核+運行在內核之上的應用程序組成。      LINUX操作系統是由linux內核+GNU開源組織編寫的應用程序組成(GNU/Linux) 3、CPU架構:X86(X64)、摩托羅拉的m68k、arm、IBM的POWER(性…

    Linux干貨 2016-12-03
  • 從2個命令簡單聊聊CentOS賬戶鎖定原理

    linux中 passwd -l 和usermod -L有什么區別,各自的解鎖和鎖定原理是什么樣的呢?

    2017-11-16

評論列表(1條)

  • AZ
    AZ 2015-12-29 15:09

    這圖很贊~

欧美性久久久久