![Keepalived通过NAT将UDP流量转发到一个节点](https://linux22.com/image/728106/Keepalived%E9%80%9A%E8%BF%87NAT%E5%B0%86UDP%E6%B5%81%E9%87%8F%E8%BD%AC%E5%8F%91%E5%88%B0%E4%B8%80%E4%B8%AA%E8%8A%82%E7%82%B9.png)
我在将 UDP Syslog 负载平衡到我的 Graylog 集群节点时遇到了问题。起初一切似乎都正常,但似乎 99% 的流量都流向了两个节点之一。
我有两台运行 Keepalived 1.3.9 的 Ubuntu 服务器 (18.04)。它们共享通过 VRRP 共享的虚拟 IP。它们使用 NAT 基于循环将流量转发到真实服务器。
global_defs {
notification_email {
redacted@mail
}
notification_email_from severname-redacted
smtp_server mailsever.redacted
smtp_connect_timeout 30
router_id servername
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 216
priority 200
advert_int 1
preempt_delay 30
virtual_ipaddress {
10.18.242.216
}
notify /usr/local/bin/vrrp_state.sh
}
virtual_server 10.18.242.216 10514 {
delay_loop 2
protocol UDP
lb_algo rr # round robin
lb_kind NAT # NAT
real_server 10.18.242.214 10514 {
weight 1
HTTP_GET {
url {
path "/api/system/lbstatus"
status_code 200
}
connect_timeout 3
connect_port 9000
}
}
real_server 10.18.242.213 10514 {
weight 1
HTTP_GET {
url {
path "/api/system/lbstatus"
status_code 200
}
connect_timeout 3
connect_port 9000
}
}
}
辅助负载均衡器使用相同的配置,只是优先级为 100。
负载均衡器之间的故障转移按预期工作,但它们似乎都只将流量转发到第一个 Graylog 节点:
oot@redacted-lb1:~# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
UDP 10.18.242.216:10514 0 57 0 16581 0
-> 10.18.242.213:10514 0 67 0 19666 0
-> 10.18.242.214:10514 0 0 0 0 0
如您所见,即使权重相等且我们使用循环调度,辅助 Graylog 节点也没有流量。一些无效的故障排除:
- 从负载均衡器中删除第一个节点后,您会看到流量仍然到达 LB,但不会转发到 Graylog 节点
- 改变体重似乎没有效果
- 重新启动所有服务器
- 通过关闭 LB1 在辅助 LB 上执行所有相同的测试。
Graylog 节点都运行良好,配置几乎相同。您可以直接将系统日志发送给它们两个,因此它们似乎不是问题所在。