我正在家里的实验室里摆弄 iptables。我的第一个目标是将我的活动目录通信纳入一个负载平衡虚拟 IP。我使用预路由链来实现这一点。出于测试目的,我只从 DNS 服务开始。我的规则如下:
-A PREROUTING -d 10.0.0.1 -p udp --dport 53 -j DNAT --to-destination 192.168.2.1:53
-A PREROUTING -d 10.0.0.1 -p udp --dport 53 -j DNAT --to-destination 192.168.2.2:53
10.0.0.1
是所需的 VIP 地址。192.168.2.1
是192.168.2.2
DC 服务器。
VIP 本身可以工作,我得到了 DNS 响应。但是,如果我断开第一个 DC 的网卡,DNS 响应就会超时。我检查了一下,它本身192.168.2.2
可以工作,所以这不是服务器的故障。
我知道这是因为我的规则从技术上来说不做负载平衡,也不做故障转移。它失败是因为它只通过了第一条规则。我尝试在一条规则中设置 IP 范围,但也没有帮助。
另外,尝试了统计概率和 nth 或套接字等方法,但都没有起作用。
iptables 中是否有任何模块可以解决这种情况?
答案1
是的,有可能。CLUSTERIP
目标是专门为此设计的。
它的配置方式是分配相同的所有节点均分配 IP 地址,但每个节点仅处理大约 1/N 的所有连接的过滤访问。其设计使得如果 N 个节点配置了所有相同的设置(--local-node
取值 0、1、...、N-1),则所有连接都得到处理 — 每个连接将分配给一个且仅分配给一个节点。
但是,仅靠它是不够的。当节点关闭时,任何人都不会考虑它应该处理的连接份额。要解决这个问题,所有剩余节点都需要使用新的--total-nodes
和值重新配置--local-node
。因此,它不是设计为手动运行的。您需要一些代理来不断检查所有节点并动态重新配置所有节点上的 CLUSTERIP。
通常使用 Pacemaker + Corosync 集群堆栈,其中有 ClusterIP 代理来控制这种负载平衡。它将完成所有脏活:检查哪些节点处于活动状态,配置 iptables 规则;它还可以做更多,例如将“活动”定义为“Apache 服务正在运行并接受连接”。总体而言,Pacemaker 是非常强大的集群堆栈。
由于此模块无法考虑节点的实际负载,因此它不常用于终端服务。但是,如果您想要拥有多个更高级别的负载平衡 HAProxy 或 Nginx 节点,以智能地平衡实际的 Web(或其他)后端,为了使平衡器场本身具有高可用性,您可以为它们设置 CLUSTERIP 样式的负载平衡。