通过部署更新而不是显式传递的选项修复 Mongo RetryableWrites?

Fix for Mongo RetryableWrites through deployment update rather than explicitly passed option?

This MongoDB deployment does not support retryable writes 的最佳解决方案是什么?是否有我应该使用的版本/设置(例如,找到一种从 MMAPv1 切换到 WiredTiger 的方法),或者 retryWrites=false 的显式设置更新是否真的是 heroku mlab 部署的最佳解决方案?

背景:

在过去几周的某个时候,我的 Heroku 提供的 mLab 附加组件已经 运行 顺利运行了大约一年,在任何写入尝试中都开始抛出:

Exception: This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.

我没有对部署或我的驱动程序进行任何更改,因此我认为这个新异常与 mlab 端的更新与我自己的设置不兼容有关。

关于诸如以下的讨论: 我遇到了可以解决该问题的方法。修复要求将 retryWrites=false 选项传递给 MongoClient,但在我看来,虽然我可以绕过该错误,但我的 MongoDB 部署中不受支持的功能的问题并未真正得到解决。

可重试写入 enabled by default 已更新为 MongoDB 4.2 的官方驱动程序。

MongoDB 服务器的所有现代版本(我包括 MongoDB 3.6+,因为 3.4 将在下个月结束)默认情况下还包括可重试写入支持。

该错误消息表明您的服务器部署或配置较旧,不支持可重试写入。

要解决这个问题,您的选择是:

  • 使用 WiredTiger 将您的服务器和存储引擎升级到 MongoDB 3.6+。您还需要一个副本集部署(可以是用于 development/testing 目的的单个成员副本集)。
  • retryWrites=false 添加到您的驱动程序连接字符串。
  • 降级到较旧的驱动程序版本(例如,兼容 4.0)。

我建议升级您的 MongoDB 部署,特别是如果您仍在使用已弃用的 MMAPv1 存储引擎或 EOL 服务器版本。