等待写入复制
使用 getLastError 命令确保写入操作被复制到备份节点。参数 “w” 会强制要求 getLastError 等待,一直到给定数量的成员都执行了最后的读写操作。它的 shell 如下;
> db.runCommand({"getLastError":1,"w":"majority"});
指定一个超时时间
> db.runCommand({"getLastError":1,"w":"majority","wtimeout":1000});
自定义复制保证规则
写入副本集的“大多数”成员被为是写入安全。然而,有些副本集可能有更复杂的要求:可能会希望确保写操作被复制到每个数据中心中至少一台服务器上,或者是被复制到可见节点的“大多数”服务器上。副本集允许创建自己的规则,并且可以传递给 getLastError,以确保写操作被复制到所需的服务器上。
创建自定义规则有两个步骤:
使用键值对设置成员的“tags”字段。这里的键用于描述分组,值表示服务器所属的分组。
基于刚刚创建的分组规则。规则总是形如 {“name”:{“key”:number}} ,表示写操作返回成功之前需要复制到至少 number 个分组,每个分组内的一台服务器上。
将读请求发送到备份节点
出于一致性考虑
由于网络故障、加载问题、配置错误等原因,备份节点可能会落后于主节点几分钟甚至更长。客户端并不知道,如果你要读取最新的数据,不要从备份节点读取数据。
出于负载的考虑
使用备份节点作为负载分担一些数据加载任务的方式十分危险,它容易造成系统过载,一旦出现这种问题,很难修复。一个更好的选择是使用分片做分布式负载。
何时可以从备份节点读取数据
在某些情况下从备份节点读取数据是合理的。例如,你希望应用程序在主节点挂掉时依然能执行读操作(而且你不在意数据是否是最新的)。失去主节点时,应用程序进入只读状态,这种读选项叫做主节点优先。
参考
[1] MongoDB权威指南