LVS負載均衡

Linux Cluster:
基於內核級實現

系統擴展的方式:
    Scale UP:向上擴展,增強
    Scale Out:向外擴展,增強設備,調度分配問題
Cluster:計算機集合,爲解決某個特定問題組合起來形成的單個系統;

Linux Cluster類型:
    LB:Load Balancing,負載均衡;
    HA:High Availiablity,高可用;避免SPOF(single point of failure)單點失敗
        MTBF:平均無故障時間
        MTTR:平均恢復前時間
        A=MTBF/(MTBF+MTTR)
            (0,1):90%, 95%, 99%, 99.5%,  99.9%, 99.99%, 99.999%, 99.9999%
    HP:High Performance,高性能;

        www.top500.org

    分佈式系統:
        分佈式存儲:雲盤
        分佈式計算:hadoop,spark

系統擴展方式:
    Scale UP:向上擴展
    Scale Out:向外擴展
        Cluster

Cluster分類
LB Cluster:

LB Cluster的實現:
    硬件:
        F5 Big-IP
        Citrix Netscaler
        A10 A10
    軟件:
        lvs:Linux Virtual Server
        nginx
        haproxy
        ats:apache traffic server 
        perlbal
        pound

    基於工作的協議層次劃分:
        傳輸層(通用):DPORT
            lvs:
            nginx:(stream)
            haproxy:(mode tcp)
        應用層(專用):(自定義的請求模型分類)
            proxy sferver:
                http:nginx, httpd, haproxy(mode http), ...
                fastcgi:nginx, httpd, ...
                mysql:mysql-proxy, ...
                ...

        站點指標:
            PV:Page View
            UV:Unique Vistor
            IP:

    會話保持:
        (1) session sticky
            Source IP:LVS sh算法(對某一特定服務而言)
            Cookie
        (2) session replication; 
            session cluster
        (3) session server
            memcached,redis

lvs:Linux Virtual Server 
    VS: Virtual Server
    RS: Real Server

    作者:章文嵩;alibaba --> didi

    l4:四層路由器,四層交換機; 
        VS:根據請求報文的目標IP和目標協議及端口將其調度轉發至某RealServer,根據調度算法來挑選RS;

    iptables/netfilter:
        iptables:用戶空間的管理工具;
        netfilter:內核空間上的框架;

            流入:PREROUTING --> INPUT 
            流出:OUTPUT --> POSTROUTING
            轉發:PREROUTING --> FORWARD --> POSTROUTING

        DNAT:目標地址轉換; PREROUTING;

    lvs: ipvsadm/ipvs
        ipvsadm:用戶空間的命令行工具,規則管理器,用於管理集羣服務及RealServer;
        ipvs:工作於內核空間的netfilter的INPUT鉤子之上的框架;
        使用ipvsadm的時候,記得禁用iptables和firewalld

    lvs集羣類型中的術語:
        vs:Virtual Server, Director, Dispatcher, Balancer
        rs:Real Server, upstream server, backend server
        CIP:Client IP 
        VIP: Virtual serve IP 
        RIP: Real server IP 
        DIP: Director IP

        CIP <--> VIP == DIP <--> RIP  原路返回

    lvs集羣的類型:
        lvs-nat:修改請求報文的目標IP;多目標IP的DNAT;
        lvs-dr:操縱封裝新的MAC地址;
        lvs-tun:在原請求IP報文之外新加一個IP首部;
        lvs-fullnat:修改請求報文的源和目標IP;

        lvs-nat:
            多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改爲某挑出的RS的RIP和PORT實現轉發;

            (1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP;
            (2)請求報文和響應報文都必須經由Director轉發;Director易於成爲系統瓶頸;
            (3)支持端口映射,可修改請求報文的目標PORT;
            (4)vs必須是Linux系統,rs可以是任意系統;

        lvs-dr:默認模型
            Direct Routing,直接路由;

            通過爲請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

            Director和各RS都得配置使用VIP;

            (1) 確保前端路由器將目標IP爲VIP的請求報文發往Director:
                (a) 在前端網關做靜態綁定;
                (b) 在RS上使用arptables;
                (c) 在RS上修改內核參數以限制arp通告及應答級別,爲了防止地址衝突。
                    arp_announce 1:在rs上不響應vip地址的arp請求
                    arp_ignore   2:在rs上不向非本網絡通告vip地址
            (2) RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director;
            (3) RS跟Director要在同一個物理網絡;
            (4) 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;
            (5) 不支持端口映射;

        lvs-tun:
            轉發方式:不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);

            (1) DIP, VIP, RIP都應該是公網地址;
            (2) RS的網關不能,也不可能指向DIP;
            (3) 請求報文要經由Director,但響應不能經由Director;
            (4) 不支持端口映射;
            (5) RS的OS得支持隧道功能;
            (6) 中間可以跨路由器

        lvs-fullnat:
            通過同時修改請求報文的源IP地址和目標IP地址進行轉發;
                CIP --> DIP  源地址
                VIP --> RIP  目標地址

            (1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP;
            (2) RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client;
            (3) 請求和響應報文都經由Director;
            (4) 支持端口映射;

            注意:此類型內核默認不支持;

    總結:
        lvs-nat, lvs-fullnat:請求和響應報文都經由Director;
            lvs-nat:RIP的網關要指向DIP;
            lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信;
        lvs-dr, lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client;
            lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發;
            lvs-tun:通過在原IP報文之外封裝新的IP報文實現轉發,支持遠距離通信;

ipvs(2)

ipvs scheduler:
    根據其調度時是否考慮各RS當前的負載狀態,可分爲靜態方法和動態方法兩種:

        靜態方法:僅根據算法本身進行調度;不管後端服務器的狀態
            RR:roundrobin,輪詢;
            WRR:Weighted RR,加權輪詢;
            SH:Source Hashing,實現session sticy,源IP地址hash;將來自於同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定;
            DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,如寬帶運營商。

        動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;
            Overhead=value,較小的RS將被調度。

            LC:least connections
                Overhead=activeconns*256+inactiveconns
                active:三次握手連接已經建立,且在傳輸數據
                inactive:三次握手連接已經建立,但沒在傳輸數據
            WLC:Weighted LC  系統默認調度方法
                Overhead=(activeconns*256+inactiveconns)/weight
            SED:Shortest Expection Delay,初始連接高權重優先
                Overhead=(activeconns+1)*256/weight
            NQ:Never Queue,第一輪均勻分配,後續SED
            LBLC:Locality-Based LC,動態的DH算法,使用場景:根據負載狀態實現正向代理
            LBLCR:LBLC with Replication,帶複製功能的LBLC,解決LBLC均衡負載不均衡的問題

ipvsadm/ipvs:
    ipvs:
        grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64 查看內核支持的模塊

            支持的協議:TCP, UDP, AH, ESP, AH_ESP,  SCTP;

        ipvs集羣:
            集羣服務
            服務上的RS

    ipvsadm:
        程序包:ipvsadm  
            yum install ipvsadm
            Unit File: ipvsadm.service
            主程序:/usr/sbin/ipvsadm
            規則保存工具:/usr/sbin/ipvsadm-save
            規則重載工具:/usr/sbin/ipvsadm-restore
            配置文件:/etc/sysconfig/ipvsadm-config

        ipvsadm命令:
            核心功能:
                集羣服務管理:增、刪、改;
                集羣服務的RS管理:增、刪、改;
                查看:

            ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
            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 [options]
            ipvsadm -d -t|u|f service-address -r server-address
            ipvsadm -L|l [options]
            ipvsadm -Z [-t|u|f service-address]

            管理集羣服務:增、改、刪;
                增、改:
                    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

                刪:
                    ipvsadm -D -t|u|f service-address

                service-address:
                    -t|u|f:
                        -t: TCP協議的端口,VIP:TCP_PORT
                        -u: TCP協議的端口,VIP:UDP_PORT
                        -f:firewall MARK,防火牆標籤,是一個數字;

                [-s scheduler]:指定集羣的調度算法,默認爲wlc;

            管理集羣上的RS:增、改、刪;
                增、改:
                    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

                刪:
                    ipvsadm -d -t|u|f service-address -r server-address

                server-address:
                    rip[:port]

                選項:
                    lvs類型:
                        -g: gateway, dr類型,默認模型
                        -i: ipip, tun類型
                        -m: masquerade, nat類型

                    -w weight:權重;

            清空定義的所有內容:
                ipvsadm -C

            查看:
                ipvsadm -L|l [options]
                    --numeric, -n:numeric output of addresses and ports 
                    --exact:expand numbers (display exact values)

                    --connection, -c:output of current IPVS connections
                    --stats:output of statistics information
                    --rate :output of rate information

            保存和重載:
                ipvsadm -S = ipvsadm-save
                ipvsadm -R = ipvsadm-restore 

負載均衡集羣設計時要注意的問題:
    (1) 是否需要會話保持;
    (2) 是否需要共享存儲;
        共享存儲:NAS, SAN, DS(分佈式存儲)
        數據同步:

    lvs-nat:

        設計要點:
            (1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP;
            (2) 支持端口映射;
            (3) Director要打開核心轉發功能;

ipvsadm/ipvs
    ipvs:內核中的INPUT鏈上;
    ipvsadm:用戶空間的命令行工具;
        服務管理:-A,-E,-D
        集羣服務的RS管理:-a, -e, -d
        查看:-L|l
            -n, --exact, -c, --stats, --rate
        清理:-C
        保存:-S = ipvsadm-save
        重載:-R = ipvsadm-restore

ipvs(3)

Demo:
    lvs-dr:

        dr模型中,各主機上均需要配置VIP,解決地址衝突的方式有三種:
            (1) 在前端網關做靜態綁定;
            (2) 在各RS使用arptables;
            (3) 在各RS修改內核參數,來限制arp響應和通告的級別;
                限制響應級別:arp_ignore
                    0:默認值,表示可使用本地任意接口上配置的任意地址進行響應;
                    1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,纔給予響應;
                限制通告級別:arp_announce
                    0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告;
                    1:儘量避免向非直接連接網絡進行通告;
                    2:必須避免向非本網絡通告;

            1.做dr實驗的時候,再rs上記得先禁止VIP地址廣播,在配置VIP地址,如果先配地址的話,網絡中的主機、路由器就會得到其mac地址,之後再禁止VIP地址廣播也無效了
            2.lvs必須配置網關,不然lvs會默認不再向外轉發數據包。

        RS的預配置腳本:
            #!/bin/bash
            #
            vip=10.1.0.5
            mask='255.255.255.255'

            case $1 in
            start)
                echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
                echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
                echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
                echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

                ifconfig lo:0 $vip netmask $mask broadcast $vip up
                route add -host $vip dev lo:0
                ;;
            stop)
                ifconfig lo:0 down

                echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
                echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
                echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
                echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

                ;;
            *) 
                echo "Usage $(basename $0) start|stop"
                exit 1
                ;;
            esac                    

        VS的配置腳本:
            #!/bin/bash
            #
            vip='10.1.0.5'
            iface='eno16777736:0'
            mask='255.255.255.255'
            port='80'
            rs1='10.1.0.7'
            rs2='10.1.0.8'
            scheduler='wrr'
            type='-g'

            case $1 in
            start)
                ifconfig $iface $vip netmask $mask broadcast $vip up
                iptables -F

                ipvsadm -A -t ${vip}:${port} -s $scheduler
                ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
                ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
                ;;
            stop)
                ipvsadm -C
                ifconfig $iface down
                ;;
            *)
                echo "Usage $(basename $0) start|stop"
                exit 1
                ;;
            esac                

FWM:FireWall Mark 
    netfilter:
        target: MARK, This  target  is  used  to set the Netfilter mark value associated with the packet.

            --set-mark value

    藉助於防火牆標記來分類報文,而後基於標記定義集羣服務;可將多個不同的應用使用同一個集羣服務進行調度;

    打標記方法(在Director主機):
        # iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 

    基於標記定義集羣服務:
        # ipvsadm -A -f NUMBER [options]

lvs persistence:持久連接

    持久連接模板:實現無論使用任何調度算法,在一段時間內,能夠實現將來自同一個地址的請求始終發往同一個RS;

        ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

    port Affinity:
        每端口持久:每個端口對應定義爲一個集羣服務,每集羣服務單獨調度;
        每防火牆標記持久:基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity;
        每客戶端持久:基於0端口定義集羣服務,即將客戶端對所有應用的請求統統調度至後端主機,必須定義爲持久模式;

保存及重載規則:
    保存:建議保存至/etc/sysconfig/ipvsadm
        ipvsadm-save > /PATH/TO/IPVSADM_FILE
        ipvsadm -S > /PATH/TO/IPVSADM_FILE
        systemctl stop ipvsadm.service 

    重載: 
        ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
        ipvsadm -R < /PATH/FROM/IPVSADM_FILE
        systemctl restart ipvsadm.service 

考慮:
    (1) Director不可用,整個系統將不可用;SPoF
        解決方案:高可用 
            keepalived 
            heartbeat/corosync
    (2) 某RS不可用時,Director依然會調度請求至此RS;
        解決方案:對各RS的健康狀態做檢查,失敗時禁用,成功時啓用;
            keepalived
            heartbeat/corosync, ldirectord
        檢測方式:
            (a) 網絡層檢測;
            (b) 傳輸層檢測,端口探測;
            (c) 應用層檢測,請求某關鍵資源;

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