Keepalived通过NAT将UDP流量转发到一个节点

Keepalived通过NAT将UDP流量转发到一个节点

我在将 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 节点都运行良好,配置几乎相同。您可以直接将系统日志发送给它们两个,因此它们似乎不是问题所在。

相关内容