mongodb 从 mongos 内部进行分片集群快速健康检查?
mongodb sharded cluster fast health check from inside mongos?
如果分片集群中的所有分片副本集成员都活着,有人知道从 mongos 识别的选项吗?
例如,我可以检查配置的非隐藏成员是什么:
sh.status()
但是,我不知道如何检查所有分片成员是否都活着并且可以选择,我不想单独访问所有 replicaSet(想象一下,如果我有 100 个分片,我不想执行 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")
如果分片集群中的所有分片副本集成员都活着,有人知道从 mongos 识别的选项吗?
例如,我可以检查配置的非隐藏成员是什么:
sh.status()
但是,我不知道如何检查所有分片成员是否都活着并且可以选择,我不想单独访问所有 replicaSet(想象一下,如果我有 100 个分片,我不想执行 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")