59

MongoDB Sharding 请勿复用已删除的 namespace 原 荐

 5 years ago
source link: https://www.tuicool.com/articles/3Mra6nZ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
eMVvUzR.jpg!web

MongoDB Sharding 请勿复用已删除的 namespace

  阿里云云栖社区 发布于 38分钟前

字数 818

阅读 5

收藏 0

MongoDB

撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> QNJNvmJ.png!web

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

rANJNjN.png!web

集合分片原理

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

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

config.collections
config.chunks

删除分片集合流程

  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 !

© 著作权归作者所有

打印

上一篇: Cloud Toolkit 部署应用到 EDAS Kubernetes 集群

下一篇: 消息点击率翻倍,原来这就是闲鱼背后的神器

y6zA7jb.jpg!web

阿里云云栖社区

粉丝 417

博文 1492

码字总数 3611810

作品 0

朝阳

提问

相关文章 最新文章

28 个 MongoDB NoSQL 数据库的面试问答

MongoDB是目前最好的面向文档的免费开源NoSQL数据库。如果你正准备参加MongoDB NoSQL数据库的技术面试,你最好看看下面的MongoDB NoSQL面试问答。这些MongoDB NoSQL面试问答涵盖了NoSQL数据库...

oschina

2014/01/12

10.6K

16

MongoDB 2.4 RC2 (2.3 开发系列) 发行说明

请注意,该版本还是在测试阶段,请勿在生产环境中使用。 下载地址:http://www.mongodb.org/downloads - Development Release (Unstable) 这里有一份关于 Upgrade MongoDB 2.2 to 2.4 指南。...

oschina

2013/03/08

1K

4

Riak 与 MongoDB 的对比

本文来自Riak所属的Basho公司的技术WiKi,文章从几个方面对Riak和MongoDB进行了对比,这不是一篇PK文章,NoSQLFan翻译给大家,希望本文能让您对Riak和MongoDB有更多的了解。 来源地址:wiki....

红薯

2011/08/06

2.3K

0

mongodb与mysql相比的优缺点

与关系型数据库相比,MongoDB的优点: ①弱一致性(最终一致),更能保证用户的访问速度: 举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情...

烽焱10仴

2013/03/05

0

0

mongodb数据导入导出以及备份恢复

数据导出 mongoexport 假设库里有一张user 表,里面有2 条记录,我们要将它导出 > use my_mongodb switched to db my_mongodb > db.user.find(); { "_id" : ObjectId("4f81a4a1779282ca68fd8......

黄梦巍

2014/10/10

0

0

没有更多内容

加载失败,请刷新页面

加载更多
Topfox 领先的快速开发框架介绍

1. topfox 框架例子 数据库脚本请参考文件 db.sql, 共3张表: 部门表depts, 用户表users, 多主键字段表 salary 使用数据库为 mysql8 框架网址 https://gitee.com/topfox/topfox 2. topfox 用户...

杭州罗平

49分钟前

3

0

57.tomcat介绍 安装jdk和tomcat

16.1 Tomcat介绍 16.2 安装jdk 16.3 安装Tomcat 扩展 java容器比较 http://my.oschina.net/diedai/blog/271367 http://www.360doc.com/content/11/0618/21/16915_127901371.shtml j2ee、j2s......

oschina130111

今天

2

0

YvIBZvi.jpg!web
Java中synchronized与lock的区别与使用场景

synchronized与object对象本身监视器方法notify、wait、notifyAll实现线程等待和通知,Lock与condition搭配实现线程等待/通知。一个对象可以有多个condition,线程可以注册到不同的condition...

鏡中水月

今天

2

0

什么是武汉

本文经微信公众号“星球研究所”授权转载 这是个适合横屏观看的城市 165条江河 日夜奔流 (请横屏观看,左为汉江,右为长江,摄影师@姜轲)▼ 166处湖泊 烟波浩渺 (请横屏观看,武汉东湖,摄...

冰峰雪座

今天

4

0

轻量级内存计算引擎

内存计算指数据事先存储于内存,各步骤中间结果不落硬盘的计算方式,适合性能要求较高,并发较大的情况。 HANA、TimesTen等内存数据库可实现内存计算,但这类产品价格昂贵结构复杂实施困难,...

泡泡糖儿

今天

14

0

yAFjy2A.png!web

没有更多内容

加载失败,请刷新页面

加载更多

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK