2017-04-05 69 views
3

我试图建立一个谷歌的TCP内部负载平衡器检测Redis的主人。在这个lb后面的实例组由在端口6379上侦听的redis-server进程组成。在这些redis实例中,只有其中一个是master。健康检查从谷歌TCP负载平衡器

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

方法: 增加了TCP健康检查端口6379. 为了发送命令role到Redis的服务器进程和解析响应,我正在使用的健康检查提供的可选PARAMS。请检查截图here

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

调试

  1. 连送到LB使用netcat的和发出的命令role,将其作为预期开始*3(对主)和*5(用于从站)的响应。
  2. 登录到实例并停止redis-server进程。使用nc -l -p 6379开始在端口6379上进行侦听,以检查实例端在健康检查中究竟收到了什么。它确实收到role\r\n
  3. 步骤2中,重新启动redis的服务器之后和在redis的-CLI跑MONITOR命令,观看由该方法接收的命令的日志。这里没有日志role。 这意味着,例如在接收通过TCP的数据(role\r\n),但不被处理redis的-CLI接收到的(按照MONITOR命令)或别的东西正在发生。请帮忙。
+0

你有没有设法弄清楚? – shaharmor

+0

你的redis服务器在哪个IP上监听?仅限外部IP或仅限内部IP或0.0.0.0? – Dagang

+0

作为一种变通方法,您可以尝试在实例中运行的6380代理收听并转发流量到Redis的服务器上127.0.0.1:6379? – Dagang

回答

5

不幸的是,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 role | grep master”命令的主机上都有一个小型web应用程序,并返回响应。然后可以配置运行状况检查以监视此Web应用程序。

+0

感谢您的答案和解决方法。你对健康检查的反应匹配的限制的观察是正确的,我也注意到了。实际上,tcp lb创建屏幕中的帮助文本显示 - “一个可选的ASCII值,它将与接收到的数据的开头匹配。默认情况下响应是空的,这意味着任何响应都表明健康。“这使我相信它可能只是通过匹配响应的开始而工作,所以我想通过试验来验证。 – Yadvendar

+0

但在追踪期间,观察到意外的行为,并成为我在此发布问题的原因。请注意我的调试点3,我指出应该记录'role'命令。 – Yadvendar

+0

@Yadvendar,您运行的是REDIS的哪个版本。在2.8.12中增加了“角色”命令。如果您的版本较旧,则不支持该命令,因此不会被记录。 –

相关问题