天天看點

基于lvs-nat方式實作負載均衡

實驗環境:

<code>    </code><code>OS : CentOS 6.6 </code>

<code>    </code><code>ipvsadm: ipvsadm-1.26-4.el6.x86_64</code>

<code>    </code><code>LVS Server: </code>

<code>            </code><code>eth0: 172.16.66.10</code>

<code>            </code><code>eth1: 192.168.100.3</code>

<code>    </code><code>RS1:</code>

<code>            </code><code>eth1: 192.168.66.11</code>

<code>            </code><code>gateway: 192.168.100.3</code>

<code>    </code><code>RS2:</code>

<code>            </code><code>eth1: 192.168.100.12</code>

叢集系統性能提升方式:

    scale up: 向上擴充 (更新硬體裝置 等)

    scale out: 向外擴充 (添加主機數量提升性能)

Linux Cluster 類型 

    負載均衡叢集:Load Balancing (主要用于擴容、及可用性)

    高可用叢集:High Availability (主要目标保證系統可用) (又稱HA叢集 )

        衡量可用性名額 = 平均無故障時間/(平均無故障時間+平均修複時間)    其比例 用于衡量可用性 性能 

            95%,  99%,  99.9%, 99.99%, 99.999% 

    高性能叢集:High Performance    (又稱HP 叢集)

        www.top500.org 

負載均衡叢集LB實作方式:

    軟體:

        tcp:LVS (Linux Virtual Server), haproxy, nginx(能在使用者空間模拟tcp進行排程)

        http: haproxy,nginx,Apache(proxy module, balancer module),ats(apache traffic server)--【Yahoo 貢獻】,squid,varnish

        mysql: mysql-proxy [mysql 協定專用]

    硬體

        F5:Big-IP【性能最好,價位也貴】

        Citrix: NetScaler        思傑 (價位僅次于F5)

        A10:A10

        Array:

        RedWare:

LVS:Linux Virtual Server

    LVS工作在第四層:傳輸層

            layer4 router

            layer4 switch 

    原理:根據目标位址和端口作出轉發與否的決策,根據排程方法作出轉發至哪一個後端伺服器的決策

    組成部分:

        ipvs (工作與核心空間) :工作在netfilter的 INPUT鍊

        ipvsadm (工作與使用者空間):用于在ipvs上定義叢集服務,同時也得定義此叢集服務對應于有哪個後端主機可用

    lvs中的常用語約定

        Host:

            Director: 排程器 

            Real Server: RS,後端提供服務的主機

        IP:

            Client IP:CIP

            Director Virtual IP: VIP  【面向用戶端提供服務的IP】

            Director IP: DIP    【面向後端提供服務的IP】

            Real IP: RIP    【後端提供服務的主機IP】    

    LVS的類型

        lvs-nat:

            masquerade: 基于位址僞裝來實作

        lvs-dr:

            direct routing :直接路由

        lvs-tun:

            tunneling:基于IP隧道做轉發

        lvs-fullnat:

            fullnat  : 入站或出站時即更改目标位址又更改源位址

    LVS類型詳解:

        lvs-nat: 類似于DNAT,但支援多目标轉發;

            它通過修改請求封包的目标位址為根據排程算法所跳出的某RS的RIP來進行轉發;

         架構特性:

            (1)RS應該使用私有位址,即RIP應該為私有位址;各RS的網關必須指向DIP

            (2)請求和響應封包都經由Director轉發,高負載場景中,Director易于成為系統瓶頸;

            (3)支援端口映射;

            (4)RS可以使用任意類型的OS;

            (5)RS的RIP必須與Director的DIP處于同一網絡;

        lvs-dr: 直接路由

            Director在實作轉發時不修改請求封包的IP首部,而是通過直接封裝MAC首部完成轉發;目标MAC是Director根據排程方法挑選出的某RS的MAC位址;拓撲結構有别于NAT類型;

            架構特性:    

                (1)保證前端路由器将目标位址為VIP的請求封包通過ARP的位址解析後送往Director

                    解決方案:

                        靜态綁定:在前端路由直接将VIP對應的目标MAC靜态配置為Director的MAC位址(不太現實 ,route 在營運商那裡 一般我們沒有權限,)

                        arptables:在各RS上,通過arptables規則拒絕其相應對VIP的ARP廣播請求

                        核心參數:在RS上修改核心參數,并結合位址配置方式實作拒絕相應對VIP的ARP廣播請求

                (2)RS的RIP可以使用私有位址;但也可以使用公網位址,此時可通過網際網路上的主機直接對此RS發起管理操作;

                (3)請求封包必須經由Director排程,但相應封包必須不能經由Director;

                (4)各RIP必須與DIP在同一個實體網絡中;

                (5)不支援端口映射

                (6)RS可是使用大多數的OS; (VIP 加進去)

                (7)RS的網關一定不能指向Director;

        lvs-tun:不修改請求封包的IP首部,而是通過IP隧道機制在原有的IP封包之外再封裝IP首部,經由網際網路把請求封包交給標明的RS;

                CIP;VIP  DIP;RIP

                tun    =&gt;  tunrel   隧道 

                IP隧道承載IP封包

                (1)RIP,DIP,VIP都是公網位址;

                (2)RS的網關不能,也不可能指向DIP;

                (3)請求封包由Director分發,但相應封包由RS響應給請求者Client

                (4)不支援端口映射

                (5)RS的OS必須得支援IP隧道;

           lvs-tun 這種模式不常用 

        lvs-fullnat:通過修改請求封包的源位址為DIP,目标位址為RIP來實作轉發;對于響應封包而言,修改源位址為VIP,目标位址為CIP來實作轉發;

                (1)RIP,DIP可以使用私有位址;

                (2)RIP和DIP可以不再同一個網絡中,且RIP的網關未必需要指向DIP

                (3)支援端口映射;

                (4)RS的OS可以使用任意類型;

                (5)請求封包經由Director,響應封包經由Director

                【Linux 預設不支援lvs-fullnat 】

    LVS Scheduler:    LVS 的十種 排程方法

        靜态方法:僅根據算法本身實作排程 (關注起點公平)

            RR:round-robin ,輪詢;輪叫、論調、輪流

            WRR:weighted round-robin,權重輪詢; (給每個RS一個權重)

                Overhead=conn/weight 

            SH:Source ip Hashing:源位址hash ,把來自于同一個位址的請求,統統定向至此前標明的RS; (session 綁定)  (将同一個client請求定向至同一個RS)

            DH:Destination Ip Hashing,目标位址哈希;把通路同一個目标位址的請求,統統定向至此前標明的RS(當公司出口有多個時才用的到)

        動态方法:根據算法及後端RS目前的負載狀況實作排程 (關注結果公平)

            LC:least connection 最少連結

                Overhead=Active * 256 + Inactive   【Overhead值 = 活動連結 * 256 + 非活動連結】

            WLC:weighted least connection  【被當做LVS 預設排程,也是用的最多的排程算法】

                Overhead= (Active* 256 + Inactive)/weight 

            SED:Shorted Ecpection Delay  最短期望延遲

                Overhead=(Active +1 )*256 /weight 

            NQ: Never Queue 永不排隊

            LBLC:local-Based Least Connection,動态方式的DH算法 【考慮RS狀況進行排程】

            LBLCR: Replicated LBLC 

              【活動連結比較消耗資源】

    Session 保持  【session sharing ---session 共享 】

        Session Sticky 【簡單粗暴、有效  、實作容易】

        Session Replication Cluster: Session 複制叢集 【規模有限】

        Session Server 

ipvsadm 指令的使用者;

            管理叢集服務:建立、修改、删除、

            管理叢集服務的RS:添加、修改、移除

            檢視:

                統計資料

                速率

                -C  :清空規則

                -A:

                - Z:清空計數器

            管理叢集服務: 

                建立或修改:

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

                        -A:添加

                        -E:修改 

                        -t:承載的應用層協定為基于TCP協定提供服務的協定;其service-address的格式為“VIP:PORT”;如“172.16.100.6:80"

                        -u:承載的應用層協定為基于TCP協定提供服務的協定;其service-address的格式為“VIP:PORT”;如“172.16.100.6:53";

                        -f:承載的應用層協定為基于TCP或UDP協定提供服務的協定;但此類封包會經由iptables/netfilter 打标記,即為防火牆标記;其service-address的格式為“FWM”;如“10"

                        -s scheduler: 指明排程方法,預設為WLC

                删除:

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

            管理叢集服務上的RS:

                添加或修改:

                    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]

                        -r server-address: 指明RS,server-address格式一般為”IP[:PORT]";注意,隻支援端口映射的lvs類型中才應該顯式定義此處端口

                            例如: -r 192.168.10.7:80 

                        [-g|i|m] : 指明LVS類型

                            -g:gateway,意為dr類型;

                            -i:ipip,意為tun類型

                            -m: masquerade, 意為nat類型

                        [-w weight]:目前RS的權重:

                            注意:僅對于支援權重重排程的scheduler,權重才有意義;

                删除: 

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

            清空所有叢集服務的定義:

                ipvsadm -C 

            儲存規則:

                ipvsadm -S &gt; /etc/sysconfig/ipvsadm 

                ipvsadm-save &gt; /etc/sysconfig/ipvsadm 

                service ipvsadm save 

                      /etc/sysconfig/ipvsadm

                ipvsadm -R &lt; /etc/sysconfig/ipvsadm 

                ipvsadm-restore &lt; /etc/sysconfig/ipvsadm 

                service ipvsadm restart 

            檢視規則:

                ipvsadm -L | l [OPTIONS]

                    -c: 列出目前所有connection:

                    --stats:列出統計資料

                    --rate: 列出速率 

                    -n, --numeric: 數字格式顯示IP及端口;

                    --exact:精确值;

            清空計數器 :

                ipvsadm -Z [-t|u|f service-address]                     

 ##############################################################

##############################################################                

前期準備:

RS1:

    1、安裝httpd,啟動服務

    2、設定首頁面,為了區分排程效果,首頁面内容設定為: This is RS1 Server

    3、設定IP: ifconfig eth1 192.168.100.11/24 up

    4、添加網關: # route add default gw 192.168.100.3

RS2:

    2、為WEB服務添加首頁面,為了實驗區分排程效果,首頁面内容設定為: This is RS2 Server

    3、設定IP: ifconfig eth1 192.168.100.12/24 up

LVS Server :

    1、設定IP 

        # ifconfig eth0 172.16.66.10/16 up

        # ifconfig eth1 192.168.100.3/14 up

    2、安裝ipvsadm   

        # yum -y install ipvsadm    

    3、開啟forward 轉發            

        # echo 1 &gt; /proc/sys/net/ipv4/ip_forward        

注: RS1、RS2與LVS Server的eth1 處于同一私有網段

實驗一:

    配置lvs-nat類型 以輪調模式配置伺服器叢集

<code>    </code><code>[root@1inux ~]# ipvsadm -A -t 172.16.66.10:80 -s rr</code>

<code>[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.11 -m</code>

<code>[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.12 -m</code>

<code>[root@1inux ~]# ipvsadm -L -n</code>

<code>IP Virtual Server version 1.2.1 (size=4096)</code>

<code>Prot LocalAddress:Port Scheduler Flags</code>

<code>  </code><code>-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>

<code>TCP  172.16.66.10:80 rr</code>

<code>  </code><code>-&gt; 192.168.100.11:80            Masq    1      1          8         </code>

<code>  </code><code>-&gt; 192.168.100.12:80            Masq    1      0          1         </code>

<code>[root@1inux ~]#</code>

然後我們通路 http://172.16.66.10

我們可以看到首次通路的是 RS1  Server   

當我們使用F5 重新整理出現了RS2 Server 頁面 

<a href="http://s3.51cto.com/wyfs02/M00/6E/08/wKioL1VyUHvQZeAXAAD3wgInNYU539.jpg" target="_blank"></a>

可以看到RS1,RS2是以論調的方式依次出現的

使用ipvsadm指令檢視LB Server 的資料 

檢視 其統計資料 

[root@1inux ~]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -&gt; RemoteAddress:Port

TCP  172.16.66.10:80                    16       89       82    10592     7300

  -&gt; 192.168.100.11:80                   8       47       41     5428     3646  

  -&gt; 192.168.100.12:80                   8       42       41     5164     3654

[root@1inux ~]# 

可以檢視RS1、RS2其統計資料一緻

儲存ipvs配置規則

[root@1inux yum.repos.d]# service ipvsadm save    //其檔案預設儲存在/etc/sysconfig/ipvsadm 中

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

[root@1inux yum.repos.d]# 

删除配置規則:

[root@1inux yum.repos.d]# ipvsadm -D -t 172.16.66.10:80

[root@1inux yum.repos.d]# ipvsadm -L -n   //驗證是否删除成功

Prot LocalAddress:Port Scheduler Flags

  -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@1inux yum.repos.d]#     

恢複之前的儲存配置規則 

<code>[root@1inux yum.repos.d]# ipvsadm -R &lt; /etc/sysconfig/ipvsadm</code>

<code>[root@1inux yum.repos.d]# ipvsadm -L -n</code>

<code>  </code><code>-&gt; 192.168.100.11:80            Masq    1      0          0         </code>

<code>  </code><code>-&gt; 192.168.100.12:80            Masq    1      0          0         </code>

<code>[root@1inux yum.repos.d]#</code>

實驗二:

使用WLC排程方法,并添權重重 RS1 為1 , RS2 為2 

<code>[root@1inux ~]# ipvsadm -A -t 172.16.66.10:80 -s wlc</code>

<code>[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.11 -m -w 1</code>

<code>[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.12 -m -w 2</code>

驗證配置情況

<code>TCP  172.16.66.10:80 wlc</code>

<code>  </code><code>-&gt; 192.168.100.12:80            Masq    2      0          0         </code>

然後用戶端通路,同樣多次重新整理 ,發現每重新整理三次會出現兩次RS2 頁面  一次RS1頁面

檢視目前連結統計

TCP  172.16.66.10:80                    21      105      105    13330     9625

  -&gt; 192.168.100.11:80                   7       35       35     4452     3549

  -&gt; 192.168.100.12:80                  14       70       70     8878     6076

由上面的可以看到  192.168.100.12 的conns數是 192.168.100.11 的兩倍

本文轉自 1inux 51CTO部落格,原文連結:http://blog.51cto.com/1inux/1659048

繼續閱讀