学习MongoDB--(10-1):分片(简介 & 自动分片 & 片键)

分片(增加服务器,水平扩展)是MongoDB的扩展方式,通过分片能过增加更多的机器来应对不断增加的负载和数据,还不影响应用。

【简介】

分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。在关系型数据库中,当一个表太大(超过几亿行数据)时,我们也有分表的做法,和这里的分片是类似的概念。

手动分片:当我们应用的瓶颈出现在数据库系统时,如果我们使用的是关系型数据库,我们通常要进行手动分片。即通过我们的应用层代码去维护与若干个数据库系统的连接,并且每个连接都是独立的。我们应用层代码负责屏蔽底层的多个数据库实例,查询时导向到特定的实例上进行,这种方式有个缺点,就是维护起来太麻烦!比如向底层数据库集群添加或删除节点,调整数据分布和负载模式等,都是对我们这层应用层代码提出不小的挑战!

MongoDB从设计时考虑的就是横向扩展,其支持自动分片!我们可以很轻松的向一个MongoDB数据库服务器集群添加或删除机器,集群会自动切分数据、进行负载均衡!

【自动分片】

“片”是一个独立的MongoDB服务(即mongod服务进程,在开发测试环境中)或一个副本集(在生产环境中)。将数据分片,其思想就是将一个大的集合拆成一个一个小的部分,然后放置在不同的“片”上。每一个“片”只是负责总数据的一部分。自动分片就是:应用层根本不知道数据已被分片,也全然不会知道具体哪些数据在哪个特定的“片”上。在MongoDB中,提供了一个路由服务mongos,在分片之前需要先运行这个服务,这个路由服务具体知道数据和“片”的关系。应用程序和这个路由服务通信即可,路由服务会将请求转发给特定的“片”,得到响应后,路由会收集响应数据,返回给应用层程序。下面两幅图展示了不使用分片和使用分片,用户发送请求的处理路径:

分片前:

 

分片后:

 

那我们该何时给我们的老系统(上图)改进为分片后的新系统(下图),通常有如下原则:

1》 机器的磁盘不够用了,数据量太大

2》 单个mongod已经无法满足写数据的性能需要了(这里复习一下,如果想要增加读性能,较好的方案是采用搭建主从结构,且让从节点可以响应查询请求)

3》 想将大量的数据放到内存中提高性能,一台机器的内存大小永远有极限(这就是纵向扩展和横向扩展的区别)

 

【片键】

设置分片时,需要从集合中选取一个键,用该键作为数据拆分的依据。这个键就称为“片键”。我们可以提供一个简单的例子,对于一个存储人员信息的集合users,我们要将其分片,选择的片键是人员姓名name,则最后分片的结果就可能为:第一片中存放的人员名称是A-F开头的,第二片中是G-P开头的,第三篇中是Q-Z开头的。当用户提交的查询是:db.users.find({"name" : "jimmy"}),该查询请求会分配给第二片进行处理;当用户提交的查询是:db.users.find({"name" : {"$lt" : "j"}},则这个查询请求会被分配给第一片和第二片进行处理;当用户提交的查询并不包含片键的信息,则这个查询会被发送到所有片上进行处理。对于插入操作,路由服务会根据插入文档的键name对应的值将这个请求发送到特定片上进行!这就是片键的作用。

随着数据的增减,可能会出现某一片负载很大,另一片负载轻松的情况,对于这种情况,MongoDB也会自动平衡数据和负载,是最后每片的流量基本相同!

对于选择哪个键作为片键?有个原则就是,片键应该有较多变化的值,如果片键设定为性别,只有“男”和“女”两种值,则这个集合就最多被分为两片,如果集合太大,这种分片不会最终解决效率的问题!这里我们可以看出,片键的选择和创建索引时键的选择原则是相似的,实际使用中,通常片键就是创建索引使用的键!

 

这里先介绍一下分片的简介和原理等内容,下一篇我们会搭建自己的第一个分片出来!

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值