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

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 快速学习分片集群使用及原理介绍

开发者学堂课程【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

相关实践学习
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
相关文章
|
6月前
38MyCat - 分片规则(自然月分片)
38MyCat - 分片规则(自然月分片)
23 0
|
存储 负载均衡 NoSQL
分片集群使用及原理介绍(二)|学习笔记
快速学习分片集群使用及原理介绍
250 0
分片集群使用及原理介绍(二)|学习笔记
|
运维 NoSQL 数据可视化
复制集使用及原理介绍(一)|学习笔记
快速学习复制集使用及原理介绍
118 0
复制集使用及原理介绍(一)|学习笔记
|
SQL 运维 NoSQL
复制集使用及原理介绍(二)|学习笔记
快速学习复制集使用及原理介绍
217 0
复制集使用及原理介绍(二)|学习笔记
|
存储 SQL NoSQL
分布式事务与数据分区(一)|学习笔记
快速学习分布式事务与数据分区(一)
171 0
分布式事务与数据分区(一)|学习笔记
|
存储 分布式数据库 数据库
分布式事务与数据分区(三)|学习笔记
快速学习分布式事务与数据分区(三)
53 0
|
存储 SQL 弹性计算
分布式事务与数据分区(二)|学习笔记
快速学习分布式事务与数据分区(二)
127 0
分布式事务与数据分区(二)|学习笔记
|
存储 弹性计算 算法
分布式事务与数据分区(四)|学习笔记
快速学习分布式事务与数据分区(四)
116 0
|
存储 缓存 运维
第七节:X-Paxos 三副本与高可用(一)|学习笔记
快速学习第七节:X-Paxos 三副本与高可用(一)
252 0
第七节:X-Paxos 三副本与高可用(一)|学习笔记
|
存储 缓存 AliSQL
第七节:X-Paxos 三副本与高可用(四)|学习笔记
快速学习第七节:X-Paxos 三副本与高可用(四)
89 0
第七节:X-Paxos 三副本与高可用(四)|学习笔记

热门文章

最新文章