mongodb分片集群从mongos内部进行快速健康检查



如果sharded集群中的所有shard-replicaSet成员都是活动的,有人知道从mongos识别的选项吗?

例如,我可以检查配置的非隐藏成员有哪些:

sh.status()

但是,我不知道如何检查所有的shard成员是否都是活动的和可选择的,我不想单独访问所有replicaSet的(想象一下,如果我有100个shard,我不希望执行100次rs.status((,有这样的选项吗?最好的做法是什么?

感谢

使用这样的函数:

function printClusterStatus(MONGO_PASSWROD) {
if (db.hello().msg != "isdbgrid") return; // not a sharded cluster
const user = db.runCommand({ connectionStatus: 1 }).authInfo.authenticatedUsers.shift().user;
const map = db.adminCommand("getShardMap").map;
try {
for (let rs of Object.keys(map)) {
let uri = map[rs].split("/");
let connectionString = "mongodb://" + `${user}:${MONGO_PASSWROD}@${uri[1]}/admin?replicaSet=${uri[0]}&authSource=admin`;
let replicaSet = Mongo(connectionString).getDB("admin");
for (let member of replicaSet.adminCommand({ replSetGetStatus: 1 }).members) {
// replicaSet.hello().isWritablePrimary  could be also useful
if (!replicaSet.hello().hosts.includes(member.name)) continue; // skip Arbiter, hidden members, etc.
if (member.health != 1 || !Array("PRIMARY", "SECONDARY").includes(member.stateStr)) {
print(`ERROR in shard ${rs}: Member state of ${member.name} is '${member.stateStr}'`);
}
}
}
} catch (err) {
print(tojsononeline(err));
}
}
printClusterStatus("secret")

最新更新