背景
因为复制集的存在,导致某个节点挂了,但会不影响到整个集群的工作,所以项目里需要用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){
// 数据库异常,整个集群都连接不上
}
本文由 visionki 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 12, 2021 at 10:16 am