下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

mongoDB——自动分片介绍及简单实现

作者:课课家教育     来源: http://www.kokojia.com点击数:2097发布时间: 2017-08-12 08:00:25

标签: 数据库mongoDB自动分片

  mongodb做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情。MongoDB也在集群,分片,复制上也有相当不错的的表现。

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

  简介

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

  MongoDB分片的原理:

 mongoDB——自动分片介绍及简单实现_数据库_ mongoDB_自动分片_课课家教育

  mongos:客户端只需要对mongos进行操作就行了,至于如何进行分片,不需要客户端参与,由mongos和config来完成。

  mongod:一个普通的数据库实例,如果不分片的话,我们直接连接的就是mongod。

  手动分片

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

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

  自动分片

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

  分片前:

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

  分片后:

 “片”是一个独立的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也会自动平衡数据和负载,是最后每片的流量基本相同!

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

  实例演示:

  首先准备四个mongodb服务器,F:\\mongos\\F:\\mongodb1F:\\mongodb2F:\\mongodbConfig

  1.开启config服务器

  因为mongos要把mongod之间的配置放到config服务器里面,所以,首先应该开启config服务器。

 1.开启config服务器    因为mongos要把mongod之间的配置放到config服务器里面,所以,首先应该开启config服务器。

  2.开启mongos服务器

  在开启mongos时,指定config服务器。

2.开启mongos服务器    在开启mongos时,指定config服务器。

  3.开启mongod1,mongod2服务器,对于分片来说,也就是要添加片了。

 3.开启mongod1,mongod2服务器,对于分片来说,也就是要添加片了。

 3.开启mongod1,mongod2服务器,对于分片来说,也就是要添加片了。

  4.将27022和27023两台服务器交给mongos管理

  runCommand执行添加分片

 4.将27022和27023两台服务器交给mongos管理    runCommand执行添加分片

  下一步就是设置片键,也就是告诉mongos如何切分数据。首先用enablesharding()开启数据库分片功能,然后指定集合中分片的键。

  下一步就是设置片键,也就是告诉mongos如何切分数据。首先用enablesharding()开启数据库分片功能,然后指定集合中分片的键。

  5.执行数据,查看效果

  通过mongos向数据库中插入10w条数据,通过printShardingStatus命令查看mongodb的数据分布情况。

 5.执行数据,查看效果    通过mongos向数据库中插入10w条数据,通过printShardingStatus命令查看mongodb的数据分布情况。

  shards:已分为了两个片shard0000,shard0001

  databases:显示admin未分片,test数据已分片,对user这个集合进行了分片,片键为name。

  chunks:显示user集合被分成三块:从无穷小到0,从0到9999,从9999-maskey。

  分片机制增强了mongoDB的写扩展性。使用分片机制能够很好的解决下面几个问题:

  1.存储的数据接近或者超过一个单独节点的存储能力。

  2.系统有效工作集的大小将要超过系统的最大RAM

  3.系统有大量的写操作。

  小编结语:

  更多内容尽在课课家教育!

赞(22)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程