簡體   English   中英

嗨,我如何使用pymongo運行同等功能? cfg = rs.conf()db.printSlaveReplicationInfo()

[英]Hi, How do I run the equivalent using pymongo? cfg = rs.conf() db.printSlaveReplicationInfo()

1>如何使用pymongo運行等效項?

一>

cfg = rs.conf()

b>

db.printSlaveReplicationInfo()

2>使用PyMongo,如何在創建的集群中獲取其他副本集CLI輸出的詳細信息。 (注意:我已經成功創建了集群。只需要在primary中編寫一個python腳本來檢查集群內所有副本集中rs.conf()db.printSlaveReplicationInfo()的輸出並解析輸出。)

在這方面的任何幫助都是極大的。

副本集配置存儲在名為“ rs.conf() ”的集合中的“本地”數據庫中,因此當db為local或其等效的find_one() db.system.replset.findOne()時, rs.conf()的等效項為rs.conf()find_one()

db.printSlaveReplicationInfo()涉及更多,但是您也可以在local數據庫中獲取所有這些信息。

通過管理數據庫命令replSetGetStatus可以更輕松地獲取它,該命令返回包含副本集每個成員的oplog信息以及其他詳細信息的文檔。 Python MongoDB驅動程序pymongo 提供了一種運行命令的方法 ,因此您可以針對admin數據庫運行該方法,並解析輸出以獲取有關副本集每個成員相對於主要副本的位置的信息。

我基本上會給您一個提示,而不是直接回答,因為完整的答案是簡單地編寫代碼。 但是您可能不知道可以在shell中執行以下簡單操作:

> 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一樣,您可以僅轉儲已實現函數的功能。

Simples。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM