使用自定义健康检查负载平衡 UDP 系统日志

load balance UDP syslog with custom health check

我设置了 Nginx Plus 来负载平衡 UDP 系统日志流量。这是来自 nginx.conf 的片段:

stream {

    upstream syslog_standard {
        zone syslog_zone 64k;
        server cp01.woolford.io:1514 max_fails=1 fail_timeout=10s;
        server cp02.woolford.io:1514 max_fails=1 fail_timeout=10s;
        server cp03.woolford.io:1514 max_fails=1 fail_timeout=10s;
    }

    server {
        listen 514 udp;
        proxy_pass syslog_standard;
        proxy_bind $remote_addr transparent;
        health_check udp;
    }

}

听说 NGINX Plus 可以对 UDP 执行健康检查,我有点惊讶,因为 UDP 在设计上是不可靠的。由于 UDP 中没有确认,消息实际上进入了黑洞。

我正在尝试建立一个有点容错和可扩展的系统日志摄取管道。应该通过运行状况检查来检测节点丢失,并暂时从可用服务器列表中删除。

尽管进行了 UDP 健康检查,但这并没有奏效。我认为 UDP 健康检查仅适用于响应调用者的服务(例如 DNS)。由于 syslog 没有响应,因此无法检查错误,例如使用 match.

接收系统日志消息的进程侦听端口 1514,并在端口 8073 上有一个 REST 接口:

如果摄取过程是健康的 GET 请求到端口 8073 上的 /connectors/syslog/status returns:

{
  "name": "syslog",
  "connector": {
    "state": "RUNNING",
    "worker_id": "10.0.1.41:8073"
  },
  "tasks": [
    {
      "id": 0,
      "state": "RUNNING",
      "worker_id": "10.0.1.41:8073"
    }
  ],
  "type": "source"
}

我想创建一个自定义检查以查看摄取是 运行。 NGINX Plus 可以吗?我们可以在完全不同的端口上检查健康状况吗?

这是我做的:

stream {

    upstream syslog_standard {
        zone syslog_zone 64k;
        server cp01.woolford.io:1514 max_fails=1 fail_timeout=10s;
        server cp02.woolford.io:1514 max_fails=1 fail_timeout=10s;
        server cp03.woolford.io:1514 max_fails=1 fail_timeout=10s;
    }

    match syslog_ingest_test {
        send      "GET /connectors/syslog/status HTTP/1.0\r\nHost: localhost\r\n\r\n";
        expect ~* "RUNNING";
    }

    server {
        listen 514 udp;
        proxy_pass syslog_standard;
        proxy_bind $remote_addr transparent;
        health_check match=syslog_ingest_test port=8073;
    }

}

match=syslog_ingest_test 健康检查在端口 8073(即包含摄取过程的健康检查端点的端口)向 URL 执行 GET 请求并确认它是 运行 .

我可以切换服务 off/on,NGINX 会检测到它并做出相应的反应。