On this page
Retryable Writes
在本页面
3.6 版的新功能。
可重试写入允许 MongoDB 驱动程序在遇到网络错误或无法在replica sets或sharded cluster中找到正常的primary时,一次自动重试某些写入操作。
Prerequisites
可重试写入具有以下要求:
支持的部署拓扑
- 可重试写入要求replica set或sharded cluster,并且“不”支持standalone instances。
支持的存储引擎
- 可重试写入需要支持文档级锁定的存储引擎,例如WiredTiger或in-memory存储引擎。
MMAPv1 存储引擎不支持重试写入。
3 .6 MongoDB 驱动程序
- Client 端需要为 MongoDB 3.6 更新的 MongoDB 驱动程序:
Java 3.6+ | ||
Python 3.6+ C 1.9 |
C#2.5 Node 3.0+ Ruby 2.5 |
Perl 2.0 PHPC 1.4+ Scala 2.2+ |
MongoDB Version
- 集群中每个节点的 MongoDB 版本必须为
3.6
或更高,集群中每个节点的featureCompatibilityVersion
必须为3.6
或更高。有关featureCompatibilityVersion
标志的更多信息,请参见setFeatureCompatibilityVersion。
- 集群中每个节点的 MongoDB 版本必须为
Write Acknowledgment
- 由Write Concern到
0
发出的写操作“不可重试”。
- 由Write Concern到
启用可重试写入
MongoDB 驱动程序默认不启用不重试写入。
MongoDB Drivers
- 要在 MongoDB 驱动程序中启用可重试写入,请将retryWrites选项添加到connection string:
mongodb://localhost/?retryWrites=true
mongo shell
- 要在mongo shell 中启用可重试写入,请使用--retryWrites命令行选项:
mongo --retryWrites
可重试的写操作
当发出已确认的写入问题时,以下写入操作可以重试;例如Write Concern不能为{w: 0}
。
Methods | Descriptions |
---|---|
db.collection.insertOne() | |
db.collection.insert() db.collection.insertMany() |
Insert operations. |
db.collection.updateOne() db.collection.replaceOne() db.collection.save() db.collection.update(),其中 multi 是false |
单文档更新操作。 |
db.collection.deleteOne() db.collection.remove(),其中 justOne 是true |
单个文档删除操作。 |
db.collection.findAndModify() db.collection.findOneAndDelete() db.collection.findOneAndReplace() db.collection.findOneAndUpdate() |
findAndModify 个操作。所有findAndModify 操作都是单个文档操作。 |
db.collection.bulkWrite()具有以下写操作: insertOne updateOne replaceOne deleteOne |
仅由单文档写操作组成的批量写操作。可重试的批量操作可以包括指定写操作的任意组合,但不能包括任何多文档写操作,例如updateMany 。 |
Bulk个操作: Bulk.find.removeOne() Bulk.find.replaceOne() Bulk.find.replaceOne() |
仅由单文档写操作组成的批量写操作。可重试的批量操作可以包括指定写操作的任意组合,但不能包括任何多文档写操作,例如update 为multi 选项指定true 。 |
Behavior
永久性网络错误
MongoDB 可重试写入仅进行一次“ **”重试尝试。这有助于解决瞬态网络错误和副本集选举,但不能解决持久性网络错误。
Failover Period
如果驱动程序在目标副本集或分片的群集分片中找不到正常的primary,则驱动程序将 awaitserverSelectionTimeoutMS毫秒来确定新的主数据库,然后再重试。可重试的写操作不会解决故障转移时间段超过serverSelectionTimeoutMS的实例。
Warning
如果在发出写操作后 Client 端应用程序暂时不响应localLogicalSessionTimeoutMinutes,则有可能在 Client 端应用程序开始响应(不重新启动)时重试并再次应用写操作。
Diagnostics
版本 3.6.3 中的新功能。
serverStatus命令及其mongo shell 帮助程序db.serverStatus()在transactions部分中包含有关可重试写入的统计信息。
针对本地数据库的可重试写入
您无法在启用了可重试写入的情况下对local
database中的集合执行写入操作。
兼容 MongoDB 3.6 的官方驱动程序默认情况下会禁用可重试的写入。要显式禁用可重试写入,请在connection string中为 MongoDB 集群指定retryWrites=false。