如何在 HAProxy 中构建 MongoDB Health Check?

Ada*_*m C 4 load-balancing haproxy mongodb

有一个fastcgi二进制健康检查的例子在HAProxy的博客。我将如何为 MongoDB 构建一个类似的检查,以便我对它进行更强大的健康检查MongoDB- 一个验证服务器实际上在那里并做出响应而不是仅仅检查端口是否打开的检查?

如果运行状况检查足够通用以与各种MongoDB分片组件(配置服务器、mongosmongod)一起使用,这将非常有用。

Ada*_*m C 7

首先,值得注意的是,您必须运行 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
Run Code Online (Sandbox Code Playgroud)

对响应使用完整的二进制匹配也会很好,但不幸的是,无法预测服务器为每个响应生成的请求 ID,因此这样的完整匹配将失败(无法有选择地忽略部分二进制匹配)。

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

“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
Run Code Online (Sandbox Code Playgroud)

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