LVS 支持NAT、TUN、DR、FullNAT四種模式,DR模式只支持IP轉發,不支持端口轉發,所以VS端口必須與RS端口保持一致。要使用FullNAT版,需安裝alibaba/LVS: https://github.com/alibaba/LVS 。html
安裝ipvsadmnginx
1. 先在宿主機上安裝並以root來啓動ipvsadm,每次要在容器中運行ipvs都須要先在宿主機上啓動ipvsadm。若是直接進行2步操做將報出以下錯誤:git
Can't initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?github
2. 實例化一個ipvs容器:算法
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
sudo docker build -t cenze/ipvs -f Dockerfile-IPVS .
sudo docker run -it -p 89:89 --name ipvs --privileged=true cenze/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
root@7a375abcd343:/# /etc/rc.ipvs
配置RS-172.17.0.6和RS-172.17.0.8docker
1. 與ipvs容器同樣,須要手動執行一些配置命令,將其寫進/etc/rc.rs(須要可執行權限):ubuntu
#!/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。一次手動執行完:vim
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的十種調度算法
四種靜態算法,不考慮後端服務器實際負載狀況:
一、RR
依次論詢,不考慮RS的性能。
二、WRR
加權輪詢,加入了weight(權重),RS權重越大性能越好。
三、DH
目標hash,對同一個資源的請求發往同一臺服務器,經常使用於緩存服務器的場景。
四、SH
源地址hash。
六種動態算法,考慮後端服務器當前負載後再進行分配:
一、LC
Least Connection,擁有最少鏈接的RS響應客戶端請求。計算Overhead = active * 256 + inactive,若是相同則依次往下選擇RS,不考慮RS性能。
二、WLC
RS加權的LC,考慮了RS的性能。若是Overhead = (active * 256 + inactive) / weight相同,則由上而下選擇RS。
三、SED
最短時間望延遲,就是對WLC的狀況的補充,Overhead = (active + 1) * 256 / weight,+1就是爲了讓其可以比較出大小。
四、NQ
Never Queue 基本和SED相同,避免了SED當中的性能差的服務器長時間被空閒的弊端,第一個請求給性能好的服務器,第二個請求給空閒的服務器不論性能的好壞,之後仍是會把請求給性能好的服務器。
五、LBLC
動態DH和LC的組合,適用於Cache羣,對於歷來沒有過的新請求會給當前鏈接數少的那臺服務器。
六、LBLCR
帶有複製功能的LBLC,第一次訪問RS1的5個請求第二次又來了,Director會將它們都交給RS1嗎?此時RS2但是很是閒的,因此最好能夠將這5個請求分別交給RS1和RS2,但須要把客戶端第一次請求的資源複製下來。