一、简介
1.1 LVS
LVS是Linux Virtual Server的简写,是用来实现服务器的负载均衡调度。
LVS是一个内核模块。
官网:http://www.linuxvirtualserver.org/
1.2 ipvsadm
ipvsadm是LVS内核模块的配置管理工具。
1.3 keepalived
keepalived,是用来实现双机热备。
keepalived监测服务器的状态,如果一台web服务器出现故障,keepalived将其从服务器集群中剔除;当web服务器正常后,keepalived自动将其加入到服务器集群中。这些工作全部自动完成,不需要人工干预。
keepalived可以工作在3、4、7层,即IP层、TCP层、应用层。
二、LVS
2.1 LVS工作方式
1. NAT (http://www.linuxvirtualserver.org/VS-NAT.html)
请求包、响应包都经过DR,瓶颈在DR。
2. DR(Direct Routing)(http://www.linuxvirtualserver.org/VS-DRouting.html)
只有请求包经过DR,响应包直接由RS发给用户。
DR、RS全部是公网IP。
2.2 DR方式实现原理
1. 假设一个环境:
DR的IP:202.106.1.100(虚拟IP)
RS的IP:192.168.1.1
2.请求响应过程
a) 用户发送一个请求到DR,DR根据算法确定该请求应该调度到RS;
b) DR通过ARP请求找到RS的IP192.168.1.1对应的MAC地址,即可通过2层将该包交给RS;
c) 该请求在RS上解包后,发现IP是DR的IP 202.106.1.100,不会交付给上层?(lo回环上绑定DR的虚拟IP即可);
d) RS处理完请求,发送响应包(此时源IP是DR的IP 202.106.1.100,目的IP是用户的IP),通过lo发送(默认从哪个口进入,从哪个口发出),会发送给自己,造成死循环,包发不出去。
3.现在有2个问题
A) RS的lo上绑定DR的虚拟IP,在通过ARP查找虚拟IP的MAC时,会混乱(有多个主机发回响应,DR、RS都有该IP)。
B) 响应包时,通过lo发送,会发送给自己造成死循环,发不出去。
4. 解决办法
A) 将arp_ignore 设置为1(默认为0)。指定从哪个口进。防止ARP查找虚拟IP的MAC时,产生混乱(有多个虚拟IP)。
B) 将arp_announce设置为2(默认为0)。指定从哪个口出。
2.3 arp_ignore与arp_announce
1. 假设一个环境
网关IP:192.168.0.1
DR的IP:202.106.1.100(虚拟IP)
RS的IP:192.168.1.1(eth0)、10.10.1.1(eth1)、202.106.1.100(lo) 且只有eth0上有网线。
2. arp_ignore(默认为0)
当arp_ignore为0时,用ARP查询192.168.1.1、10.10.1.1、202.106.1.100的MAC时,RS的eth0都会给出响应。
当arp_ignore为1时,只有用ARP查询192.168.1.1的MAC时,RS的eth0才会给出响应。
3. arp_announce(默认为0)
当arp_ignore为0时,从哪个口进入的请求包,其响应包从哪个口出。
当arp_ignore为2时,忽略数据包中的源IP,并尝试选择能与该地址通信的本地地址。(ARP找到网关192.168.0.1的MAC,直接将数据包交给网关)
参考资料:
arp_ignore与arp_announce内核参数:http://suchalin.blog.163.com/blog/static/55304677201022643431355/