我有一个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)。从我所读到的内容来看,这与副本集仍然是同步的事实有关。
我的问题是为什么它总是处于同步状态?是否存在阻止集合成员同步的内容(例如访问特定端口或其他内容)?
感谢任何帮助或建议,谢谢。
答案 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()
输出的辅助主机。如果您使用正确的格式,只要种子列表中至少有一个主机可用(并且有一个主节点),您将连接到当前主节点。