我正在尝试设置一个google内部负载均衡器。这个lb后面的实例组由侦听端口6379的redis-server进程组成。在这些redis实例中,只有一个是主实例。
Problem:添加TCP健康检查以检测redis主服务器,并使lb仅将所有流量转移到redis。
Approach:为端口6379添加了TCP检查。为了将命令role发送到redis-server进程并解析响应,我使用了健康检查中提供的可选参数。请查看截图这里。
结果:所有人的健康检查都失败了。如果删除可选的请求/响应参数,健康检查将开始传递给所有人。
调试
role,它按照预期以*3(表示主)和*5(表示从)开始发送响应。nc -l -p 6379开始监听端口6379,以检查在健康检查中实例的一侧确切接收到了什么。它确实接收role\r\n。MONITOR命令,以查看该进程接收的命令的日志。这里没有role日志。这意味着,实例正在通过tcp接收数据(role\r\n),但没有被redis-cli进程(按照MONITOR命令)接收,或者其他事情正在发生。请帮帮忙。发布于 2017-12-05 21:12:06
不幸的是,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的角色命令返回一堆文本。虽然响应中存在子字符串"master“,但它还有一组其他文本,这些文本在安装程序和安装程序之间会有所不同(根据从节点的数量、地址等)。
您肯定应该向GCP提出一个特性请求,以便在响应上进行regex匹配。在此之前,一个可能的解决办法是在每个主机上都有一个小web应用程序,在本地执行"redis-cli role grep master“命令并返回响应。然后,健康检查可以配置为监视这个web应用程序。
https://stackoverflow.com/questions/43228878
复制相似问题