生产环境注意事项(分片集群)
您可以在分片集群上执行多文档事务。
以下页面列出了与在分分片集群上运行事务相关的特定问题。 这些问题是对生产注意事项中列出的问题的补充。
性能
单个分片
针对单个分片的事务应具有与副本集事务相同的性能。
多个分片
影响多个分片的事务产生更大的性能成本。
注意
在分片集群上,如果涉及的任何分片包含仲裁节点,跨多个分片的事务将出现错误并中止。
时间限制
要指定时间限制,请在commitTransaction
上指定 maxTimeMS
限制。
如果未指定 maxTimeMS
,MongoDB 将使用 transactionLifetimeLimitSeconds
。
如果指定了 maxTimeMS
但导致事务超过 transactionLifetimeLimitSeconds
,MongoDB 将使用 transactionLifetimeLimitSeconds
。
要修改分片集群的 transactionLifetimeLimitSeconds
,必须为所有分片副本集节点修改该参数。
读取关注
多文档事务支持 "local"
、"majority"
和 "snapshot"
读关注级别。
对于分片集群上的事务,仅 "snapshot"
读关注在多个分片之间提供一致的快照。
有关读关注和事务的更多信息,请参阅事务和读关注。
写关注
您无法在具有将 writeConcernMajorityJournalDefault
设置为 false
的分片(例如具有使用内存中存储引擎的投票节点的分片)的分片集群上运行事务。
注意
无论为事务指定的写关注如何,分片集群事务的提交操作都包含一些使用 {w:
"majority", j: true}
写关注的部分。
仲裁节点
如果副本集具有仲裁节点节点,则无法使用ACID 事务更改分分片键。 仲裁节点无法参与多分片事务所需的数据操作。
如果任何事务操作读取或写入包含仲裁节点的分片,则写入操作跨越多个分片的事务将出现错误并中止。
备份和恢复
警告
要使用 mongodump
和mongorestore
作为分分片的集群的备份策略,请参阅使用数据库转储备份自管理分片集群。
分片集群还可以使用以下协调备份和恢复流程之一,以确保跨分片事务的原子性:
数据段迁移
数据段迁移在某些阶段获取独占集合锁。
如果正在进行的事务对某集合有锁,并且涉及该集合的数据段迁移开始,则这些迁移阶段必须等待该事务释放该集合的锁,从而影响数据段迁移的性能。
如果数据段迁移与事务交错(例如,事务在数据段迁移进行中启动,并且迁移在事务锁定集合之前完成),则事务在提交期间出错并中止。
根据两个操作的交错方式,可能出现一些错误(错误消息已缩写):
an error from cluster data placement change ... migration commit in progress for <namespace>
Cannot find shardId the chunk belonged to at cluster time ...
提交期间的外部读取
在提交事务期间,外部读取操作可能会尝试读取将由该事务修改的相同文档。如果事务写入多个分片,则在尝试跨分片提交期间:
使用读关注
"snapshot"
或"linearizable"
的外部读取会等到事务的所有写入都可见。因果一致会话中的外部读取(包括 afterClusterTime 会话)会等到事务的所有写入都可见。
使用其他读关注的外部读取不会等到事务的所有写入都可见,而是读取文档的事务前版本。
更多信息
另请参阅生产环境注意事项。