在LVS的DR模式下,有一个必须要处理的问题就是real server上的ARP响应问题。其实,这个问题不只是LVS,其他的L4 Switch方案比如Foundry的ServerIron,也需要设置real server上的ARP响应。因为这是这种方案的结构决定的。
根据LVS官方说明,在LVS 的DR模式下,前端的director接收到用户请求以后,director根据后端real server的负载情况,动态地选择一台real server,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出的real server的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的real server,所以被选出来的那台real server肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。
VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。
从上边的LVS DR工作原理可以看到一个客户端计算机发送一个ARP广播到LVS-DR集群,因为Director和集群节点(真实服务器1)都是连接到相同的网络上的,它们都会接收到ARP广播“是谁的VIP1?”,这个时候我们希望的是只有前端的director来对用户进行响应,其他real server不应该响应用户直接的ARP包。(参考下边两幅图)
因此必须对real server进行一定的处理,使其不响应VIP接口上的ARP请求。在2.6系列的内核中,采用的方式是设置arp_announce和arp_ignore这两个内核参数。
arp_ignore=1,系统只回答目的IP为是本地IP的包。也就是对广播包不做响应。
arp_announce=2,系统忽略IP包的源地址(source address),而根据目标主机(target host),选择本地地址。
而且凡是能收到对VIP ARP广播报文的网口,都需要设置。设置的方法是修改/etc/sysctl.conf文件
net.ipv4.ip_forward = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2