【发布时间】:2016-10-16 19:12:49
【问题描述】:
我需要为 Docker 容器内的 MongoDB 实例创建健康检查。
虽然我可以通过 CLI 解决并使用 Mongo Ping,但最好的选择是创建一个简单的 HTTP 或 TCP 测试。标准 ping 测试默认 27017 端口无响应。
有什么值得信赖的方法吗?
【问题讨论】:
我需要为 Docker 容器内的 MongoDB 实例创建健康检查。
虽然我可以通过 CLI 解决并使用 Mongo Ping,但最好的选择是创建一个简单的 HTTP 或 TCP 测试。标准 ping 测试默认 27017 端口无响应。
有什么值得信赖的方法吗?
【问题讨论】:
我为 mongodb 创建了一个简单的健康检查,它使用mongo 客户端向服务器发送一个简单的查询请求(例如db.stats())。
$ mongo 192.168.5.51:30000/test
MongoDB shell version: 3.2.3
connecting to: 192.168.5.51:30000/test
mongos> db.stats()
{
"raw" : {
"set1/192.168.5.52:27000,192.168.5.53:27000" : {
"db" : "test",
"collections" : 8,
"objects" : 50,
"avgObjSize" : 73.12,
"dataSize" : 3656,
"storageSize" : 53248,
"numExtents" : 8,
"indexes" : 8,
"indexSize" : 65408,
"fileSize" : 469762048,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 6
},
"extentFreeList" : {
"num" : 28,
"totalSize" : 184807424
},
"ok" : 1
}
},
"objects" : 50,
"avgObjSize" : 73,
"dataSize" : 3656,
"storageSize" : 53248,
"numExtents" : 8,
"indexes" : 8,
"indexSize" : 65408,
"fileSize" : 469762048,
"extentFreeList" : {
"num" : 28,
"totalSize" : 184807424
},
"ok" : 1
}
你也可以在一行中做到这一点:
$ echo 'db.stats().ok' | mongo 192.168.5.51:30000/test --quiet
1
希望对你有所帮助。
更新:
正如@luckydonald 所说,ping 命令更好,所以你可以这样做:
$ mongo --eval 'db.runCommand("ping").ok' localhost:27017/test --quiet
1
感谢@luckydonald。
【讨论】:
mongo二进制文件,而不是本地的?
一种解决方案是使用以脚本语言编写的最小 MongoDB 客户端,在您的容器中有解释器。
例如,这里有一个 Python 中的零依赖:mongo_ping_client.py
【讨论】:
如果您只需要一个简单的“ping”,那么您也可以使用curl:
curl --connect-timeout 10 --silent --show-error hostname:27017
如果您收到“错误”It looks like you are trying to access MongoDB over HTTP on the native driver port.,那么您的 MongoDB 正在运行并回复答案。
或使用其中之一
mongo --norc --quiet --host=hostname:27017 <<< "db.getMongo()"
mongo --norc --quiet --host=hostname:27017 --eval "db.getMongo()"
echo "db.getMongo()" | mongo --norc --quiet --host=hostname:27017
db.stats() 的一个好处是:命令 db.getMongo() 无需身份验证即可工作,即您不需要任何凭据。
【讨论】: