等待写入复制

使用 getLastError 命令确保写入操作被复制到备份节点。参数 “w” 会强制要求 getLastError 等待,一直到给定数量的成员都执行了最后的读写操作。它的 shell 如下;

  1. > db.runCommand({"getLastError":1,"w":"majority"});

指定一个超时时间

  1. > db.runCommand({"getLastError":1,"w":"majority""wtimeout":1000});

自定义复制保证规则

写入副本集的“大多数”成员被为是写入安全。然而,有些副本集可能有更复杂的要求:可能会希望确保写操作被复制到每个数据中心中至少一台服务器上,或者是被复制到可见节点的“大多数”服务器上。副本集允许创建自己的规则,并且可以传递给 getLastError,以确保写操作被复制到所需的服务器上。

创建自定义规则有两个步骤:

  1. 使用键值对设置成员的“tags”字段。这里的键用于描述分组,值表示服务器所属的分组。

  2. 基于刚刚创建的分组规则。规则总是形如 {“name”:{“key”:number}} ,表示写操作返回成功之前需要复制到至少 number 个分组,每个分组内的一台服务器上。

将读请求发送到备份节点

出于一致性考虑

由于网络故障、加载问题、配置错误等原因,备份节点可能会落后于主节点几分钟甚至更长。客户端并不知道,如果你要读取最新的数据,不要从备份节点读取数据。

出于负载的考虑

使用备份节点作为负载分担一些数据加载任务的方式十分危险,它容易造成系统过载,一旦出现这种问题,很难修复。一个更好的选择是使用分片做分布式负载。

何时可以从备份节点读取数据

在某些情况下从备份节点读取数据是合理的。例如,你希望应用程序在主节点挂掉时依然能执行读操作(而且你不在意数据是否是最新的)。失去主节点时,应用程序进入只读状态,这种读选项叫做主节点优先。

参考

[1] MongoDB权威指南