Mongodb副本集 - 总是显示" syncingTo"

时间:2016-05-04 21:13:02

标签: mongodb

我有一个3成员副本集,Mongo 3.0.8版。它在AWS-EC2上的Linux实例上运行。这是rs.status()输出:

rs.status()
{
        "set" : "s-1",
        "date" : ISODate("2016-05-04T20:52:26.279Z"),
        "myState" : 2,
        "syncingTo" : "MongoA:27017",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "MongoB:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 14809,
                        "optime" : Timestamp(1462382654, 1),
                        "optimeDate" : ISODate("2016-05-04T17:24:14Z"),
                        "lastHeartbeat" : ISODate("2016-05-04T20:52:25.620Z"),
                        "lastHeartbeatRecv" : ISODate("2016-05-04T20:52:25.635Z"                     ),
                        "pingMs" : 0,
                        "syncingTo" : "MongoC:27017",
                        "configVersion" : 1
                },
                {
                        "_id" : 1,
                        "name" : "MongoA:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 14852,
                        "optime" : Timestamp(1462382654, 1),
                        "optimeDate" : ISODate("2016-05-04T17:24:14Z"),
                        "lastHeartbeat" : ISODate("2016-05-04T20:52:24.506Z"),
                        "lastHeartbeatRecv" : ISODate("2016-05-04T20:52:24.493Z"                     ),
                        "pingMs" : 9,
                        "electionTime" : Timestamp(1462380294, 1),
                        "electionDate" : ISODate("2016-05-04T16:44:54Z"),
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "MongoC:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 89095,
                        "optime" : Timestamp(1462382654, 1),
                        "optimeDate" : ISODate("2016-05-04T17:24:14Z"),
                        "syncingTo" : "MongoA:27017",
                        "configVersion" : 1,
                        "self" : true
                }
        ],
        "ok" : 1
}

我使用此命令从单独的(测试)服务器(不是其中一个Mongo实例)通过命令行连接到Mongo:

mongo --host MongoA:27017,MongoB:27017,MongoC:27017

我设置了AWS安全组,以便副本集的所有成员都是安全组的成员,并且端口27017对所有副本集成员以及我的测试服务器都是开放的。

每当我通过命令行连接时,我总是连接到SECONDARY服务器(从不是PRIMARY)。从我所读到的内容来看,这与副本集仍然是同步的事实有关。

我的问题是为什么它总是处于同步状态?是否存在阻止集合成员同步的内容(例如访问特定端口或其他内容)?

感谢任何帮助或建议,谢谢。

1 个答案:

答案 0 :(得分:5)

  

我的问题是为什么它总是处于同步状态?是否存在阻止集合成员同步的内容(例如访问特定端口或其他内容)?

syncingTo字段是信息性的:它指示辅助节点当前从复制中提取oplog更新的位置。这可以是当前的主要版本,也可以是具有chained replication的其他次要版本(通常仅在地理位置分布的副本集中看到)。

此字段的存在与当前replica set member state无关,如果初始同步仍在完成,则为STARTUP2;如果成员处于正常状态,则为SECONDARY

syncingTo字段将更适当地重命名为syncingFrom,但由于MongoDB 2.2和重命名将破坏现有脚本/工具,因此历史命名选择已经到位。你可能想观看/ upvote SERVER-5461;它可能会在未来的主要版本中重命名。

  

每当我通过命令行连接时,我总是连接到SECONDARY服务器(从不是PRIMARY)。从我所读到的内容来看,这与副本集仍然是同步的事实有关。

问题在于您的连接字符串:

mongo --host MongoA:27017,MongoB:27017,MongoC:27017

对于具有MongoDB 3.0 shell的replica set connection,您需要在种子列表(根据replSet输出看起来像s-1)之前包含rs.status()名称:< / p>

mongo --host s-1/MongoA:27017,MongoB:27017,MongoC:27017

如果没有连接字符串中的replSet前缀,您将始终连接到列表中的第一个主机,该主机当前是rs.status()输出的辅助主机。如果您使用正确的格式,只要种子列表中至少有一个主机可用(并且有一个主节点),您将连接到当前主节点。