LVS 支持 NAT、TUN、DR、FullNAT 四种模式,DR 模式只支持 IP 转发,不支持端口转发,因此 VS 端口必须与 RS 端口保持一致。
安装 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 容器:
- 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
- #本机的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
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) 上同时部署 (也就是绑定到一张网卡上,新建一张虚拟网卡出来)。上述关于 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 服务器群建立起连接。
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,但需要把客户端第一次请求的资源复制下来。
来源: http://www.cnblogs.com/XiongMaoMengNan/p/8056211.html