networking - 从 google tcp 负载均衡器检测 redis master 的健康检查

标签 networking tcp redis load-balancing google-compute-engine

我正在尝试设置一个 google TCP 内部负载平衡器。这个 lb 后面的实例组由监听端口 6379 的 redis-server 进程组成。在这些 redis 实例中,只有一个是 master。

问题:添加一个 TCP 健康检查来检测 redis master 并使 lb 将所有流量仅转移到 redis master。

方法: 为端口 6379 添加了 TCP 健康检查。 为了将命令 role 发送到 redis-server 进程并解析响应,我使用了运行状况检查中提供的可选参数。请查看截图here .

结果:所有健康检查均失败。如果我删除可选的请求/响应参数,健康检查将开始通过。

调试:

  1. 使用 netcat 连接到 lb 并发出命令 role,它发送以 *3(对于 master)和 *5 开头的响应(对于奴隶)如预期的那样。
  2. 登录实例并停止 redis-server 进程。使用 nc -l -p 6379 开始监听端口 6379,以检查在健康检查中实例端究竟收到了什么。它确实接收 role\r\n
  3. 在第 2 步之后,重新启动 redis-server 并在 redis-cli 中运行 MONITOR 命令,以查看此进程收到的命令日志。这里没有role的日志。 这意味着,实例正在通过 tcp 接收数据(role\r\n),但进程 redis-cli(根据 MONITOR 命令)或其他方式未接收到数据正在发生。请帮忙。

最佳答案

不幸的是,GCP 的 TCP 健康检查在响应中可以检查的内容上非常有限。来自 https://cloud.google.com/sdk/gcloud/reference/compute/health-checks/create/tcp :

--response=RESPONSE
 An optional string of up to 1024 characters that the health checker expects to receive from the instance. If the response is not received exactly, the health check probe fails. If --response is configured, but not --request, the health checker will wait for a response anyway. Unless your system automatically sends out a message in response to a successful handshake, only configure --response to match an explicit --request.

请注意帮助消息中的“完全正确”一词。响应必须完全匹配提供的字符串。不能指定要在响应中搜索的部分字符串。

正如您在 https://redis.io/commands/role 上看到的那样,redis的ROLE命令返回一堆文本。尽 pipe 字符串“master”出现在响应中,但它还有一堆其他文本,这些文本会因设置而异(基于从站的数量、地址等)。

您绝对应该向 GCP 提出功能请求,以便在响应中进行正则表达式匹配。一个可能的解决方法是在每台主机上安装一个小的网络应用程序,在本地执行“redis-cli role | grep master”命令并返回响应。然后可以配置运行状况检查来监控此 Web 应用。

关于networking - 从 google tcp 负载均衡器检测 redis master 的健康检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43228878/

相关文章:

javascript - 我可以直接用 JavaScript 连接 Redis 吗?

networking - 为什么wireshark检测不到我的接口(interface)?

networking - 为什么Broid默认不显示YouTube流量

python - SO_REUSEPORT 可以用在 Unix 域套接字上吗?

java - 过期的 Redisson key 在 Redis Cli 中仍然可见

javascript - 我如何使用 javascript 更新房间 url 的时间计数器?

java - 一旦到达流结尾,是否应该显式关闭连接?

networking - 如何在Windows Azure虚拟机上打开非标准端口

javascript - Net.Socket 实例不会在 NodeJS 中消失

linux - 将 AWK TCP 连接绑定(bind)到某个 IP