以单机模式启动成员
> mongod --port 30000 --dbpath /var/lib/db
维护时启动单机模式,维护完毕后,以最原始的参数启动它。启动后,它会自动与副本集中的其它成员进行同步,将维护期间落下的操作全部复制过来。
副本集配置
创建副本集
> var config = {
"_id":setName,
"members":[
{"_id":0,"host":host1},
{"_id":1,"host":host2},
{"_id":2,"host":host3}
]
};
> rs.initiate(config);
修改副本集成员
连接到主节点添加新成员
> rs.add("spock:27017");
移除成员
> rs.remove("spock:27017");
修改副本集成员时,有几个限制:
不能修改成员的 “_id” 字段。
不能修将接收 rs.reconfig 命令的成员的优先级设为 0 。
不能将仲裁者成员变成非仲裁者成员,反之亦然。
不能将 “bulidIndexes”:false 的成员修改为 “bulidIndexes”:true。
创建比较大的副本集
副本集最多只能拥有 12 个成员,其中只有 7 个成员拥有投票权。这是为了减少心跳请求的网络流量和选举花费的时间。如果需要创建 7 个以上成员的副本集,只有 7 个成员可以拥有投票权,需要将其他成员的投票数量设为 0 :
> rs.add({"_id":7,"host":"server-7:27017","votes":0});
强制重新配置
如果无法满足“大多数”要求的话,无法选举出新的节点,这时需要重新配置副本集。
> rs.reconfig(config,{"force":true});
如果修改了某些成员的主机名,应该关闭所有副本集,以单机模式启动,手动修改 local.system.replset 文档,然后重启。
修改成员状态
把主节点变为备份节点
> rs.stepDown();
主节点变为备份节点,维持 60 秒。这段时间没哟新的主节点被选举出来,这个节点可以重新参与选举。
阻止选举
在 1000 秒内不能选举
> rs.freeze(1000);
维护模式
强制进入维护模式
> db.adminCommand({"replSetMaintenanceMode":true});
从维护模式中恢复
> db.adminCommand({"replSetMaintenanceMode":false});
监控复制
获取状态
查看每个成员当前的所有信息
> rs.status();
复制图谱
MongoDB 根据 ping 时间选择同步源。一个成员向另一个成员发送心跳请求,就知道心跳请求所耗费的时间。选择同步源时,会选择距离自己较近数据比自己新的成员,不一定要从主节点复制。
禁用复制链
强制要求所有的成员都从主节点复制。只需要将 “allowChaining” 设为 false 即可。
计算延迟
备份节点与主节点之间的延迟程度,即最后一次操作的时间戳的差。
> db.printReplicationInfo();
调整 oplog 大小
当服务器时是主节点,让它退位,以便让其他成员的数据能够尽快更新到与它一致。
关闭当前服务器。
将当前服务器以单机服务模式启动。
临时将 oplog 中的最后一条 insert 操作保存到其他集合中。
删除当前的 oplog。
> db.oplog.rs.drop();
- 创建一个新的 oplog。
> db.createCollection("oplog.rs",{"capped":true,"size":10000});
- 将最后一条操作记录写回 oplog。
> var temp = db.tempLastOp.findOne();
> db.oplog.rs.insert(temp);
> db.oplog.rs.findOne() // 确保成功
- 将当前服务器作为副本集成员重新启动。
从延迟备份节点中恢复数据
关闭所有其他成员。
删除其他成员数据目录中的所有数据,确保每个成员的数据目录都是空的。
重启所有成员,然后它们会自动从延期备份节点中复制数据。
创建索引
你可能每次只想在一个成员创建索引,降低对应用程序的影响。
关闭一个备份节点服务器。
将这个服务器以单机模式启动。
在单机模式下创建索引。
索引创建完成后,将服务器作为副本集成员重新启动。
对副本集中的每个备份节点重复第 ① 至 ④ 步。
现在副本集的所有成员都成功创建了索引。下面需要给主节点创建索引。你可以在“空闲期”时给主节点创建索引,或者让主节点退化为备份节点,对这个服务器执行上诉四个步骤。
主从模式
这种模式下,MongoDB 不会自己做故障转移,而且需要声明主节点和从节点。当需要多于 11 个备份节点,或者是需要复制单个数据库。
参考
[1] MongoDB权威指南