如何使用rs.syncFrom进行初始同步?

时间:2013-11-19 12:08:28

标签: mongodb

我想为副本集设置一个新的辅助设备,但出于性能原因我不希望它从主设备同步,因此我尝试使用rs.syncFrom命令。

在我在主服务器中运行rs.add之前(对于新的辅助服务器),新设置的辅助服务器无法调用rs.syncFrom,但未调用输出错误rs.initiate。但是,在调用rs.add之后,它会开始初始同步。

the doc

  

要影响初始同步的同步目标,请在初始同步之前运行rs.syncFrom()操作。

请帮忙〜

3 个答案:

答案 0 :(得分:3)

这在文档中很容易混淆,但是在将主机添加到副本集和初始同步发生之间有一个短暂的窗口(~30秒)。由于日志条目如下所示,您可以判断客户端何时开始初始同步:

Mon Mar 24 10:21:21.231 [rsSync] replSet initial sync pending
Mon Mar 24 10:21:21.231 [rsSync] replSet syncing to: XXXXX:27017

我遵循的步骤:

  1. 将mongo shell打开到新主机,将副本集设置为主要。
  2. 在小学:rs.add("new-host:port")
  3. 尽快在新主持人:rs.syncFrom("preferred-host:port")
  4. 我经常执行第3步,因为它是在有效窗口之外的无操作,并且窗口可能很难被击中(正如您所发现的那样)。

    Mongo Google Group上的参考:https://groups.google.com/d/msg/mongodb-user/msOFZrj5TKk/e7huENWhiQoJ

答案 1 :(得分:1)

嗯,如果您的副本集不是太大,有一种更简单的方法可以实现这一点。您可以使用iptables临时阻止出站mongo流量到您的主要,可能还有其他副本集成员,但要成为初始同步源的辅助成员除外。使用rs.add向主要副本集添加新成员后,您需要在此辅助节点上停止 mongod 进程并添加iptables规则,如下所示:

 iptables -I OUTPUT -p tcp -d primary_ip --dport primary_port -j DROP

其中primary_ip - 是IP地址,primary_port - 是主节点上mongod进程使用的TCP端口。启动 mongod 进程后,将根据MongoDB chained replication策略选择初始同步源。

以类似的方式,您可以为其他副本集成员创建临时块,或者 阻止除初始同步源成员之外的所有传出mongo流量。

答案 2 :(得分:0)

在新辅助服务器上的hosts文件中添加一个条目,该条目将当前主服务器的主机名指向您希望同步的现有辅助服务器的IP。

在添加hosts条目之后和rs.add()之前重新启动mongod。

初始同步完成后,删除hosts条目并重启mongod。