参考
LVS是一种基于TCP/IP的负载均衡技术,也就是L4的的,转发效率极高(数据结构使用hash)。是由国内开源第一人,章文嵩博士期间开发完成。
LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。
当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。同请求包一样,应答包的返回方式也与包转发策略有关。
• Round Robin
• Weighted round robin
• Source ip hash(来自于同一个ip的请求调度到同一个real server)
• Destination hash
• Least connections
Weighted Least Connection(default)
客户端请求vip+port后,经过input链,如果ipvs发现报文访问的vip+port与我们定义的lvs集群规则相符合。经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
启动了两个http容器,然后用ipvsadm命令添加了3条规则
docker run -itd --name test1 -h test1 strm/helloworld-http:latest // 容器ip是172.17.0.4
docker run -itd --name test2 -h test2 strm/helloworld-http:latest // 容器ip是172.17.0.5
sudo ipvsadm -A -t 10.0.2.15:80 -s rr // rr表示用的是轮询算法
sudo ipvsadm -a -t 10.0.2.15:80 -r 172.17.0.4 -m
sudo ipvsadm -a -t 10.0.2.15:80 -r 172.17.0.5 -m
sudo 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.2.15:80 rr
-> 172.17.0.4:80 Masq 1 0 0
-> 172.17.0.5:80 Masq 1 0 0
测试如下:因为用的是rr,所以流量是平均分配到后端的实例。
for in in `seq 1 100`; do curl -s 10.0.2.15:80; echo; done | sort | uniq -c
100
50 HTTP Hello World Hello from test1
HTTP Hello World Hello from test2