1.1 均衡負載:Linux Virtual Server之NAT、DR

Cluster集羣

    集羣,爲解決某個特定問題將多臺計算機組合起來形成的單個系統
Linux Cluster 類型:
LB:Load Balancing,負載均衡
HA:High Availiablity,高可用,SPOF(single Point Of failure)
    MTBF:Mean Time Between Failure 平均無故障時間
    MTTR:Mean Time To Restoration( repair)平均恢復前時間
    A=MTBF/(MTBF+MTTR) (0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
HPC:High-performance computing,高性能

LVS

    LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以後,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
集羣體系結構


    lvs集羣類型中的術語:

VS:Virtual Server,Director Server(DS)
Dispatcher(調度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx)
backend server(haproxy)
CIP:Client IP
VIP: Virtual serve IP VS外網的IP
DIP: Director IP VS內網的IP

RIP: Real server IP

    調度算法

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

    1、輪詢(Round Robin)
    調度器通過”輪詢”調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。
    2、加權輪詢(Weighted Round Robin)
    調度器通過”加權輪叫”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
    3、源地址散列(Source Hashing)
    ”源地址散列”調度算法根據請求的源IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

    4、目標地址散列(Destination Hashing)
“目標地址散列”調度算法根據請求的目標IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

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

    1、最少鏈接(Least Connections)
    調度器通過”最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集羣系統的真實服務器具有相近的系統性能,採用”最小連接”調度算法可以較好地均衡負載。
    2、加權最少鏈接(Weighted Least Connections)默認算法
    在集羣系統中的服務器性能差異較大的情況下,調度器採用”加權最少鏈接”調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
    3、SED:Shortest Expection Delay,初始連接高權重優先
Overhead=(activeconns+1)*256/weight
    4、NQ:Never Queue,第一輪均勻分配,後續SED
    5、基於局部性的最少鏈接(Locality-Based Least Connections)
“基於局部性的最少鏈接” 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用”最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。
    6、帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
    “帶複製的基於局部性最少鏈接”調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按”最小連接”原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按”最小連接”原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製的程度。

LVS集羣的分類

lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
lvs-dr:操縱封裝新的MAC地址
lvs-tun:在原請求IP報文之外新加一個IP首部

lvs-fullnat:修改請求報文的源和目標IP,系統默認不支持,需要編譯內核實現

 VS/NATVS/TUNVS/DRVS/DR
ServeranyTunnelingNon-arp device
server networkprivateLAN/WANLAN
server numberlow (10~20)High (100)High (100)
server gatewayload balancerown routerown router

    lvs-nat:RIP的網關要指向DIP。lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信。

lvs-nat與lvs-fullnat:請求和響應報文都經由Director

    lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發,lvs-tun:通過在原IP報文外封裝新IP頭實現轉發,支持遠距離通信 。
lvs-dr與lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client

   ipvsadm 命令用於管理集羣服務 LVS

    語法:ipvsadm 行爲 協議 lvs服務器地址[:端口] [選項] [參數]

    行爲

集羣服務:                                             管理RS

-A:增加新的集羣服務                            -a:增加新的RS
-E:修改已有的集羣服務                         -e:修改新的RS

-D:刪除舊的集羣服務                            -d:刪除新的RS

-C:清空定義的所有內容
-Z:清空計數器
-L:查看當前 ipvs 規則
    --numeric, -n:以數字形式輸出地址和端口號
    --exact:擴展信息,精確值
    --connection,-c:當前IPVS連接輸出
    --stats:統計信息
    --rate :輸出速率信息

    協議

-t: TCP協議的端口
-u: UDP協議的端口

-f:firewall MARK,標記,一個數字

    選項

-s:指定集羣的調度算法,默認爲wlc
-g: gateway, dr類型,默認
-i: ipip, tun類型
-m: masquerade, nat類型

-w weight:權重

需要保存 ipvs 規則,可以保存至 /etc/sysconfig/ipvsadm,當然不是必須保存至此路徑
ipvsadm -S > 規則文件路徑

systemctl stop ipvsadm.service,centos7在停止服務時會自動保存規則

重新加載已保存的規則時,ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service,centos7開啓服務時會自動讀取規則文件

    LVS-nat

    Virtual Server via NAT(VS-NAT):用地址翻譯實現虛擬服務器。地址轉換器有能被外界訪問到的合法IP地址,它修改來自專有網絡的流出包的地址。外界看起來包是來自地址轉換器本身,當外界包送到轉換器時,它能判斷出應該將包送到內部網的哪個節點。優點是節省IP 地址,能對內部進行僞裝;缺點是效率低,因爲返回給請求方的流量經過轉換器。 


(1)當用戶請求到達DirectorServer,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP 。
(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈。
(3) IPVS比對數據包請求的服務是否爲集羣服務,若是,修改數據包的目標IP地址爲後端服務器IP,然後將數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP ,在這個過程完成了目標IP的轉換。
(4) POSTROUTING鏈通過選路,將數據包發送給Real Server。
(5) Real Server比對發現目標爲自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲RIP,目標IP爲CIP 。
(6) Director Server在響應客戶端前,此時會將源IP地址修改爲自己的VIP地址,然後響應給客戶端。 此時報文的源IP爲VIP,目標IP爲CIP。


    注意

(1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP
(2) LVS要打開核心轉發功能

    在 Real Server 上調整默認路由

[root@CentOS75 ~]# route add default gw 192.168.30.74
[root@CentOS75 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.30.74   0.0.0.0         UG    0      0        0 ens33
192.168.30.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

    在 LVS 上開啓路由轉發,並配置 LVS-nat 模式

[root@CentOS74 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@CentOS74 ~]# sysctl -p  
[root@CentOS74 ~]# ipvsadm -A -t 172.20.116.3:8080 -s rr    #增加集羣服務
[root@CentOS74 ~]# ipvsadm -a -t 172.20.116.3:8080 -r 192.168.30.174:80 -m   #增加RS,並且轉發端口
[root@CentOS74 ~]# ipvsadm -a -t 172.20.116.3:8080 -r 192.168.30.75:80 -m
[root@CentOS74 ~]# ipvsadm -Ln      #查看配置
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.20.116.3:8080 rr
  -> 192.168.30.75:80             Masq    1      0          0         
  -> 192.168.30.174:80            Masq    1      0          0       

    測試 LVS-nat 帶端口轉發的輪詢模式

[root@CentOS69 ~]# curl 172.20.116.3:8080
RS1
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS2
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS1
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS2

    LVS-DR

    Virtual Server via Direct Routing(VS-DR):用直接路由技術實現虛擬服務器。當參與集羣的計算機和作爲控制管理的計算機在同一個網段時可以用此方法,控制管理的計算機接收到請求包時直接送到參與集羣的節點。直接路由模式比較特別,很難說和什麼方面相似,前種模式基本上都是工作在網絡層上(三層),而直接路由模式則應該是工作在數據鏈路層上(二層)。

    DR和REAL SERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有REAL SERVER對本身這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算法,找出對應的 REAL SERVER,把目的MAC地址改爲REAL SERVER的MAC併發給這臺REAL SERVER。這時REAL SERVER收到這個數據包,則等於直接從客戶端收到這個數據包無異,處理後直接返回給客戶端。由於DR要對二層包頭進行改換,所以DR和REAL SERVER之間必須在一個廣播域,也可以簡單的理解爲在同一臺交換機上。

    DR模型中各主機上均需要配置VIP,解決地址衝突的方式有三種:

(1) 在前端網關做靜態綁定
(2) 在各RS使用arptables

(3) 在各RS修改內核參數,來限制arp響應和通告的級別

    限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應

1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應

    限制通告級別:arp_announce
0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1:儘量避免將接口信息向非直接連接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告

單網絡DR模型的LVS


    LVS 不需要開啓路由轉發,配置LVS-DR

[root@CentOS74 ~]# ipvsadm -A -t 192.168.30.100:80 -s rr
[root@CentOS74 ~]# ipvsadm -a -t 192.168.30.100:80 -r 192.168.30.174 -g
[root@CentOS74 ~]# ipvsadm -a -t 192.168.30.100:80 -r 192.168.30.75 -g
[root@CentOS74 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.30.100:80 rr
  -> 192.168.30.75:80             Route   1      0          0         
  -> 192.168.30.174:80            Route   1      0          0         

    RS 上需要在迴環網卡上創建網卡別名,也可以使用物理網卡,但是使用迴環網卡能夠節約成本,建議使用

[root@CentOS174 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.30.100   #使用VIP
NETMASK=255.255.255.255 #子網掩碼爲32
BOOTPROTO=none
[root@CentOS174 ~]# ip addr show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.30.100/32 brd 192.168.30.100 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

    將 RS 上的 APR 廣播與應答關閉,避免地址衝突

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

在客戶端測試 LVS-DR

[root@CentOS7 ~]# curl 192.168.30.100
RS174
[root@CentOS7 ~]# curl 192.168.30.100
RS75
[root@CentOS7 ~]# curl 192.168.30.100
RS174
[root@CentOS7 ~]# curl 192.168.30.100
RS75

多網絡DR模型的LVS


    與上面單網絡的網絡拓撲大致相似,所以修改基本的網絡拓撲後,配置 LVS

[root@CentOS74 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:1
DEVICE=ens33:1
BOOTPROTO=none
IPADDR=10.0.0.74
NETMASK=255.255.255.255
[root@CentOS74 ~]# ipvsadm -A -t 10.0.0.74:80 -s wrr   #加權輪詢
[root@CentOS74 ~]# ipvsadm -a -t 10.0.0.74:80 -r 192.168.30.174 -g -w 3  #權值爲3
[root@CentOS74 ~]# ipvsadm -a -t 10.0.0.74:80 -r 192.168.30.75 -g -w 1   #權值爲1
[root@CentOS74 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.74:80 wrr
  -> 192.168.30.75:80             Route   1      0          0         
  -> 192.168.30.174:80            Route   3      0          0        

    配置 RS,在迴環網卡上添加 VIP,並指定默認路由

[root@CentOS174 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.74
NETMASK=255.255.255.255
BOOTPROTO=none
[root@CentOS174 ~]# route add default gw 192.168.30.69
[root@CentOS174 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.30.69   0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
192.168.30.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33

在客戶端上測試 加權的 LVS-DR

[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS75
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS75



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