Comment on page
生产注意事项 (分片集群)
本页面中
从版本4.2开始,MongoDB提供了对分片群集执行多文档事务的功能。
_对于MongoDB 4.2部署(副本集和分片群集)上的事务,_客户必须使用为MongoDB 4.2更新的MongoDB驱动程序。
注意
您的驱动程序可能会返回其他错误。 有关详细信息,请参阅驱动程序的文档。
Error Code / 错误码 | Error Message / 错误信息 |
---|---|
251 | cannot continue txnId -1 for session ... with txnId 1 |
50940 | cannot commit with no participants |
针对单个分片的事务应具有与副本集事务相同的性能。
影响多个分片的事务会产生更高的性能成本。
注意
在分片群集上,如果任何涉及的分片包含仲裁者,那么跨越多个分片的事务将出错并中止。
要指定时间限制,请在
commitTransaction
上指定maxTimeMS
限制。注意
如果任何事务操作读取或写入包含仲裁程序的分片,则其写操作跨越多个分片的事务将出错并中止。
对于具有三成员PSA的分片群集,您可以
禁用读策略“majority”
(如--enableMajorityReadConcern false
或replication.enableMajorityReadConcern:false
)以避免缓存压力。- 在分片集群上,如果事务涉及的分片禁用读策略“majority”,则您不能设置读策略
“snapshot”
用于事务。对于该事务您只能使用读策略的“ local”
或“majority”
。如果使用读策略“ snapshot”
,则事务错误并中止。当enableMajorityReadConcern = false时,分片群集不支持`readConcern level'snapshot'。如果事务的任何读或写操作涉及到禁用读策略“majority”的分片,则其写操作跨越多个分片的事务将出错并中止。 - 要检查读策略“majority”是否被禁用,
警告
对于具有正在进行中的分片事务的4.2+分片群集,请使用以下协调的备份和回档方案,这些方案确实维护了各个分片事务的原子性保证:
如果正在进行的事务锁定了集合,并且涉及该集合的块迁移开始,则这些迁移阶段必须等待事务释放对集合的锁定,从而影响块迁移的性能。
如果大块迁移与事务交织(例如,如果在大块迁移已在进行的同时启动事务,并且迁移在事务锁定集合之前完成),则提交期间的事务错误并中止。
根据两个操作的交错方式,包括一些示例错误(错误消息已被缩写):
an error from cluster data placement change ... migration commit in progress for <namespace>
Cannot find shardId the chunk belonged to at cluster time ...
也可以看看
在提交事务期间,外部读取操作可能会尝试读取将由事务修改的相同文档。 如果事务写入多个分片,则在尝试对各个分片进行提交时
- 外部读取使用其他读策略时,不会等待事务的所有写入都可见,而是会读取可用集合的事务前版 本。
为了最大程度地减少分片事务和索引之间的潜在交互,请考虑以下在分片集群上构建索引的策略之一:
- 在维护窗口期间建立索引,在该窗口中,应用程序停止针对要建立索引的集合发出分布式事务。
译者:王金铷