你好,如何使用pymongo运行等效命令? cfg = rs.conf() db.printSlaveReplicationInfo()
1>我怎么用pymongo来运行等效的操作?
a>
cfg = rs.conf()
b>
db.printSlaveReplicationInfo()
2>使用PyMongo,我怎么能获取在创建的集群中其他副本集的CLI输出的详细信息?
(注意:我已经成功创建了集群。现在我正在主节点上写一个Python脚本,检查集群内所有副本集的rs.conf()
和db.printSlaveReplicationInfo()
的输出,并解析这些输出。)
在这方面的任何帮助都非常感谢。
2 个回答
0
我基本上会给你一个提示,而不是直接回答,因为完整的答案就是去写代码。不过你可能不知道,你可以在命令行里做一个简单的事情:
> db.printSlaveReplicationInfo
function () {
var startOptimeDate = null;
function getReplLag(st) {
assert( startOptimeDate , "how could this be null (getReplLag startOptimeDate)" );
print("\tsyncedTo: " + st.toString() );
var ago = (startOptimeDate-st)/1000;
var hrs = Math.round(ago/36)/100;
print("\t" + Math.round(ago) + " secs (" + hrs + " hrs) behind the primary ");
};
function getMaster(members) {
var found;
members.forEach(function(row) {
if (row.self) {
found = row;
return false;
}
});
if (found) {
return found;
}
};
function g(x) {
assert( x , "how could this be null (printSlaveReplicationInfo gx)" )
print("source: " + x.host);
if ( x.syncedTo ){
var st = new Date( DB.tsToSeconds( x.syncedTo ) * 1000 );
getReplLag(st);
}
else {
print( "\tdoing initial sync" );
}
};
function r(x) {
assert( x , "how could this be null (printSlaveReplicationInfo rx)" );
if ( x.state == 1 || x.state == 7 ) { // ignore primaries (1) and arbiters (7)
return;
}
print("source: " + x.name);
if ( x.optime ) {
getReplLag(x.optimeDate);
}
else {
print( "\tno replication info, yet. State: " + x.stateStr );
}
};
var L = this.getSiblingDB("local");
if (L.system.replset.count() != 0) {
var status = this.adminCommand({'replSetGetStatus' : 1});
startOptimeDate = getMaster(status.members).optimeDate;
status.members.forEach(r);
}
else if( L.sources.count() != 0 ) {
startOptimeDate = new Date();
L.sources.find().forEach(g);
}
else {
print("local.sources is empty; is this db a --slave?");
return;
}
}
我喜欢REPL,就像Python有名的REPL一样,你可以直接看到你实现的函数做了什么。
很简单。
1
副本集的配置存储在“local”数据库中的一个叫“system.replset”的集合里。所以,想要查看副本集的配置,类似于运行 rs.conf()
,你可以在 local
数据库里用 db.system.replset.findOne()
来获取,或者在Python中用 find_one()
。
而 db.printSlaveReplicationInfo()
这个命令稍微复杂一点,但你也可以在 local
数据库里找到所有相关的信息。
其实,通过管理员数据库的命令 replSetGetStatus
获取这些信息可能更简单。这个命令会返回一个文档,里面包含了每个副本集成员的操作日志信息,以及其他一些细节。Python的MongoDB驱动 pymongo
提供了一个运行命令的方法,所以你可以在 admin
数据库上运行这个命令,并解析输出,了解每个副本集成员相对于主节点的位置。