Too young, too simple. Sometimes, naive & stupid

直接使用路由的负载均衡

直接路由允许真实的服务器直接处理和路由数据包到请求用户,而不是通过LVS路由器传递传出数据包。直接路由器要求真实服务器通过LVS路由器物理连接到网段,并且能够处理和定向传输数据包。

网络布局

​ 在直接路由器负载均衡配置中,LVS路由器需要接收传入请求并将它们路由到适当的真实服务器以进行处理。然后真正的服务器需要直接将相应路由到客户端。因此,例如,如果客户端在Internet上,并通过LVS路由将数据包发送到真实服务器,则真实服务器必须能够通过Internet直接连接到客户端。这可以通过为真实服务器配置网关以将数据包传递到Internet来完成。服务器池中的每个真实服务器都可以拥有自己独立的网关(并且每个网关都是有自己的Internet),对与典型的LoadBalancer设置,真实服务器可以通过一个网关进行通信。

使用arptables进行直接路由

为了使用arptables配置直接路由,每个真实服务器必须配置其虚拟ip地址,以便他们可以直接路由数据包。真实服务器完全忽略对VIP的ARP请求,并且可能以其他方式发送包含VIP的任何ARP数据包破坏以包含真实服务器的IP而不是VIP。

使用arptables,应用程序可以绑定到真实服务器正在服务的每个单独的VIP端口。例如arptables允许多个HTTP Server实例运行并明确绑定到系统上的不同VIP。

要配置每个真实服务器可以忽略每个虚拟IP地址的ARP请求,执行以下步骤:

  1. 为每个真实服务器上的每个虚拟IP地址创建ARP表条目(real_ip是导向器用来与真实服务器通信的IP;通常这是绑定到eth0的IP):

    1
    2
    arptables -A IN -d <virtual_ip> -j DROP
    arptables -A OUT -s <virtual_ip> -j mangle --mangle-ip -s <real_ip>

    这将导致真实服务器忽略对虚拟IP地址的所有ARP请求,并更改可能包含虚拟IP的任何传出ARP响应,以便他们包含服务器的真实IP。应响应任何VIP的ARP请求的唯一节点是当前活动的LVS节点。

  2. 在每个真实服务器上完成此操作后,通过在每个真实服务器上键入以下命令来保存ARP表条目:

    1
    2
    arptables-save > /etc/sysconfig/arptables
    systemctl enable arptables.service
  3. 使用 ip addr创建IP别名在所有真实服务器上配置虚拟IP地址。

    1
    ip addr add 192.168.76.24 dev eth0
  4. 配置Keepalived以进行直接路由。通过配置keepalived.conf;来完成。

使用firewalld直接路由

可以使用firewalld创建防火墙规则来避免ARP问题。要配置直接路由,请添加创建透明代理的规则,以便真实服务器将为发送到VIP地址的数据包提供服务,即使系统上不存在VIP也是如此。

这种方法比arptables更简单。此方法还完全绕过LVS ARP问题,因为虚拟IP地址仅存在于活动LVS控制器上。

但是,相比arptables,使用直接路由方法存在性能问题,因为在转发中存在开销,比如IP伪装,每个返回数据包。

也无法直接路重用端口。例如,无法运行绑定到80端口的两个单独HTTP Server服务。因为两者必须绑定到INADDR_ANY而不是虚拟IP地址。

要使用firewalld配置直接路由,执行以下步骤:

  1. 为从LVS接收数据包的网络接口区域启用IP伪装。例如,对于external区域:

    1
    firewall-cmd --zone=external --add-masquerade --permanent

    如果省略zone,则使用默认区域。--permanent选项使设置保持不变,但该命令在下次启动时生效。立即生效,请加--permanent参数。

  2. 对于要由真实服务器提供服务的每个VIP,端口和协议(TCP或UDP)组合,请按照以下格式输入命令:

    1
    firewall-cmd --zone=zone --add-forward-port=port=port_number:proto=protocol:toport=port_number:toaddr=virtual_IP_address

    例如,要将TCP端口80上的流量配置为重定向到端口3753,请执行以下操作192.168.10.10

    1
    firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=3753:toaddr=192.168.10.10 --permanent

    此命令将真实服务器处理发往他们的VIP端口的数据包。

  3. 确保firewald运行:

    1
    systemctl enable firewalld && systemctl start firewalld

使用iptables直接路由

也可以通过创建iptables规则解决ARP问题。要使用iptables配置直接路由,必须添加创建透明代理的规则,以便真实服务器将服务发送到VIP地址的数据包,即使系统上不存在VIP地址。

要使用该iptables方法配置直接路由,请执行以下步骤:

  1. 在每个真实服务器上,要为真实服务器提供服务的每个VIP,端口和协议组合输入一下命令:

    1
    iptables -t nat -A PREROUTE -p <tcp|udp> -d <vip> --dport <port> -j REDIRECT

    此命令将使真实服务器处理发往它们的VIP和端口的数据包。

  2. 在每个真实服务器上保存配置:

    1
    2
    iptables-save > /etc/syconfig/iptables
    systemctl enable iptables.service

使用sysctl直接路由

采用直接路由时处理ARP限制的另一种方法是使用sysctl。可以配置两个sysctl设置,使真实服务器不会再ARP请求中宣布VIP,也不会回复VIP请求的VIP地址。要启用此功能:

1
2
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

或者,将下面内容添加到/etc/sysctl.d/arp.conf文件中:

1
2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2