SERVER-17397: Dropping a Database or Collection in a Sharded Cluster may not fully succeed 是 MongoDB 里老大难的问题,库或集合删除操作如果没有完全执行成功,再新建相同名字的集合,可能导致读到老版本数据的问题。

集合分片原理

MongoDB sharding 分片原理参考 MongoDB Sharded cluster架构原理

总的来说,当用户对集合执行开启分片之后,集合分片的元数据会保存在 config server 的 config 集合里

  • config.collections 记录集合分片的元数据,根据哪个 shardKey 分片,集合是否已经被删除等元数据
  • config.chunks,记录各个 chunk(shardKey的某一段范围)对应的 shard 信息,用于路由请求
  • 各个 shard 里存储集合实际的数据

删除分片集合流程

  1. 删除所有 shard 里的对应的数据
  2. 删除 config.chunks 这个集合相关的chunk信息
  3. 修改 config.collections,标记集合已经删除

注:3.2+都是按上述流程操作,删除 Database 过程类似,还需要再额外操作 config.databases 集合,但本质上存在的问题类似

上述动作需要操作 config server 以及 所有的 shard,如果中间有步骤失败(一些很老的版本,并不是按照上述步骤执行,而且执行过程中可能没有严格检查返回的错误码,即使返回成功实际上内部可能执行失败),最终导致集合的部分数据仍然残留,没有完全清理干净。

如果这个集合名字重新被使用,再次调用 shardCollection 产生新的分片元数据,可能导致

  1. 在 shard 上的一些残留数据可能被读取到,而这些数据实际上应该被删除了
  2. mongos 没有成功更新路由信息,最终可能出现多个 mongos 看到的数据视图也不一致,有的 mongos 能读到数据,有的读不到(通过 `flushRouterConfig 命令可以强制刷新路由信息可解决)

解决方案

MongoDB sharding 删除集合/数据库涉及到多个节点进行操作,这些动作无法做到原子性,可能导致一个集合最终处于某种中间状态;复用该集合可能导致一写数据一致性问题。

  1. 使用 MongoDB 3.2+ 以上版本,大部分case,只要没有异常,删除集合动作都能正常完成的,复用集合名字问题一般问题也不大,但无法完全避免问题。
  2. 建议 Sharding 环境下,namespace 名字一旦被删除,不要再次复用
  3. 在需要复用 Namespace 的情况下,如果要确保不会有数据问题,每次可以按 drop collection workaround 确保相关数据被正确清理,并且路由信息被更新。

抢阿里云新用户专属优惠权益,致电95187-1 !

原文链接
本文为云栖社区原创内容,未经允许不得转载。

MongoDB Sharding 请勿复用已删除的 namespace相关推荐

  1. python操作sqlserver如何判断删除的数据不存在_Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法...

    本文实例讲述了Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法.分享给大家供大家参考,具体如下: 前言: 想把QQ日志爬虫(Python)爬下来的日志保存到 MongoD ...

  2. MongoDB Sharding 机制分析

    MongoDB 是一种流行的非关系型数据库.作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂.丰富的查询功能外,MongoDB 还自带了相当强大的 sharding 功能. 要 ...

  3. 2种方法恢复回收站已删除的文件,必看干货

    我们日常使用电脑工作学习过程中,删除文件是比较频繁的操作.如果只是简单地删除了文件,比如直接把文件拖入回收站,按delete键删除,又或者是右键文件再选择删除.一般情况下,被删的文件会进入回收站,在清 ...

  4. zblog去除底部版权信息 “请勿修改或删除主题版权及作者信息”

    场景:使用了免费模板,但底部带作者版权.删除版权信息的代码后访问前台弹窗:请勿修改或删除主题版权及作者信息... 1. 删除版权信息代码 使用notepad++搜索功能,搜索版权信息:如ABC,找到相 ...

  5. android 恢复root,如何从没有Root的Android恢复已删除的文件

    照片非常重要,失去它们可能是一场噩梦.值得庆幸的是,有一种简单的方法可以在没有root的情况下恢复删除照片以及其他数据,如消息,视频,联系人等. 大多数用户认为,为了运行恢复工具,需要根设备.这是一个 ...

  6. C2280 “std::_Uhash_compare<_Kty,_Hasher,_Keyeq>......尝试引用已删除的函数

    错误 C2280 "std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_comp ...

  7. MongoDB Sharding

    MongoDB Sharding Sharding结构 replica set mmap Chunk的分裂和迁移 Chunk的分裂 Chunk的迁移 Sharding结构 转载自https://www ...

  8. 在LVM中恢复已删除的物理卷

    本文中将详细介绍如何从已删除的物理卷或故障磁盘场景中恢复. 系统环境 Centos8 现有的文件系统 下面使用了/dev/sd[a-c]三块磁盘,将他们划入一个卷组,创建两个逻辑卷: # Create ...

  9. 在LVM中恢复已删除的逻辑卷

    本文介绍如何恢复已删除的逻辑卷,如要执行恢复将使用vgcfgrestore命令. 在执行任何逻辑卷管理相关任务时,如果意外的删除了逻辑卷,则可以使用它的数据还原功能来恢复逻辑卷.在下面的步骤中,将演示 ...

最新文章

  1. CCleaner v5.55.7108 发布,新增软件升级功能
  2. 运维调试记录:Opendaylight铍版本开发环境搭建流程
  3. vim改变与选择字休大小的方法
  4. nginx日志中文变成类型\xE9\xA6\x96\xE9\xA1\xB5-\xE6\x8E\xA8\xE8\x8D\x90的东西
  5. 10-30 团队的自动化
  6. 腾讯云对象存储 python_python 云存储
  7. abcde依次进入一个队列_数据结构与算法 | 一文掌握队列Queue(真题讲解)
  8. JS记坑 ----- children返回的类数组
  9. 谷歌放弃go_盘点国内可以使用的十种谷歌服务
  10. 小程序直传阿里云OSS 踩坑
  11. MVVM框架原理浅析
  12. ios实现video自动播放
  13. PS|001制作1寸照片
  14. 我,32岁零基础转大数据,不需要别人怎么看!
  15. 大衣哥触底反弹,和合国际传收购孟文豪《火火的情怀》
  16. html 双向绑定组件,contenteditable联合v-html实现数据双向绑定的vue组件
  17. GoAhead4.1.0 开发总结一(移植)
  18. Spring Cloud Gateway 网关整合 Knife4j
  19. 字体像素html,Chrome中的字体像素问题(HTML5 / CSS3)
  20. 电视量价齐跌,小米电视率先跌回5字头,或促使电视跌回白菜价

热门文章

  1. linux 系统配额管理功能,Linux磁盘配额管理
  2. oracle百分之0.01就成了.01,遭遇ORA-01200错误的原因及解决方法
  3. imread函数_MATLAB图像处理:27:使用imtranslate函数平移图像
  4. leetcode42 --- trap
  5. jvm垃圾回收机制_JVM 垃圾回收机制之堆的分代回收
  6. python qt开发_Python 使用Qt进行开发(三)
  7. ios nsstring根据ascii码大小排序_iOS(NSPredicate) 谓词的使用
  8. 这些学霸的作息表“曝光”,太震撼了,快来找差距!
  9. 一图读懂马云与阿里20年:互联网巨头是如何养成的?
  10. 博士生是大学的廉价劳动力吗