MongoDB Sharded Cluster 路由策略

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 本文是对MongoDB 世界大会上『Life of a Sharded Write』主题分享的总结,这个分享很有意思,主要内容是介绍 MongoDB Sharded Cluster 里写操作的路由策略,以及config server变为复制集后面临的一些挑战。 如果不了解 Sharded Cl

本文是对MongoDB 世界大会上『Life of a Sharded Write』主题分享的总结,这个分享很有意思,主要内容是介绍 MongoDB Sharded Cluster 里写操作的路由策略,以及config server变为复制集后面临的一些挑战。

1

如果不了解 Sharded Cluster 的基础知识,可以先看看这篇文章再回来。

Mongos路由策略

在 Sharded Cluster 里,用户可以将集合的数据以 chunk 为单位分散存储到多个 shard 上。如下图所示,集合的数据按照 shardKey 被切分为 [minKey, -200), [-200, -100), [-100, 0), [0, 100), [100, 200), [200, maxKey)等chunk 范围,并存储在 Shard0, Shard1, Shard2等3个 shard 上。

2

config server 上对应的路由表(route table)类似下图

3

当写入新文档时,mongos 从config server 上获取集合的路由表本地,如写入{shardKey: 150}的文档,则请求被路由到shard1上写入。

mongos 从 config server 上获取到路由表后,会缓存在本地内存,避免每次写入/查询都去 config server 上取表。而在 Sharded Cluster 里,mongos 会自动在 shard 之间迁移 chunk 以均衡负载(用户也可以发送 moveChunk 命令来手动迁移),那么一旦 chunk 发生迁移后,mongos 本地缓存的路由表就会失效,从而请求被路由到错误的 shard,这个问题该如何解决?

MongoDB 的做法是给路由表增加版本信息,比如最初的路由表包含6个 chunk,路由信息的版本为 v6(各个条目版本的最大值)。

4

当[0, 100)从 shard0迁到 shard1之后,条目的版本增加为路由表当前版本再加1, 即变为7,这个信息会记录在 shard 本地,同时也会更新到 config server 里。

5

mongos 在写入时,会带上自身缓存的路由表版本,当请求到达 shard后,shard 发现 mongos 的路由表版本比自己的低,则说明路由表已经发生过更新,这时 mongos 会重新到 config server 上取最新的路由表,然后按新的路由表来写入。 这个设计思路跟阿里开源的 tair KV存储系统非常类似。

6
7
8
9

说明:上述的版本只为介绍原理之用,实际上在3.2的实现里版本是一个(majorVersion, minorVersion)的二元组),当chunk 发生 split 之后,split 之后的所有 chunk minor version增加,当 chunk 在 shard 之间发生迁移时,迁移的 chunk 在目标上增加 major version,并且在迁移源上选择一个 chunk 增加 其major version,这样确保不论是访问到源还是目标,mongos 看到的版本都增加了。

config server 复制集的挑战

3.2版本里,config server 从以前的多个镜像节点换成了复制集,换成复制集后,由于复制自身的特性,Sharded Cluster 在实现上也面临一些挑战。

  • 挑战1:复制集原Primary 上的数据可能会发生回滚,对 mongos 而言,就是『读到的路由表后来又被回滚了』。
  • 挑战2:复制集备节点的数据比主节点落后,如果仅从主节点上读,读能力不能扩展,如果从备节点上读,可能读到的数据不是最新的,对 mongos 的影响是『可能读到过期的路由表,在上述例子中,mongos 发现自己的路由表版本低了,于是去 config server 拉取最新的路由表,而如果这时请求到未更新的备节点上,可能并不能成功的更新路由表』。

应对第一个问题,MongoDB 在3.2版本里增加了 ReadConcern 特性的支持,ReadConcern支持『local』和『majority』2个级别。local 即普通的 read,majority 级别保证应用读到的数据已经成功写入到了复制集的大多数成员。

10

而一旦数据成功写入到大多数成员,这样的数据就肯定不会发生 rollback,mongos 在从 config server 读取数据时,会指定 readConcern 为 majority 级别,确保读取到的路由信息肯定不会被回滚。

应对第二个问题,MongoDB 在majority 级别的基础上,增加了 afterOpTime 的参数,这个参数目前只在 Sharded Cluster 内部使用。这个参数的意思是『被请求节点的最新oplog时间戳必须大于 afterOpTime 指定的时间戳』。

11

Mongos 带着路由表版本信息请求 某个 shard,shard发现自己的版本比 mongos 新(发生过 chunk 迁移),此时shard 除了告诉 mongos 自己应该去更新路由表,还会把自己迁移 chunk 后更新 config server 时的 optime告诉mongos,mongos 请求 config server 时,指定 readConcern 级别为 majority,并指定 afterOpTime 参数,以确保不会从备节点读到过期的路由表。

12
13
14
15

参考资料

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL 关系型数据库 MySQL
MongoDB 慢查询语句优化分析策略
MongoDB查询语句太慢了,开启 Profiling 功能进行分析后发现,问题其实很好解决,涨知识了
441 0
|
NoSQL Java MongoDB
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(3)
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(3)
157 0
|
NoSQL MongoDB Docker
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(2)
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(2)
164 0
|
NoSQL MongoDB Docker
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(1)
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(1)
144 0
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(1)
|
运维 NoSQL MongoDB
(3)MongoDB 副本集运维策略
本文聊一聊 MongoDB 副本集运维窗口期的操作策略,最大程度地减少主节点不可用的时间。
|
存储 安全 NoSQL
云MongoDB网络安全策略和权限管理体系
阿里云MongoDB在市场上实际使用时,如何保障数据库安全性?又是如何防止数据库受到攻击?本文将带领你了解云数据库MongoDB云环境的网络安全策略和MongoDB自身的权限管理体系。
2904 0
|
新零售 NoSQL 物联网
阿里云MongoDB优惠购买策略
云数据库 MongoDB 版是完全兼容 MongoDB 协议、高度兼容 DynamoDB 协议的在线文档型数据库服务,支持Serverless、单节点、副本集、分片集群四种部署架构,能够满足不同的业务场景需要,在互联网(游戏、资讯、社交、电商、直播)、新零售、在线教育、金融、物联网、政企等行业都有广泛的应用。
138 0
阿里云MongoDB优惠购买策略
|
SQL 存储 NoSQL
都 2020了,你该知道MongoDB优化策略了~
都 2020了,你该知道MongoDB优化策略了~
387 0
|
NoSQL 数据库

相关产品

  • 云数据库 MongoDB 版