MongoDB Sharded Cluster 路由策略

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 本文是对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 功能进行分析后发现,问题其实很好解决,涨知识了
508 0
|
2月前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
6月前
|
存储 监控 NoSQL
MongoDB索引解析:工作原理、类型选择及优化策略
MongoDB索引解析:工作原理、类型选择及优化策略
|
6月前
|
NoSQL 定位技术 MongoDB
深入探索 MongoDB:高级索引解析与优化策略
深入探索 MongoDB:高级索引解析与优化策略
189 1
|
6月前
|
NoSQL 定位技术 MongoDB
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
104 0
|
7月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
277 3
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
7月前
|
存储 NoSQL 安全
【MongoDB 专栏】MongoDB 的备份与恢复策略
【5月更文挑战第11天】MongoDB的备份与恢复至关重要,确保数据安全、完整和可用。数据库提供文件级和逻辑备份,前者简单直接但可能需短暂停机,后者灵活可选特定数据。备份策略要考虑频率和存储位置,恢复时要验证数据完整性,选择合适恢复点。增量和差异备份可提升效率,监控管理备份是必要环节。案例显示,有效策略能降低意外损失。随着技术发展,应持续优化策略,强化人员培训,以责任和使命对待备份恢复,保障企业数据环境的安全稳定。
106 1
【MongoDB 专栏】MongoDB 的备份与恢复策略
|
7月前
|
监控 NoSQL MongoDB
MongoDB索引机制与优化策略详解
【4月更文挑战第30天】本文深入解析MongoDB的索引机制,包括单字段、复合、地理空间、全文及哈希索引。介绍了创建与查看索引的方法,并提出了优化策略:选择性创建、使用复合索引、定期审查优化、避免不必要的索引扫描、利用索引前缀与覆盖索引,以及监控索引使用。通过这些策略,可提升MongoDB查询性能。
|
NoSQL 安全 Shell
MongoDB 安全策略:验证和授权
对于新安装的 MongoDB ,它是没有开启身份验证的。需要进入 admin 数据库,创建一个 root 角色的超级管理员用户。之后再针对具体应用的数据库,使用管理员用户为其创建不同权限的用户,从而做到针对数据库安全的基本保障。
2569 0
|
NoSQL MongoDB Docker
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(1)
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(1)
185 0
基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群(1)

相关产品

  • 云数据库 MongoDB 版