mongodb系列之---mongodb 分片

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: Mongodb的分片机制是mongodb数据库的核心机制,也是其可用性高,扩展性好的原因,分片—sharding 的意思就是将数据库数据分散存贮到不同的服务器上,来缓解高并发访问,均衡负载。 举例来说一下,比如说一个collection有TB级别的数据,在传统方式下如果有两个线程要访问其中.

Mongodb的分片机制是mongodb数据库的核心机制,也是其可用性高,扩展性好的原因,分片—sharding 的意思就是将数据库数据分散存贮到不同的服务器上,来缓解高并发访问,均衡负载。

  举例来说一下,比如说一个collection有TB级别的数据,在传统方式下如果有两个线程要访问其中的数据,即使这个线程访问的数据是不同的,为保证同步需要排队等待,分片机制可以很好的解决这个问题,分片机制其实就是分布式的集群,比如现在有五台服务器作为集群,mongodb可以将一个collection的数据分割成5个片---chunk 分别存放到5个server并且mongodb还会记录下每一条数据的位置,这样一来当用户访问集合里面的文档时,mongodb可以根据请求条件来查找到对应数据所在的服务器然后返回数据,这样下来可以将多请求的负责分摊到各个服务器的分片上,大大提高数据库系统的吞吐量。

s1
可以看一下sharding的结构

  最上面Router—路由器顾名思义就是请求转发的功能,具体就是mongodb里面的mongos可执行文件,mongos就是各种数据库请求的入口,mongos解析用户请求,然后将其转发至ConfigServer继续执行,为保证集群的高可用,在集群中一般不只一个mongos入口。

ConfigServer:所以configserver的作用就是为路由器提供分片线索,可以理解为各个不同分片的索引表一样,可以快速查到对应分片,然后就可以去访问shard服务器了。

Shard:数据库的真正的数据存放于shard上面,shard就表示集群中的某一个服务器的mognodb数据库实例。mongos可以统筹管理集群所有数据,mongod则是代表了本地数据库,这是两个不同的入口,如果通过mongod去访问数据库我们只能看到当前这个服务器的数据,mongos入口可以访问到5个服务器的全部数据
我们可以看到mongos路由不止一个,原因很简单,一个高可用分布式集群方案,必须保证服务时刻都可以正常高效运行,在这里在多个服务器配置同样的mongos路由,sh是为了fangzh是为了防止当前使用的路由出现问题而备用的。同样的configserver 同样需要完全相同副本分布在不同的服务器上备用,,shard也一样可以设置副本。

分片的原理:现在我们知道了为什么要把数据分散到不同rontde服务器上去,那么现在需要知道如何将一个collection的数据分片,也就是说分片的依据是什么?
s3
Shard key 分片依据,这个关键字只能去collcetion里面已有的字段,最常见的比如_id。 mongodb会根据我们选定的key来进行分片。
Mongodb为我们提供了两种分片的方式
• 范围分片(Range based sharding)
• hash分片(Hash based sharding)

s4
从上图可以很容易理解这种不同的分片方式,Hash分片:对key进行hash映射,然后决定其存放于那一个分片上去,这种方式是很随机的。Range分片就是,顺序分片,根据关键字的顺序进行分片
对比一下两种分片方式各有利弊,我简单说一下:
Hash分片:可以选用任何字段作为hash key ,我试过不同的字段,比如有序的字段,String,还是自动生成的_id, 最后的分片的效果都不错,可以均匀的将数据分散到各个服务器上,但是最大的问题是,如果我们选定一个字段作为hash key 我们必须在分片之前在这个字段上建立hash 索引,没错,这里出现了hash索引,还记得我上一篇文章中说到的用hash方式做索引的利弊吗?

  1. 无法进行范围查找
  2. 可能导致索引表过于大,降低内存使用率。
    Mongodb可以建立hash索引当然有它的意义,只不过要看不同的业务场景,不同的业务需求。

Range分片:缺点很容易显现,,上图中我们选中x 字段作shard key x是有序的字段,我们为每一个server设定了映射范围,这样的问题就是容易产生超大chunk的问题,随着X的不断增长,新的数据将会全部投射到最后一个Server 上去,在数据量超大的情况下,数据容易在一个server上聚集,那么就失去了分片的意义,跟一台服务器没有什么区别了。还要注意Range 分片一样需要在分片之前在选定的key 上面建立对应的索引。我试过在mongodb自生成的_id 字段上使用Range 分片,最后的分片效果还是比较均匀的,但是没有hash 分片那么均匀。 还有一点,这样分片的成功也映证了我在索引那一片文章中讲的,系统会在PK上面自动建立主索引。注意我的数据量已经是数亿级别的。Range 分片在一定场景下也具有较好的分片能力。

Ok 在来说说具体的分片操作,这里面还有许多需要注意。以下我通过一个实例collection来讲解分片的过程。
1登陆mongos之后,首先切换到admin 数据库下
user admin
EnableSharding
//if this command work ,you can see the restore process script printed by the server, now you need to //make sure that every collection has been enablesharding, such as

enablesharding 首先激活citi这个collection 分片有效

db.runCommand( { enablesharding :"citi"});

set up the shard key for the collection

the choice of shard key is very important for the date shard

two choice you can try : hashed key or ranged key

here I have some advice for you:

usually we choose _id for the shard key. If you chose hashed shard you need to create a hash index in the field you choose and run this command before you restore data, it turns out that hash shard have a great performance in deal with the big data.

If you choose ranged shard, in case of data gather in one server make sure the _id is not ranged

选取shad key 这里选用_id 作为shard key range 分片方式

db.runCommand( { shardcollection : "pmch.citi",key : {_id: 1} } )
现在我们不断插入数据,看一下分片的情况
s5

s6

s7

相关实践学习
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
相关文章
|
7月前
|
运维 NoSQL 安全
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。 适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。
524 1
|
7天前
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
2月前
|
NoSQL MongoDB
搭建MongoDB分片式集群
搭建MongoDB分片式集群
17 0
|
7月前
|
NoSQL MongoDB
MongoDB分片+副本集高可用集群的启停步骤
MongoDB分片+副本集高可用集群的启停步骤
143 0
|
9月前
|
存储 NoSQL MongoDB
MongoDB-分片片键
?> 那么紧接着上一篇的文章内容,如何将数据存储到不同的分片服务器上的? 答:通过分片片键
43 0
|
8月前
|
存储 NoSQL MongoDB
MongoDB分片教程
MongoDB分片教程
211 0
|
9月前
|
NoSQL MongoDB 数据库
MongoDB-分片集群搭建
搭建配置服务器复制集: • 早期版本的配置服务器只要一台即可 • 最新版本 MongoDB 要求配置服务器必须是一个复制集
196 0
|
9月前
MongoDB-分片查询
用户的请求会发送给 mongos 路由服务器, 路由服务器会根据查询条件去配置服务器查询对应的数据段和属于哪个分片服务器, 如果用户查询的条件是分片片键字段, 那么路由服务器会返回保存在那一台分片服务器上, 路由服务器就会去对应的分片服务器获取数据, 并将取到的数据返回给用户。
106 0
|
9月前
|
NoSQL MongoDB
MongoDB-分片优化
分片的主要目的就是将数据分配到不同的服务器中保存, 提升服务器的容量, 让数据更加的均衡, 更有效的降低服务器的压力, 但是随着时间推移, 某些数据段中保存的数据会越来越多, 所以为了保证个分片均衡, 当某个数据段数据过多或体积过大的时候, 系统就会自动在下一次操作这个数据段时(新增/更新), 将一个大的数据段分裂成多个小的数据段。
126 0
|
9月前
MongoDB-分片结构
分片集群结构 • 分片服务器: 用于保存集合中的一部分数据 • 配置服务器: 用于保存分片数据的数据段和数据范围 • mongos 路由(路由服务器): 用于分发请求到保存对应数据的分片服务器上
56 0