当前位置: 首页 > 科技观察

《一起学mongodb》第3卷分片集群

时间:2023-03-15 14:59:54 科技观察

前言上一篇介绍了mongo的三种部署方式,“单点、主从、副本集”三种部署方式,今天给大家讲讲最后一个“分片”cluster”的方式,shardedcluster也是mongo作为万亿级数据库的核心魅力所在。还有一种说法是:“你连分片集群都不知道,还好意思说你用过mongo?”Sharding集群架构就不多说了。先抛一张shardedcluster的架构图。在分片集群中,mongos分为三个角色:路由层,主要用于处理客户端请求,将客户端连接到shardconfigserver:主要用于存储分片集群的元数据和配置信息shard:每个分片相当于一个mongod数据库实例,用于存储数据。整个数据库会“分散在不同的分片中”,每个分片都满足高可用,一般是一主两从(建议部署副本集架构),分片数最大可达1024个。一个集群由多个分片组成,一个分片存储多个分块(每个分块包含一定范围的分片键的数据,不相交组合成所有数据),一个分块包含多个文档。那么问题来了——mongoDB是如何做数据分片的呢?mongo提供了“数据分片的三种方式”hash分片,这是很多技术最常用的方法,就是通过hash对数据进行哈希处理,在不同的机器上播放,实现“均匀分布”,但是它的大问题是“数据不连续”。比如业务需要查询工资在10000-20000之间的人员,可能需要遍历每个shardRangesharding是一种直接根据shardkey的范围决定分片的策略。比如现在我们逻辑上把数据分成四块。在数据上,数据工资是0~5000一个块,5000~10000一个块,10000~15000一个块,15000~20000一个块,20000~25000一个块,25000以上一个块,因为工资分配的公司人员大概率是5000~15000,在这个区域,数据会过度集中在5000~10000和10000~15000这两个块,造成“数据分布不均”,但之后“范围查询会更多”高效”的Zonesharding简单来说,Zone其实是rangesharding的另一种版本。你为一定范围的shardkey定义一个Zone,然后在这个Zone中添加一些shard,那么这个范围内的数据最终都会存储在这个Zone中的shard上。Chunk(块)拆分随着数据慢慢写入,数据量越来越大。当Chunk增长到指定大小(默认为64MB)时,MongoDB将拆分Chunk。Chunk分裂的方式分为手动触发和自动触发:只有在insert和update操作发生时才会触发自动block分裂。JumboChunk是可以“只包含一个唯一的ShardKey”的最小Chunk,这样的Chunk是不可分割的。那么如果数据分片不均匀,mongoDB怎么办呢?这时候就要说到我们的“平衡器(balancer)”,它是用来“确保collection的chunk在每个shard上都是平衡的”。当部分分片的数据不均匀时,平衡器会向切割器发出命令,将需要移动的分片上的数据进行切割,然后将数据移动到数据较少的分片上。具体步骤如下:balancer向sourceshard发送moveChunk命令。sourceshard收到命令后,会启动自己内部的moveChunk命令。如果客户端在数据移动过程中发送读取或写入请求,它将发送到源分片。目标分片开始向源分片请求要移动的数据块的文档,准备拷贝文档数据。当目标分片收到块的最后一个文档时,目标分片将启动同步过程以检查是否所有文档都已被复制。同步完成后,目标分片会连接到配置服务器,更新元数据列表中数据块的地址。目标分片完成元数据更新后,源分片会删除原来的数据块。如果有新的数据块需要移动,则可以继续移动。配置服务器会通知monogs进程更新自己的映射表。迁移过程对应用程序是透明的,但由于“迁移过程会占用相应节点的CPU和带宽资源”,对分片集有一定的性能影响,对运维有一定的限制操作。是否可以在对集合进行分片后更改分片键?“否”在MongoDB中对集合进行分片后,不自动支持更改分片键。如果集合分片后必须改变shardkey,可以这样:将MongoDB中的所有数据转储为外部格式,比如可以先放到mysql中。删除原始分片集合。使用新的分片键配置分片。预拆分分片键范围以确保初始均匀分布。将转储的数据恢复到MongoDB中。mongos如何处理连接?每个mongos实例“维护一个与分片集群成员的连接池”。客户端“一请求占一连接”,客户端请求完成后释放连接。但是当客户端数量减少时,这些池不会缩小。这会导致未使用的mongos占用大量打开的连接。如果不再使用mongos,则可以安全地重新启动进程以关闭现有连接。综上所述,今天的内容只讲分片集群。看完以上内容,我们再来看看下面的问题《mongoDBsharding集群架构是什么?三种分片方式是什么?blocksplitting是什么?为什么会有blocksplitting?之间的负载均衡是怎样的?shardsdone?如何修改shardkey?mongos如何管理与shards的连接?“你知道吗?