前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB Retryable Writes Reads

MongoDB Retryable Writes Reads

作者头像
shysh95
发布2024-06-14 20:26:31
1140
发布2024-06-14 20:26:31
举报
文章被收录于专栏:shysh95

Hi~朋友,关注置顶防止错过消息

Retryable Writes

MongoDB Retryable Wirtes允许MongoDB驱动程序当网络发生故障或者集群发生故障时对写操作自动重试一次。

Retryable Writes的前提

  • MongDB必须是分片集群或者副本集群
  • 存储引擎必须支持文档级别的锁,比如WiredTiger或者in-memory存储引擎
  • MongoDB驱动程序版本必须为3.6+
  • 集群中的每个MongoDB实例版本必须>=3.6,且featureCompatibilityVersion参数必须>=3.6

如何启用Retry Writes

MonogDB 4.2以后的驱动程序默认是启动了Retryable Writes,更早版本的驱动程序可以通过在连接字符串或配置中设置retryWrites=true参数来启动。

mongosh默认是开启Retryable Writes,可以通过--retryWrites=false进行禁用,如下:

  1. mongosh --retryWrites=false

事务的重试

在MongoDB中,事务的提交和终止都是可重试操作,当遇到错误时,MongoDB 会无视retryWrites选项重试一次操作。

支持重试的写操作

当支持的重试操作设置了write concern时来进行结果确认(也就是write concer不能位{w: 0}),支持的操作如下:

  • db.collection.insertOne()
  • db.collection.insertMany()
  • db.collection.updateOne()
  • db.collection.replaceOne()
  • db.collection.deleteOne()
  • db.collection.remove()并且justOne参数为true
  • db.collection.findAndModify()
  • db.collection.findOneAndDelete()
  • db.collection.findOneAndReplace()
  • db.collection.findOneAndUpdate()
  • db.collection.bulkWrite()只包含单文档操作的数组集合,即insertOne、updateOne、replaceOne、deleteOne

Retry Writes行为

MongoDB重试写入操作只会重试一次,这有助于解决网络抖动和副本选举期间的问题,但不能解决持续性的网络问题。

当副本集或者分片集群故障时,MongoDB驱动程序会等待serverSelectionTimeoutMS参数设置的时间以后再进行重试,因此对于故障转移时间超过serverSelectionTimeoutMS设置的时间后重试操作将无法成功。

db.serverStatus()返回的transactions包含了关于Retryable Writes 的统计数据。

如果启用了写入重试又对local数据库进行写入,应用程序将会报错,local数据库通常用于存储本地服务器信息和副本集操作日志,不建议对其进行写操作。

MongoDB 6.1版本以后,如果第一次和重试写入操作都发生失败,MongoDB会返回一个NoWritesPerformed标签,但是对于insertMany操作会略有不同:

  • 如果所有的的文档都没有insert成功,返回一个带NoWritesPerformed标签的错误信息
  • 如果只有部分文档写入成功,返回Error但是不带NoWritesPerformed标签
  • 如果所有文档都insert成功,则返回Success

Retryable Reads

MongoDB Retryable Reads可以在查询遇到错误时进行一次重试,有利于解决网络抖动的问题。

Retryable Reads的前提

  • MongoDB驱动程序版本必须在4.2以上
  • MongoDB实例版本必须在3.6以上

如何启用Retry Reads

MongoDB 4.2以后默认启动了Retry Reads,如果想禁用该功能可以对连接字符串增加retryReads=false。

mongsh不支持Retryable Reads。

支持Retryable的读操作

  • Collection.aggregate
  • Collection.count
  • Collection.countDocuments
  • Collection.distinc
  • Collection.estimatedDocumentCount
  • Collection.find
  • Database.aggregate
  • Collection.watch
  • Database.watch
  • MongoClient.watch
  • MongoClient.listDatabases
  • Database.listCollections
  • Collection.listIndexes

Retry Read行为

MongoDB重试写入操作只会重试一次,这有助于解决网络抖动问题,但不能解决持续性的网络问题。

当副本集或者分片集群故障时,MongoDB驱动程序会等待serverSelectionTimeoutMS参数设置的时间以后再进行重试,因此对于故障转移时间超过serverSelectionTimeoutMS设置的时间后重试操作将无法成功。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Retryable Writes
  • Retryable Reads
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档