生产注意事项(分片集群)


进入MongoDB中文手册(4.2版本)目录

从版本4.2开始,MongoDB提供了对分片群集执行多文档事务的功能。
下页列出了分片群集上运行事务的特定的问题。这些问题时除了 生产注意事项中列出的那些关注之外的问题。

1 分片事务和MongoDB驱动程序

对于MongoDB 4.2的部署(副本集和分片群集)上的事务,客户端必须使用更新到MongoDB 4.2的MongoDB驱动程序。
在具有多个mongos实例的分片群集上,使用更新到MongoDB 4.0(而非MongoDB 4.2)的驱动程序执行事务将失败,并可能导致错误,包括:

注意
您的驱动程序可能会返回其他错误。有关详细信息,请参阅驱动程序的文档。

错误代码错误信息
251cannot continue txnId -1 for session … with txnId 1
50940cannot commit with no participants

2 性能

2.1 单分片

针对单个分片的事务应具有与副本集事务相同的性能。

2.2 多分配

影响多个分片的事务会产生更高的性能成本。

注意
在分片群集上,如果任何涉及的分片包含仲裁器,那么跨越多个分片的事务将出错并中止。

2.3 时间限制

要指定时间限制,请在提交事务上指定一个maxTimeMS的限制。
如果maxTimeMS未指定,则MongoDB将使用 transactionLifetimeLimitSeconds。
如果指定maxTimeMS,但会导致事务超出transactionLifetimeLimitSeconds,则MongoDB将使用transactionLifetimeLimitSeconds。
要修改分片群集的transactionLifetimeLimitSeconds,必须为所有分片副本集成员修改该参数。

3 读策略

多文档事务的支持"local", "majority"和"snapshot"读策略级别。
对于分片群集上的事务,只有读策略"snapshot"才能在多个分片之间提供一致的快照。
有关读策略和事务的更多信息,请参见事务和读策略

4 写策略

您不能在具有writeConcernMajorityJournalDefault设置为false 的分片的分片群集上运行事务(例如,具有使用内存存储引擎的投票成员的分片)。

注意
无论为事务指定写策略是什么,分片群集事务的提交操作都包含一些使用{w: “majority”, j: true}写策略的部分。

5 仲裁器

如果任何事务的操作读取或写入包含仲裁程序的分片,则其写操作跨越多个分片的事务将出错并中止。
另请参阅三成员主次仲裁分片],以了解已禁用读策略majority的分片的事务限制。

6 三成员主次仲裁器分片(Three Member Primary-Secondary-Arbiter Shards)

对于具有三成员PSA分片的分片群集,您可能已禁用读策略majority(即enableMajorityReadConcern false或replication.enableMajorityReadConcern: false ),以避免缓存压力。
在分片集群上

  • 如果事务涉及已禁用读策略majority的分片,则不能对事务使用读策略"snapshot"。您只能将已读策略"local"或 “majority"用于事务。如果使用读策略"snapshot”,则事务错误并中止。
    当enableMajorityReadConcern = false时,分片群集不支持读策略"snapshot"级别。
  • 如果任何事务的读或写操作涉及禁用了读策略"majority"的分片,则其写操作跨越多个分片的事务将出错并中止 。

要检查读策略"majority"是否被禁用,
您可以运行db.serverStatus()并检查storageEngine.supportsCommittedReads字段。如果为 false,则禁用了读策略"majority"。

7 备份和恢复

警告
mongodump和mongorestore不能作为正在进行分片事务的4.2+版本的分片群集的备份策略的一部分,因为使用mongodump创建的备份不能保持分片事务的原子性保证。
对于具有正在进行分片事务的4.2+版本的分片群集,请使用以下搭配的备份和恢复程序之一,该程序确实保持了跨分片事务的原子性保证:

8 块迁移

块迁移在某些阶段获得排他的集合锁。
如果正在进行的事务锁定了集合,并且涉及该集合的块迁移开始执行,则这些迁移阶段必须等待事务释放对集合的锁定,因此会影响块迁移的性能。
如果大块迁移与事务交错(例如,如果在大块迁移已在进行中而事务开始并且迁移在事务锁定集合之前完成迁移),则事务在提交期间出错并中止。
根据两个操作的交错方式,包括一些示例错误(错误消息已被缩写):

  • an error from cluster data placement change … migration commit in progress for <namespace>
  • Cannot find shardId the chunk belonged to at cluster time …

也可以看看

9 提交期间的外部读操作

在提交事务期间,外部读取操作可能会尝试读取将会被事务修改的相同文档。如果事务写入多个分片,则在尝试进行分片提交时:

  • 使用读策略snapshot或 "linearizable"或属于因果一致会话(即,包括afterClusterTime)的外部读操作等待事务的所有写入均可见。
  • 使用其他读策略的外部读操作不等待事务的所有写入可见,而是读取事务前的可用文档。

也可以看看

10 与构建复制索引操作的交错

对于集合上的复制索引构建(与滚动索引构建相对),一旦针对主副本集成员发布的索引构建完成,次节点成员将应用关联的oplog条目并开始索引构建。在建立索引时,次节点将等待应用以后的任何oplog条目,包括在构建期间提交的分布式事务。如果复制停顿的时间超过oplog窗口的时间,则次节点同步会失败,并需要重新同步才能恢复。
为了最大程度地减少分片事务和索引之间的潜在交错,请考虑以下在分片集群上构建索引的策略之一:

  • 在维护窗口期间建立索引,在这期间,应用程序停止针对要建立索引的集合发出分布式事务。
  • 使用滚动索引构建程序构建索引,如分片群集上的构建索引中所述。
  • 增加每个副本集成员上的操作日志大小,以减轻由于复制的索引构建而导致不同步的可能性。

11 其他信息

另请参见生产注意事项


进入MongoDB中文手册(4.2版本)目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值