使用自定义健康检查负载平衡 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 会检测到它并做出相应的反应。
我设置了 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 会检测到它并做出相应的反应。