如何在 HAProxy 中构建 MongoDB 健康检查?

如何在 HAProxy 中构建 MongoDB 健康检查?

这是fastcgi二进制健康检查的示例在 HAProxy 博客上. 我将如何为 MongoDB 构建类似的检查,以便进行更强大的健康检查MongoDB- 验证服务器是否确实存在并响应,而不仅仅是检查端口是否打开?

如果健康检查足够通用,可以与各种MongoDB分片组件(配置服务器、、mongosmongod配合使用,那将会很有用。

答案1

首先,值得注意的是,你必须运行 HAProxy 1.5 或更高版本才能使用tcp-check功能(截至撰写此答案时,1.5.3 是当前稳定版本)。不幸的是,Ubuntu 14.04(例如)附带 1.4 版本,因此您需要从其他来源安装。我个人使用了来自这里的包裹这样我就可以通过 保留所有已安装的内容apt

博客上列出的示例是一个很好的起点。使用它作为模板,我们需要做的就是选择一个合适的命令来运行,然后将该命令分解为十六进制并构建适合 MongoDB 的检查。MongoDB 有线协议已记录并发布,因此理论上您可以根据规范构建它,但有更简单的方法来解构这样的命令。Wireshark它允许您检查 MongoDB 流量,并且它提供了带有突出显示的十六进制的便捷视图,以帮助我们在此进行工作。

我们将在这里使用的命令是ping 命令。正如您所期望的,它旨在轻量级,甚至可以从负载很重的服务器返回,这使其非常适合健康检查命令。如果您想使用其他方法,可以使用相同的方法编写任何此类命令,但始终要小心使用需要任何类型的锁的命令,否则可能会增加数据库的负载。

为了说明如何从运行的命令转到十六进制,下面是我在中突出显示的命令的一个小截图Wireshark,已经解码:

wireshark 中的 ping 命令

基于这些信息,让我们创建TCP健康检查。我将对各个部分进行评论,以解释它们的来源,每个部分都应该很容易在上面的抓取中找到:

option tcp-check
 # MongoDB Wire Protocol
 tcp-check send-binary 39000000 # Message Length (57)
 tcp-check send-binary EEEEEEEE # Request ID (random value)
 tcp-check send-binary 00000000 # Response To (nothing)
 tcp-check send-binary d4070000 # OpCode (Query)
 tcp-check send-binary 00000000 # Query Flags
 tcp-check send-binary 746573742e # fullCollectionName (test.$cmd)
 tcp-check send-binary 24636d6400 # continued
 tcp-check send-binary 00000000 # NumToSkip
 tcp-check send-binary FFFFFFFF # NumToReturn
 # Start of Document 
 tcp-check send-binary 13000000 # Document Length (19)
 tcp-check send-binary 01 # Type (Double)
 tcp-check send-binary 70696e6700 # Ping:
 tcp-check send-binary 000000000000f03f # Value : 1
 tcp-check send-binary 00 # Term

 tcp-check expect string ok

在响应上使用完整的二进制匹配也很好,但不幸的是,没有办法预测服务器为每个响应生成的请求 ID,因此这种完整匹配将失败(没有办法有选择地忽略二进制匹配的片段)。

编辑:2014 年 9 月 8 日感谢来自此问答的评论巴蒂斯特菲利克斯我回去重新测试了部分二进制匹配,但最初似乎失败了 - 看起来这只是我错误地转录了二进制文件以进行响应的情况,所以我修改了答案以反映这一点。

“ok”字符串只是一个 OK 检查 - 任何此类响应都意味着相关服务器仍在响应,但有限的检查有些不令人满意。虽然无法进行完整的响应检查,但请求 ID 之后的所有内容都是可用的。

因此,这里是对响应可用部分进行分解的有效二进制检查,再次使用 Wireshark 梳理出如上所述的各个部分:

# Check for response (starting after request ID)
tcp-check expect binary EEEEEEEE # Response To (from the check above)
tcp-check expect binary 01000000 # OpCode (Reply)
tcp-check expect binary 00000000 # Reply Flags (none)
tcp-check expect binary 0000000000000000# Cursor ID (0)
tcp-check expect binary 00000000 # Starting From (0)
tcp-check expect binary 11000000 # Document Length (17)
tcp-check expect binary 01 # Type (Double) 
tcp-check expect binary 6f6b # ok
tcp-check expect binary 00000000000000f03f # value: 1
tcp-check expect binary 00 # term

以上所有内容均已使用 MongoDB 2.6.4 和 HAProxy 1.5.3 成功测试

答案2

Adam 的答案是正确的,程序也是我使用的。话虽如此,不确定响应是否正确,因为服务器也应该回答二进制字符串。Adam,你能确认它适用于你的例子吗?否则,匹配 6f6b 也应该可以解决问题:

tcp-check 期望二进制 6f6b

巴蒂斯特

相关内容