Java检测MongoDB集群节点健康状态
in 默认分类 with 0 comment

Java检测MongoDB集群节点健康状态

in 默认分类 with 0 comment

背景

因为复制集的存在,导致某个节点挂了,但会不影响到整个集群的工作,所以项目里需要用Java去检测MongoDB集群里各个节点的健康状态,项目使用的是SpringBoot框架,用了MongoTemplate。
MongoDB查看集群状态的命令为:

rs.status();

MongoTemplate无法执行该命令,只能执行JSON格式的语句执行,后看到有个JSON格式的语句可以实现查看集群状态,命令如下:

db.adminCommand( { replSetGetStatus: 1 } )

虽然MongoTemplate可以用executeCommand进行去执行JSON格式的语句,但该语句仅支持在admin库下查询,其他业务库无法执行。考虑到配置多数据源太复杂了,于是打算单独连接admin数据库进行该语句的查询。

代码实现

        try{
            MongoClientURI mongoClientURI = new MongoClientURI("需要在admin有权限的账号进行认证");
            MongoClient mongoClient = new MongoClient(mongoClientURI);
            MongoDatabase admin = mongoClient.getDatabase("admin");
            Document document = new Document();
            document.append("replSetGetStatus", 1);
            Document result = admin.runCommand(document);
            JSONArray jsonArray = JSONObject.parseObject(result.toJson()).getJSONArray("members");
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                if (jsonObject.getInteger("health") != 1){
                    // 复制集内该节点不健康
                }
            }
        }catch(Exception e){
            // 数据库异常,整个集群都连接不上
        }
Responses