MongoDB Sharded Cluster 路由策略

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

如果不了解 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 上。

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

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

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

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

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

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

p24 p25 p26 p28




说明:上述的版本只为介绍原理之用,实际上在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 级别保证应用读到的数据已经成功写入到了复制集的大多数成员。

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

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

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




参考资料

时间: 2024-09-27 11:28:52

MongoDB Sharded Cluster 路由策略的相关文章

MongoDB Sharded Cluster Routing Policy Explained

Sharding is a common method for distributing data across multiple machines to meet the very real demands of big data growth. In this article, I aim to focus on the routing policy for write operations in a MongoDB sharded cluster as well as discussing

MongoDB Sharded cluster架构原理

为什么需要Sharded cluster? MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『可扩展性』,通过json文档来实现灵活模式,通过复制集来保证高可用,通过Sharded cluster来保证可扩展性. 当MongoDB复制集遇到下面的业务场景时,你就需要考虑使用Sharded cluster 存储容量需求超出单机磁盘容量 活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能 写IOPS超出单个MongoDB节点的写服务能力 如上图所示,Shardi

MongoDB · 特性分析 · Sharded cluster架构原理

为什么需要Sharded cluster? MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『可扩展性』,通过json文档来实现灵活模式,通过复制集来保证高可用,通过Sharded cluster来保证可扩展性. 当MongoDB复制集遇到下面的业务场景时,你就需要考虑使用Sharded cluster 存储容量需求超出单机磁盘容量 活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能 写IOPS超出单个MongoDB节点的写服务能力 如上图所示,Shardi

基于BGP/MPLS VPN的宽带IP教育城域网路由策略

摘要:宽带IP城域网,路由规划和设计是核心环节.在建网之初,一定要统筹规划.本文根据城域网的建设实际,采用了基于BGP/MPLS VPN的路由策略,经实践证明是切实可行的. 关键词:BGP MPLS VPN IP 路由策略 1 宽带城域网概况 某市IP教育城域网架构在Cisco GSR 12012之上,两台Catalyst 6509分别作为Cernet和Chinanet的接人节点,采用的是DPT双环宽带(5G)骨干传输技术.为全市 2000余所教育机构.学校及广大的社会用户提供宽带应用服务和In

策略路由和路由策略的区别详解

在网络设备维护上,现在很多维护的资料上都讲到"路由策略"与"策略路由"这两个名词,但是有很多搞维护的技术人员对这两个名词理解的还不是很透彻,无法准确把握这两者之间的联系与区别.本文简单分析一下这两者之间的概念,并介绍一些事例,希望大家能从事例中得到更深的理解. 一.路由策略 路由策略,是路由发布和接收的策略.其实,选择路由协议本身也是一种路由策略,因为相同的网络结构,不同的路由协议因为实现的机制不同.开销计算规则不同.优先级定义不同等可能会产生不同的路由表,这些是最

Exchange 2003如何让不同的发件人地址使用不同的路由策略

问题描述 遇到一个这样的应用场景目前使用单台Exchange2003作为邮件系统,电子邮件地址为chinacontoso.com,根据公司的全球邮件系统策略,所有对外发出的邮件都是通过SMTP连接器转发到美国的ExchangeEdgeServer以Contoso.com的电子邮件格式统一发送.目前有一个新的需求,公司收购了ABC公司,ABC的员工要使用ABC.com的域名接收发送邮件,在Exchange2003上建立ABC.com的收件人电子邮件策略应用到ABC.com的员工账号上,现在想实现通

Linux的高级路由和流量控制:路由策略数据库

如果你有一个大规模的路由器,你可能不得不同时满足不同用户对于路由的不同需求.路由策略数据库可以帮助你通过多路由表技术来实现. 如果你想使用这个特性,请确认你的内核配置中带有 "IP: advanced router" 和 "IP: policy routing" 两项. 当内核需要做出路由选择时,它会找出应该参考哪一张路由表.除了 "ip" 命令之外,以前的 "route" 命令也能修改 main 和 local 表. 缺省规

MongoDB readConcern 原理解析

MongoDB 可以通过 writeConcern 来定制写策略,3.2版本后又引入了 readConcern 来灵活的定制读策略. readConcern vs readPreference MongoDB 控制读策略,还有一个 readPreference 的设置,为了避免混淆,先简单说明下二者的区别. readPreference 主要控制客户端 Driver 从复制集的哪个节点读取数据,这个特性可方便的实现读写分离.就近读取等策略. primary 只从 primary 节点读数据,这个

MongoDB sharding迁移那些事(二)

如果不了解 MongoDB Sharded Cluster 原理,请先阅读 MongoDB Sharded cluster架构原理 关于MongoDB Sharding,你应该知道的 关于 sharding 迁移,会分3个部分来介绍,本文为第二部分 负载均衡及迁移策略 chunk 迁移流程 Balancer 运维管理 moveChunk 命令 从MongoDB sharding迁移那些事(一) 我们了解到,Chunk 迁移可能是 Balancer 触发,也可能用户手动向 mongos 发送 mo