你好,如何使用pymongo运行等效命令? cfg = rs.conf() db.printSlaveReplicationInfo()

0 投票
2 回答
1441 浏览
提问于 2025-04-18 03:43

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 数据库上运行这个命令,并解析输出,了解每个副本集成员相对于主节点的位置。

撰写回答