Docker筆記三:基於LVS DR模式構建WEB服務集群


LVS 支持NAT、TUN、DR、FullNAT四種模式,DR模式只支持IP轉發,不支持端口轉發,因此VS端口必須與RS端口保持一致。要使用FullNAT版,需安裝alibaba/LVS: https://github.com/alibaba/LVS 。

安裝ipvsadm

1. 先在宿主機上安裝並以root來啟動ipvsadm,每次要在容器中運行ipvs都需要先在宿主機上啟動ipvsadm。如果直接進行2步操作將報出如下錯誤:

Can't initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?

2. 實例化一個ipvs容器:

  • dockerfile:這里特別說明下,凡是在CMD和ENTRYPOINT中聲明的可執行程序都應該以非daemon的形式去運行永不自動退出,否則會導致容器在程序執行結束后也退出運行,默認CMD是/bin/bash。下文中定義的兩個腳本若放在rc.local中,容器啟動時不會自動執行,也不能放在CMD和ENTRYPOINT中去聲明自動執行,看來只有用crontab來啟用任務計划了,或手動執行一次。
    FROM ubuntu
    MAINTAINER cenze <272666745@qq.com>
    
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    ADD conf/sources.list /etc/apt/
    ADD conf/rc.ipvs /etc/ RUN apt-get update \ && apt-get install -y gcc make vim ipvsadm iproute2 keepalived #本機的80端口已經留給其他容器使用了,所以綁定在了89端口上 EXPOSE 89
  • 宿主機上 build 鏡像和 run 容器:
    sudo docker build -t cenze/ipvs -f Dockerfile-IPVS .
    sudo docker run -it -p 89:89 --name ipvs --privileged=true cenze/ipvs
  • 容器ipvs中完成均衡策略配置:由於容器啟動時不會自動去執行/etc/rc.local,所以需手動執行下。所有需要手動執行的命令都可寫進rc.ipvs(需要可執行權限)文檔:
    #!/bin/bash
    
    VIP=172.17.100.100
    VPORT=89
    RPORT=89
    RS=("172.17.0.8" "172.17.0.6")
    RSW=("1" "1")
    TYPE=g
    
    addrs() {
        ipvsadm -a -t $VIP:$VPORT -r $1:$RPORT -$TYPE -w $2
        [ $? -eq 0 ] && return 0 || return 1
    }
    #echo 1 > /proc/sys/net/ipv4/ip_forward ip addr add
    $VIP broadcast $VIP label eth0:0 dev eth0 ipvsadm -A -t $VIP:$VPORT -s wlc COUNT=0 for I in ${RS[*]}; do addrs $I ${RSW[$COUNT]} let COUNT++ done
    Director需要開啟IP轉發功能,如果默認未開啟,則echo 1 > /proc/sys/net/ipv4/ip_forward。然后一次手動執行完,執行完后不能退出容器,窗口不能關閉;否則ipvsadm也將退出,上述配置信息將失效:
    root@7a375abcd343:/# /etc/rc.ipvs

 

配置RS-172.17.0.6和RS-172.17.0.8

1. 與ipvs容器一樣,需要手動執行一些配置命令,將其寫進/etc/rc.rs(需要可執行權限):

#!/bin/bash

ip addr add 172.17.100.100 broadcast 172.17.100.100 label lo:0 dev lo echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

172.17.100.100被稱為VIP,需要在Director(ipvs容器)和Real Server(RS-172.17.0.6和RS-172.17.0.8都要新建一張地址為172.17.100.100的虛擬網卡出來)上同時部署。上述關於arp的設置不明白的,可去看這篇文章 Linux內核參數之arp_ignore和arp_announce。一次手動執行完:

root@203ffab2138f:/usr/local/pkgs/nginx-1.10.2# /etc/rc.rs

2. 為RS-172.17.0.8和RS-172.17.0.6添加不同的index.html:

<html>
<head>
<title>Welcome to RS-172.17.0.8(6)!</title>
</head>
<body>
<h1>Welcome to RS-172.17.0.8(6)!</h1>
</body>
</html>

3. WEB服務器的監聽端口改為89。

 

測試集群負載均衡效果

從多個瀏覽器訪問172.17.100.100:89:

1)不能從同一個瀏覽器開啟多個標簽去測試,否則將得到同一台WEB服務器的響應,刷新也沒用,這可能與持久連接有關。

2)不能通過localhost:89去訪問,否則將無法與WEB服務器群建立起連接。

3)不使用瀏覽器,而使用curl來發送多個請求也是可行的。

 1. Chrome訪問172.17.100.100:89: 

Welcome to 172.17.0.8!

2. FireFox訪問172.17.100.100:89: 

Welcome to 172.17.0.6!

 

LVS的十種調度算法

四種靜態算法,不考慮后端服務器實際負載情況

    1、RR

    依次論詢,不考慮RS的性能。

    2、WRR

    加權輪詢,加入了weight(權重),RS權重越大性能越好。

    3、DH

    目標hash,對同一個資源的請求發往同一台服務器,常用於緩存服務器的場景。

    4、SH

    源地址hash。

 

六種動態算法,考慮后端服務器當前負載后再進行分配

    1、LC

    Least Connection,擁有最少連接的RS響應客戶端請求。計算Overhead = active * 256 + inactive,如果相同則依次往下選擇RS,不考慮RS性能。

    2、WLC

    RS加權的LC,考慮了RS的性能。如果Overhead = (active * 256 + inactive) / weight相同,則由上而下選擇RS。

    3、SED

    最短期望延遲,就是對WLC的情況的補充,Overhead = (active + 1) * 256 / weight,+1就是為了讓其能夠比較出大小。

    4、NQ

    Never Queue 基本和SED相同,避免了SED當中的性能差的服務器長時間被空閑的弊端,第一個請求給性能好的服務器,第二個請求給空閑的服務器不論性能的好壞,以后還是會把請求給性能好的服務器。

    5、LBLC

    動態DH和LC的組合,適用於Cache群,對於從來沒有過的新請求會給當前連接數少的那台服務器。

    6、LBLCR

    帶有復制功能的LBLC,第一次訪問RS1的5個請求第二次又來了,Director會將它們都交給RS1嗎?此時RS2可是非常閑的,所以最好可以將這5個請求分別交給RS1和RS2,但需要把客戶端第一次請求的資源復制下來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM