文章目录
一、LVS-DR 数据包流向分析
为方便进行原理分析,将 Client 与群集机器放在同一网络中,数据包流经的路线为 1-2-3-4
- Client 向目标 VIP 发出请求,Director(负载均衡器)接收
- 此时源 MAC 地址为 Client 的 MAC 地址
- 目标 MAC 地址为调度器 Director 的 MAC 地址
- Director 根据负载均衡算法选择 RealServer
- 不修改也不封装 IP 报文,而是将数据帧的 MAC 地址改为 RealServer 的 MAC 地址,然后在局域网上发送
- 此时源 MAC 地址为 Director 的 MAC 地址,目的 MAC 地址为 RealServer 的 MAC 地址
- RealServer 收到这个帧
- 解封装后发现目标 IP 与本机匹配(RealServer 事先绑定了 VIP),于是处理这个报文
- 随后重新封装报文,将响应报文通过 lo 接口传送给物理网卡然后向外发出
- 此时源 MAC 地址为 RealServer 的 MAC 地址,目的 MAC 地址为 Client 的 MAC 地址
- Client 将收到回复的报文
- Client 认为得到正常的服务,而不会知道是哪一台服务器处理的
- 注意:如果跨网段,则报文通过路由器会经由 Internet 返回给用户
二、LVS-DR 中的 ARP 问题
在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址
- 但在局域网中具有相同的 IP 地址,势必会造成各服务器 ARP 通信的紊乱:
- 当 ARP 广播发送到 LVS-DR 集群时,因为负载均衡器和节点服务器都是连接到相同网络上,它们都会接收到 ARP 广播
- 只有前端的负载均衡器进行响应,其他节点服务器不应该响应 ARP 广播
- 这时,我们可以对节点服务器进行处理,使其不响应针对 VIP 的 ARP 请求:
- 使用虚接口 lo:0 承载 VIP 地址
- 设置内核参数 arp_ignore=1(系统只响应目的 IP 为本地 IP 的 ARP 请求)
- RealServer 返回报文(源 IP 是 VIP)经路由器转发,重新封装报文时,需要先获取路由器的 MAC 地址
- 且发送 ARP 请求时,Linux 默认使用 IP 包的源 IP 地址(即 VIP)作为 ARP 请求包中的源 IP 地址,而不使用发送接口的 IP 地址
- 路由器收到 ARP 请求后,将更新 ARP 表项
- 原有的 VIP 对应 Director 的 MAC 地址会被更新为 VIP 对应 RealServer 的 MAC 地址
而路由器根据 ARP 表项,会将新来的请求报文转发给 RealServer,导致 Director 的 VIP 失效上述问题的解决方法:
对节点服务器进行处理,设置内核参数 arp_announce=2(系统不使用 IP 包的源地址来设置 ARP 请求的源地址,而选择发送接口的 IP 地址)
- 解决ARP的两个问题的方法
#修改 /etc/sysctl.conf 文件
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
三、LVS 负载均衡群集-DR模式
1.数据包流量分析
- 客户端发送请求到 Director Server (负载均衡器),请求的数据报文(源 IP 是 CIP, 目标IP是 VIP)到达内核空间
- Di