【发布时间】: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。
结果:所有人的健康检查都失败了。如果我删除可选的请求/响应参数,健康检查就会开始为所有人通过。
调试:
- 使用 netcat 连接到 lb 并发出命令
role,它按预期发送以*3(用于主设备)和*5(用于从设备)开头的响应。 - 登录到实例并停止 redis-server 进程。开始使用
nc -l -p 6379在端口 6379 上侦听,以检查运行状况检查中实例端接收到的确切内容。它确实收到了role\r\n。 - 在第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