OPTIONS
翻译或纠错本页面

复制集的安全写级别

无论是单节点 的还是 复制集 的MongoDB,对于应用程序来说,都是透明的。 然而,复制集为写操作也提供了一些配置选项。 [1]

[1]

分片为复制集的 分片集群 关于读写操作的配置选项与复制集一样。

复制集写操作的审核

复制集的在默认的 安全写级别 下,仅确认数据是否写进了主节点。然而我们也可以修改安全写级别来确保写操作在复制集指定个数的节点中执行完毕。

Write operation to a replica set with write concern level of ``w:2`` or write to the primary and at least one secondary.

Write operation to a replica set with write concern level of w:2 or write to the primary and at least one secondary.

我们可以在每次写操作的时候指定安全写级别来规避默认的安全写级别。例如,下面的语句指定了安全写级别,那么这个写操作只有在超时超过5秒或是已经在主节点与一个从节点上应用后才会返回。

db.products.insert(
   { item: "envelopes", qty : 100, type: "Clasp" },
   { writeConcern: { w: 2, wtimeout: 5000 } }
)

我们可以在安全写级别中设定超时限制。这样可以在写操作无法到达目标服务器的时候造成的堵塞。举个例子,当复制集只有3成员,而安全写级别设置的需要复制集的4个成员确认的时,该操作就会一直堵塞直到获得4个成员的确认。详情参见 wtimeout

修改默认的安全写级别

我们可以通过修改 复制集配置 中的 getLastErrorDefaults 来设置复制集的默认安全写级别。下面的配置命令的效果是:写操作只有在复制集中多数节点回应后才会完成。

cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)

如果在执行写操作的时候指定了安全写级别,那么该写操作将会使用指定的安全写级别而不是默认的。

注解

不恰当的安全写级别可能会导致在 复制集故障切换 过程中的数据 回滚 。应用程序中也需要指定安全写的级别。

定制安全写级别

你可以给复制集中得某个成员打个 标签 ,然后根据标签来设置安全写级别。给某个标签的成员设置安全写级别可以参考 配置复制集标签设置