【问题标题】:Health check to detect redis master from google tcp load balancer从 google tcp 负载均衡器检测 redis master 的健康检查
【发布时间】:2017-08-30 22:21:26
【问题描述】:

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

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

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

结果:所有人的健康检查都失败了。如果我删除可选的请求/响应参数,健康检查就会开始为所有人通过。

调试

  1. 使用 netcat 连接到 lb 并发出命令role,它按预期发送以*3(用于主设备)和*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 命令)没有接收到数据,或者正在发生其他事情。请帮忙。

【问题讨论】:

  • 你弄明白了吗?
  • 你的redis-server监听哪个IP?仅外部 IP 或仅内部 IP 或 0.0.0.0?
  • 作为一种解决方法,您可以尝试在实例上运行一个代理监听 6380 并将流量转发到 127.0.0.1:6379 上的 redis-server 吗?
  • @Dagang 由于健康检查通过,请求和响应字段中没有任何字符串,这表明负载均衡器能够连接到 6379,因此可以访问。

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


【解决方案1】:

很遗憾,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 命令返回一堆文本。虽然响应中出现了子字符串“master”,但它还有一堆其他文本,这些文本会因设置而异(基于从属设备的数量、它们的地址等)。

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

【讨论】:

  • 感谢您的回答和解决方法。您对健康检查响应匹配限制的观察是正确的,我之前也注意到了这一点。事实上,tcp lb 创建屏幕期间的帮助文本 - An optional ASCII value that will be matched against the beginning of the received data. By default response is empty, which means that any response indicates health. 欺骗了我,让我相信它可能只是通过匹配响应的开头来工作,所以我想通过试验来验证这一点。
  • 但是在跟踪过程中,观察到了一个意想不到的行为,这成为我在这里发布问题的原因。请注意我的调试点 3,我指出应该记录 role 命令。
  • @Yadvendar,您正在运行哪个版本的 REDIS。 2.8.12 新增“角色”命令。如果您有旧版本,则不支持该命令,因此不会被记录。
  • Redis 版本为 2.8.17
猜你喜欢
  • 2021-04-20
  • 2020-01-12
  • 2013-04-11
  • 1970-01-01
  • 2016-08-05
  • 2021-08-14
  • 2019-08-27
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多