【问题标题】:Simple HTTP/TCP health check for MongoDBMongoDB 的简单 HTTP/TCP 健康检查
【发布时间】:2016-10-16 19:12:49
【问题描述】:

我需要为 Docker 容器内的 MongoDB 实例创建健康检查。

虽然我可以通过 CLI 解决并使用 Mongo Ping,但最好的选择是创建一个简单的 HTTP 或 TCP 测试。标准 ping 测试默认 27017 端口无响应。

有什么值得信赖的方法吗?

【问题讨论】:

    标签: mongodb http tcp


    【解决方案1】:

    我为 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二进制文件,而不是本地的?
    • This comment 警告: 请注意,dbstats 在运行时会阻塞您的数据库,因此它不适合在生产环境中使用。 jira.mongodb.org/browse/SERVER-5714
    • 一个不错的选择可能是ping 命令。正如您所料,它旨在实现轻量级,甚至可以从负载较重的服务器返回,这使其非常适合运行状况检查命令?。在 pymongo 中是 db.command('ping'),返回 {'ok': 1}。
    • Tks 伙计们,我使用的是 db.stats() 但现在我将切换到 ping 命令。
    【解决方案2】:

    一种解决方案是使用以脚本语言编写的最小 MongoDB 客户端,在您的容器中有解释器。

    例如,这里有一个 Python 中的零依赖:mongo_ping_client.py

    【讨论】:

      【解决方案3】:

      如果您只需要一个简单的“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() 无需身份验证即可工作,即您不需要任何凭据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 2014-10-02
        • 2021-09-13
        相关资源
        最近更新 更多