天天看點

lvs

lvs是linux virtual server的簡稱,也就是linux虛拟伺服器, 是一個由章文嵩博士發起的自由軟體項目,它的官方站點是www.linuxvirtualserver.org。現在lvs已經是 linux标準核心的一部分,在linux2.4核心以前,使用lvs時必須要重新編譯核心以支援lvs功能子產品,但是從linux2.4核心以後,已經完全内置了lvs的各個功能子產品,無需給核心打任何更新檔,可以直接使用lvs提供的各種功能。

lvs

lvs:四層路由,四層交換

         根據目标ip和port實作請求轉發至後端的多個主機中的一個(根據挑選法則)

         借助于netfilter

         檢視核心是否編譯進來lvs指令

         grep –i “ipvs”  /boot/config-version,否則重新編譯核心

lvs:

         ipvsadm:使用者空間用于轉發規則的程式

         ipvs:工作于核心空間的input鍊根據規則完成請求排程的程式

         支援的協定:tcp udp sctp ah esp ah_esp

lvs中常用術語

director:主要作用類似于一個路由器,它含有完成lvs功能所設定的路由表,通過這些路由表把使用者的請求分發給server array層的應用伺服器(real server)上。同時,在director server上還要安裝對real server服務的監控子產品ldirectord,此子產品用于監測各個real server服務的健康狀況

real  server:real server可以是web伺服器、mail伺服器、ftp伺服器、dns伺服器、視訊伺服器等

client ip:cip

director ip:dip

director virtual   ip:vip

real server ip:rip

lvs類型

        lvs-nat:

                1、rs應用使用私有位址;rs的網關必須指向dip;

                2、請求和響應都要經過director;高負載場景中,director易成為性能瓶頸;

                3、支援端口映射;

                4、rs可以使用任意

                5、rip和dip要在同一網段

        lvs-dr:修改目标mac,直接送給網卡驅動,目标mac是基于排程方法選出某rs的網絡接口的mac位址

            1、保證前端路由将目标位址為vip的封包統統發往directory,而不能是rs;

                解決方案:

                    (1) 靜态位址綁定:在前端路由器上操作

                        問題:未必有路由操作權限

                    (2) aprtables

                    (3) 修改rs上核心參數,将rs上的vip配置在lo接口的别名上,并限制其不能響應對vip位址解析請求;

            2、rs可以使用私有位址;但也可以使用公網位址,此時可通過網際網路通過rip對其直接發起管理通路;

            3、rs跟directory必須在同一實體網絡中;

            4、請求封包經由director,但響應封包必須不能經過director;

            5、不支援端口映射;

            6、rs可以是大多數常見的os;

            7、rs的網關絕不允許指向dip;

        lvs-tun:不修改請求封包ip首部,通過隧道機制在ip首部外部再封裝一個ip首部(sip:dip,dip:rip),進過網絡發往伺服器

                1、rip、vip、dip全部是公網位址;

                2、rs的網關不會也不可能指向dip;

                3、請求封包經由director,但響應封包必須不能經過director;

                4、不支援端口映射;

                5、rs的os必須支援隧道功能;

        lvs-fullnat:

lvs scheduler:wlc預設排程算法

        # grep -i 'vs' /boot/config-version

        靜态方法:僅根據排程算法本身進行排程

            rr: round robin,輪流,輪詢,輪叫

            wrr: weighted round robin, 權重輪詢

            sh: source hashing,源位址hash,表示來源于同一個cip的請求将始終被定向至同一個rs;session保持;

            dh: destination hashing, 目标位址hash,

        動态方法:根據算法及各rs目前的負載狀況進行排程

            lc: least connection,最少連接配接

                overhead=active*256+inactive

            wlc: weighted lc

                overhead=(active*256+inactive)/weight 

            sed: shortest expection delay

                overhead=(active+1)*256/weight 

     lvs排程基于定義的叢集服務進行的。

            定義叢集服務

            為叢集添加各rs

ipvsadm用法:

         管理叢集服務:

                ipvsadm -a|e -t|u|f service-address [-s scheduler]

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

                       -a:添加

                       -e:修改

                       -d:删除

                       -t:tcp協定

                       -u:udp協定

                       -f:fwm,防火牆标記,标記用數字表示,将多個端口綁定在一起定義成一個叢集服務時使用

                     service-address:

                         -t|u: vip:port

                         -f: #

            向一個已經存在叢集服務添加一個rs:

                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

                       -a:添加rs

                       -e:修改rs

                       -d:删除rs

                       -r server-address:rs的位址 ip[:port]port省略預設使用相同端口

                       -g:gateway

                        -i:ipip

                        -m:masquerade

                        -w:權重

          檢視已經定義的叢集服務及rs:

                 ipvsadm -l -n

                     -c: 檢視各連接配接

                     --stats: 統計資料

                     --rate: 速率

                     --exact: 精确值

          清空所有的叢集服務:

                 ipvsadm -c

           儲存叢集服務定義:

                 ipvsadm -s > /path/to/some_rule_file

                 ipvsadm-save > /path/to/some_rule_file

             讓規則檔案中的規則生效:

                 ipvsadm -r < /path/from/some_rule_file

                 ipvsadm-restore < /path/from/some_rule_file

rs: 配置核心參數

    arp_ignore: 如何響應接收arp位址請求;預設0;1表示僅在請求的位址配置在請求封包的接口進行響應;

    arp_announce: 如何通告本地位址;預設0;2表示僅通過網絡直連的接口的位址;

rs:首先配置核心參數

    配置vip時使用:

    ifconfig lo:0 vip netmask 255.255.255.255 broadcast vip up

    route add -host vip dev lo:0

keepalived:

結合netfilter來實作一種叢集服務定義機制;

                (1) 在mangle表的prerouting鍊定義規則,實作指定防火牆标記;

                # iptables -t mangle -a prerouting -d vip -p {tcp|udp} --dport port -j mark --set-mark #

                (2) 基于此前的标記定義叢集服務;

                # ipvsadm -a -f # [-s method]

                # ipvsadm -a -f # -r rs [options]

            功能:将同屬于同一組應用的多個不同端口的服務定義成一個叢集服務,統一排程;

lvs持久連接配接功能:

            無論使用什麼排程方法,持久連接配接功能都能保證在指定的一段時間内,來自同一個使用者的請求始終被定向至同個rs;其排程基準為叢集服務;

            持久連接配接的類型:

                pcc:

                    在基于tcp或udp定義叢集服務時,其端口為0,格式為vip:0,表示将來自于使用者請求的任何一種請求(無論請求指定協定的哪個端口)統統轉給後端的rs;基于持久連接配接時,來自于同一個client的所有請求統統被轉發至同一個rs;

                  ipvsadm –a –t ip:0    –s rr –p  300

                  ipvsadm –a –t  ip:0 –r rip –g -w

                ppc:每端口持久

                    持久機制;單服務排程;各叢集服務分開排程

                pfm:單服務排程;可以通過防火牆标記将多個協定定義為同一個服務;

ipvs:對rs的健康狀态檢查可以借助于keepalived實作

                 檢查思路:

                     1.ip:icmp

                     2.傳輸層:端口開放狀态

                      3.應用層:請求關鍵性資源

rs的健康狀态檢測:

            1、自動上下線各rs;

                如果狀态發生了改變:

                    online --> fail

                        探測三次及以上;

                    offline --> ok

                        一次即可;

            2、所有rs均故障時,應該提供一個back server; 

            如何檢測rs的健康狀态:

                利用叢集服務依賴的協定進行檢測

                利用端口掃描或探測類工具對指定協定的端口進行探測

                在網絡層探測 

繼續閱讀