MongoDB Sharding 请勿复用已删除的 namespace-阿里云开发者社区

开发者社区> 张友东(林青)> 正文

MongoDB Sharding 请勿复用已删除的 namespace

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

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

_2019_08_01_3_20_51

集合分片原理

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 确保相关数据被正确清理,并且路由信息被更新。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10014 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13814 0
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 更新和删除)--学习笔记
- 整体更新 - 更新字段 - 字段操作 - 数组操作 - 删除
80 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11880 0
git统计某一名开发者有效代码总行数以及历史删除、增加的总行数
git统计某一名开发者有效代码总行数以及历史删除、增加的总行数 git命令: git log --author="zhangphil" --pretty=tformat: --numstat | gawk '{ add...
2640 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7338 0
C# 通过传入节点name及节点value,来删除XML相应节点
//通过传入节点name及节点value,来删除相应节点 public static string OperateXml(string keyInfo, string valueInfo) { if (File.Exists(filePath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc
1147 0
+关注
张友东(林青)
阿里云高级技术专家
105
文章
18
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载