分片集群使用及原理介绍(一)|学习笔记

简介: 快速学习分片集群使用及原理介绍

开发者学堂课程【MongoDB 快速入门分片集群使用及原理介绍】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/49/detail/1003


分片集群使用及原理介绍(一)


内容介绍:

一、分片集群的基本架构

二、shard key(分片键)

三、chunk&Balancer

四、集群管理


一、分片集群的基本架构

这节课学习 MongoDB 分片集群的使用及原理介绍,本节课分为四个部分,分别是分片集群的基本架构、shard key(分片键)、chunk&Balancer、集群管理的相关知识。首先学习分片集群的基本架构,为什么要使用分片集群,分片集群的基本架构,Database 的主分片,以及如何对集合进行分片。

1、为什么要使用分片集群

首先为什么要使用分片集群,在前面学到的副本级的课程当中,已经帮助解决读请求扩展,高可用等问题,随着业务场景的进一步增长,还可能出现存储容量超出了单机磁盘容量,可能会遇到活跃数据集超出单机内存容量,很多读请求需要从磁盘读取,还可能会遇到写入量超出单击IOPS。遇到这种情况,可能会想到两种解决方案,一种是垂直扩容(Scale Up),另外一种是水平扩容(Scale Out)。垂直扩容指的是用更好的服务器比如提高CPU处理核数、内存、带宽、网卡等。水平扩容实际上随着容量的增长,花费会呈现出一个指数性增长,而且随着容量增长,垂直扩容的方式会遇到一个容量的瓶颈。水平扩容则是将任务分配到多台的计算机上去,随着容量增长,花费也呈现出线性增长。

2、什么是 MongoDB 分片集群

MongoDB 分片集群是对数据进行水平扩容的一种方式,MongoDB 使用分片集群来支持大数据集和高吞吐量的业务场景。

3、分片集群的基础架构

上面蓝色的部分是集群的入口,叫做Mongos,Mongos负责对请求进行路由分发和合并,通常情况下会部署多个Mongos来保证高可用,黄色部分是config serves,来存储集群的元数据信息和集群配置。下面绿色部分是shard,实际存储用户数据,不同的shard会保存不同的用户数据,config server和shard也通常会部署为副本集来保证高可用。

image.png

4、如何链接分片集群

当拥有了一个分片集群以后,driver需要通过连接mongos来达到和整个集群交互的目的,而mongos则会根据客户端的请求向后端不同的shared进行请求的发起,比如访问集合1,对集合1进行读写,mongos会对shard A和shard B进行请求交互,而如果读写集合2,那么mongos只会和shard A进行交互。右面是在阿里云mongo上申请的分片集群,可以看到已经帮助列举出来了mongos的链接地址,并且帮助拼接好了Connection StringURI。如果使用单个Mongos进行连接,可能会有单点的风险,所以这里推荐使用Connection StringURI进行访问,简要回顾一下Connection StringURI:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/database][?options]]各个组成部分:首先是mongodb://,这是一个前缀代表这是Connection StringURI的链接地址,而后面则是指定的用户名username和pass world,用冒号进行分割。接下来是指定的多组后端server地址,需要指定每组地址的host和port。再后面需要知道MongoDB的账号需要和数据库进行健全,所以后面则是指定指定健全数据库的名称,最后一部分是指定额外链接的选项。这里给出一个例子,mongodb://user:password@mongos1:3717,mongos2:3717/admin比如用户名为user 密码为password,然后连接Mongos1和mongos2,端口都是3717,健全数据库是admin.这样的一个Connection StringURI。

5、Database 的主分片

在默认情况下,虽然拥有一个分片集群,但是每个database的集合都是微分片的,会存储在一个固定的shard上,shard会被称为database的primary shard。在创建一个新的database的时候,系统会根据每个shard目前的存储量,选择一个数据量最小的shard,作为新database的primary shard。

image.png

6、如何将集合进行分片

既然database的数据都集中在一个shard上,如何将数据打散,MongoDB将数据进行分片支持集合级别,已经被分片的集合被切分为多份保存在shard上。这里需要用到sh命令集中的两个子命令,分别是enableSharding和shardCollection。enableSharding是用来标识database是一个sharding的状态,只需要传入database的名称就可以。shardCollection是实际对集合进行分片,需要指定目标的集合并指定shard key。MongoDB是基于shard key对集合的数据进行打散。Shard key是一个bisin的结构,需要传入一组或多组的key和direction的组合,key是分片键字段的名称,direction可以传入1、-1或者是hashed,1和-1表示是一个基于范围的分片键字段,hashed则表示一个基于哈希的分片键。举例:sh.shardCollection(“records.people”,{zipcode:1}),对records.people的集合进行分片,是一个基于zipcode的范围分片,可以参考这个例子。

image.png


二、Shard key 分片键

前面提到 Shard key,即分片键,继续认识分片键。分片键的两种形式是范围分片和哈希分片,如何选择合理的分片键,分片键有哪些约束以及基于分片键的分发机制。

1、分片的两种形式

首先是分片的两种形式,范围分片和哈希分片。根据Shardkey的值进行数据分片,称为范围分片。比如通过上面的图可以看到这是一个基于x的范围分片,数据被分为了四部分,切割点分别为x是-75、25和175,可以看到值相近的数据是相邻的,这种情况下可以很好地满足范围查询的需求。但是如果基于分片键的单调写入,由于所有的写入都会被最后一个chunk来承载,所以就无法扩充写能力。另外需要注意的是,可以指定多个字段的范围分片,比如可以指定基于x的范围分片,也可以指定x和y的范围分片。哈希分片是根据Shardkey的值计算哈希值,就哈希值进行数据分片,比如根据上面的图可以看到x依次是25、26、27,经过哈希计算后数据被打散到不同的chunk上。哈希分片对于基于分片键单调的场景,可以充分地扩充写能力,但是不能高效的进行范围查询。需要注意的是哈希分片仅支持单个字段,比如可以指定基于x的哈希分片,另外在4.4以后,可以将单个字段的哈希分片和一个到多个的范围分片键字段进行组合。比如可以指定{x:1,y:“hashed”},这种方式在4.4的版本是可以被接受的。

image.png

2、如何选择合理的分片键

一个合理的分片键可以让数据在shard间尽可能的负载均衡,这里遵循几个原则:首先是分片键的基数,基数是越大越好,比如以性别为分片键,数据最多被拆分为两份,以月份为分片键数据会被拆分为12份。这种情况极有可能引起数据的不均。另外一点是选择分片键的频率,指的是一个文档中出现某个值的频率,频率越低越好。比如记录全国人口的集合,以当前所在的城市做为分片键:大多数数据集中在一线城市所在的chunk。也会引入极度的数据不均衡。另外一点是数据基于分片键单调写入的。比如记录日志集合,使用日志生成时间做为分片键:如果适用范围分片,数据写入只会在最后一个shard,就像之前提到范围分片的时候提到的。所以如果是基于分片键进行单调写入的需要使用哈希分片会更加的友好。

3、分片键的约束

首先分片键必须是一个索引,对于非空的集合必须在shardCollection前创建索引,对于空集合shardcollection会自动创建分片键对应的索引。在4.4之前shardkey的大小不能超过512字节,哈希分片键也只能支持单个字段,文档当中必须包含分片键,而且分片键字段是不可以被修改的,在4.4当中,这些限制都被做了一定程度上的放开,shardkey的大小不会再有限制,而且支持复合哈希分片键,就是将一个单字段的哈希分片键和一个到好多个范围的字段进行组合。在4.4当中,文档中可以不包含分片键,在这种情况下,插入的时被当做null处理。4.4也提供了一个refineCollectionShardkey的命令,用来修改shardkey对应的字段。,在4.2之前shardkey对应的值是不可以被修改的。在4.2之后,如果shardkey不是_id字段,是可以被修改的。

image.png

进一步认识refineCollectionShardkey,这是4.4新增的命令,通过分片键增加后缀字段的方式来修改分片键。执行这个命令首先要指定目标集合,然后指定新的分片键,新的分片键必须要以当前的分片键为前缀,也就是在指定新分片键的时候要先指定当前的分片键。随后可以指定一组或多组的key或direction的组合,direction同时可以传入1、-1或是hashed。比如1就是范围分片键,hashed就是哈希分片键。同样的新的shardkey对应的索引在refineCollectionShardkey执行前须已经创建完成。需要注意refineCollectionShardkey只会修改config节点上的元数据,不会有任何数据迁移,数据的打散随后续正常分裂和迁移而完成。最后两点如前面所提到的,4.4版本中支持了sharskey文档中缺失的情况,,会被当做null来处理,是为了应对并不是所有的文档都存在新的shardkey的所有字段。在4.4中支持了复合哈希分片键。

image.png

4、特定目标的操作(Targeted Operations)vs广播的操作(Broadcast Operations)

既然已经了解分片键,Mongos是如何基于请求中的分片键信息来做请求转发的,有两种转发行为,一种叫做特定目标的操作,一种叫做广播的操作,如果能根据分片页算出目标 shard,发起请求并返回结果,称为特定目标的操作。如图是以A为shardkey,如果请求带了A字段,mongos 就可以识别它的目标 shard,比如说shardB,就可以直接与 SharbB 进行交互,获取结果并返回给客户端。包含分片键的查询操作,基于分片键的更新、删除操作、以及所有的插入操作都是特定目标的操作类型。广播的操作是将请求发送给所有 shard,合并查询结果并返回给客户端。比如像不包含分片键的查询操作或者是基于_id 字段的更新、删除操作,这些操作是没有办法知道他的目标shard是哪一个的,所以 mongos 需要将请求发送给后端所有的shard,并收集结果返回给客户端。

image.png

相关文章
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
1308 1
|
SQL 消息中间件 监控
​实战:Flink 1.12 维表 Join Hive 最新分区功能体验
我们生产常有将实时数据流与 Hive 维表 join 来丰富数据的需求,其中 Hive 表是分区表,业务上需要关联上 Hive 最新分区的数据。上周 Flink 1.12 发布了,刚好支撑了这种业务场景,我也将 1.12 版本部署后做了一个线上需求并上线。对比之前生产环境中实现方案,最新分区直接作为时态表提升了很多开发效率,在这里做一些小的分享。
​实战:Flink 1.12 维表 Join Hive 最新分区功能体验
|
缓存 监控 NoSQL
【MongoDB 专栏】MongoDB 的内存管理与优化
【5月更文挑战第11天】MongoDB的内存管理优化对性能至关重要,涉及数据缓存、索引及执行操作的内存使用。动态内存管理根据访问模式和负载调整,可通过配置参数优化,如设置合适缓存大小,调整内存分配参数。索引管理也很重要,需定期评估优化,避免内存占用过高。监控内存使用、数据清理压缩、架构规划也是优化手段。面对挑战,如高并发下的内存不足,需灵活调整策略,平衡系统资源。不断学习新方法,提升内存管理能力,以优化MongoDB性能。
976 2
【MongoDB 专栏】MongoDB 的内存管理与优化
|
机器学习/深度学习 人工智能 自然语言处理
大语言模型的应用探索—AI Agent初探!
大语言模型的应用探索—AI Agent初探!
559 0
|
NoSQL JavaScript 安全
精心操作MongoDB:删除数据库的关键步骤和重要事项
精心操作MongoDB:删除数据库的关键步骤和重要事项
1118 0
|
存储 SQL 关系型数据库
ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
ClickHouse的MergeTree系列引擎是其高性能大数据存储的核心,特别适合大量数据的快速插入。数据按主键排序,支持分区和数据副本,提供数据采样功能。建表时,通过`ENGINE = MergeTree()`指定引擎,`ORDER BY`指定排序键,可选`PARTITION BY`分区,`SAMPLE BY`进行采样。此外,MergeTree支持多种索引和设置,如`index_granularity`控制索引粒度。查询时,ClickHouse利用主键和索引来高效检索数据,尤其在使用等值或范围条件时。
1049 0
|
缓存 Java Linux
中文字体安装
中文字体安装
886 0
|
存储 负载均衡 NoSQL
分片集群使用及原理介绍(二)|学习笔记
快速学习分片集群使用及原理介绍
577 0
分片集群使用及原理介绍(二)|学习笔记
|
存储 固态存储 安全
阿里云8核8G、8核16G、8核32G、8核64G等8核CPU云服务器收费标准与活动价格参考
阿里云8核CPU云服务器多少钱?一般来说企业用户选择8核8G和8核16G配置比较多,企业用户通常会选择8核16G以上,例如8核32G、8核64G等。我们在实际购买中会发现,相同cpu核数的云服务器,还有不同的云服务器实例可选,价格差别也比较大,今天小编整理一份阿里云服务器8核CPU活动价格表,以供参考:
3380 0
阿里云8核8G、8核16G、8核32G、8核64G等8核CPU云服务器收费标准与活动价格参考