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
相关文章
|
8月前
|
运维 NoSQL 安全
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。 适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。
679 1
|
1月前
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
18天前
|
存储 负载均衡 NoSQL
MongoDB的分片功能
【6月更文挑战第6天】MongoDB的分片功能
21 1
|
1月前
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
1月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
17天前
|
存储 监控 NoSQL
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
|
8月前
|
NoSQL MongoDB
MongoDB分片+副本集高可用集群的启停步骤
MongoDB分片+副本集高可用集群的启停步骤
179 0
|
1月前
|
NoSQL MongoDB
搭建MongoDB分片式集群
搭建MongoDB分片式集群
39 0
|
10月前
|
存储 NoSQL MongoDB
MongoDB-分片片键
?> 那么紧接着上一篇的文章内容,如何将数据存储到不同的分片服务器上的? 答:通过分片片键
55 0
|
9月前
|
存储 NoSQL MongoDB
MongoDB分片教程
MongoDB分片教程
230 0