运行状况检查以从google tcp负载均衡器检测redis master

时间:2017-04-05 10:43:26

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

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

问题:添加TCP运行状况检查以检测redis主服务器,并使lb仅将所有流量转移到redis主服务器。

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

结果:健康状况检查失败。如果我删除了可选的请求/响应参数,则健康状况检查将开始传递给所有人。

调试

  1. 使用netcat连接到lb并发出命令role,它会按预期发送以*3(对于master)和*5(对于slave)开头的响应。
  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命令)接收或发生其他事情。请帮忙。

1 个答案:

答案 0 :(得分:6)

不幸的是,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命令会返回一堆文本。虽然子串"掌握"在响应中存在,它还有一堆其他文本,从设置到设置会有所不同(基于从属数量,地址等)。

您绝对应该使用GCP提出功能请求,以便在响应上进行正则表达式匹配。在此之前可能的解决方法是在每个执行" redis-cli角色的主机上安装一个小型Web应用程序grep master"在本地命令并返回响应。然后可以配置运行状况检查以监视此Web应用程序。