MongoDB学习十四 --MongoDB的分片

来源:互联网 发布:数据字典怎么画 编辑:程序博客网 时间:2024/05/16 14:53

本来想一口气写完的,无赖前段时间报名学车,驾校临时安排一两个星期练车,时间又不停的改、改、改!搞的我这博客文章都好久没加上了,今天打算写上一篇MongoDB的分片技术,算是这一系列的操作使用的一段的结尾。

在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存就吃不消了,针对这样的场景我们该如何应对?mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案。。理论前一篇的Sharding Introdution有说,但这里还是简单说一下:

(1)工作原理
MongoDB分片的基本原理是把集合分成更小的chunks。这些chunks可以分散到不同的shards,每个shard负责集合的一部分。应用程序不会知道哪个分片有哪些数据,甚至不知道数据被放到了不同的shards。只有在shards的前端运行的路由进程mongos,才知道所有的数据放在哪,应用程序连接mongos,就可像平常一样发起查询。
(2)chunks
分割按有序分割方式,每个shard上的数据为某一范围的数据块(一个shard含有一个集合的多个chunk),故可支持指定分片的范围查询。数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。
(3)  shared key
分片的关键在于shard key。通过shard key划分每个shard上的chunk。比如,根据集合的title字段做shard key,分为三个shard,那么,分成A-F开头的文档chunk,G-N开头的文档chunk,及O-Z开头的文档chunk,将分别存储于三个shard中。当增加或者删除一个shard时,chunk块将重新划分,不过,mongodb会使每一个shard在负载和总量上保持平衡。一个高访问量的shard拥有的数据可能比一个低访问量的shard少。
对已经存在的集合,如果该集合都在一个shard上,增加一个新的shard,按照集合的title作为shard key分片,那么,mongodb会按照title的开头字母将这个集合分成两个chunk,其中一个chunk将会被移动到新增的shard中。
被查询的数据,不论来自于1台shard,还是在所有shard中获取,都是由mongos来统一整理的。

借用下这张图,最少的一个分片环境,最少需要四台,这样才能看到与真实环境差不多的实际效果,我在自己的公司的环境操作,用了三台,mongod只用了一台,但也是有效果的。下这张图解释:

     人脸:       代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的。

     mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合....

                     好了,mongos就是一个路由服务器,它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群,数据

                    和片的对应关系以及相应的配置信息保存在"config服务器"上。

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

下面就是实操了,有文字和截图:

1:开启config服务器, 202(这是IP:192.168.0.202)机器上运行 mongod --dbpath=D:\ProgramFiles\MongoDB\db

202 config server

2: 开启mongos服务器,这里要注意的是我们开启的是mongos,不是mongod,同时指定下config服务器。149机器上运行mongos --configdb=192.168.0.202:27017

149mongos

3:启动mongod服务器,对分片来说,也就是要添加片了,当然这里只是启动,因为机器原因,我这只启了一台。在148机器上运行mongod --dbpath=/data/db/

148boot

4: 服务配置,还差最后一点配置我们就可以大功告成,在149上连接到时admin数据库,添加分片148。

005

添加分片sh.addShard("192.168.0.148:27017")

s001

这里要注意的是,在addshard中,我们也可以添加副本集,这样能达到更高的稳定性。

片已经集群了,但是mongos不知道该如何切分数据,也就是我们先前所说的片键,在mongodb中设置片键要做两步
①:开启数据库分片功能,命令很简单 enablesharding(),这里我就开启test数据库。
②:指定集合中分片的片键,这里我就指定为person.name字段。

sh.enableSharding("test")

sh.shardCollection("test.person", {"name": 1})

s002

切换数据库,添加数据

s003

5: 查看效果,好了,至此我们的分片操作全部结束,接下来我们通过mongos向mongodb插入10w记录,然后通过printShardingStatus命令查看mongodb的数据分片情况。

s004

这里主要看三点信息,虽然只有一台shard,但是,存储还是分片了的:
① shards:     我们清楚的看到只有一个片,shard0000和其host,就是我们上面添加进去的。
② databases:  这里有个partitioned字段表示是否分区,这里清楚的看到test已经分区。
③ chunks:     这个很有意思,我们发现集合被砍成三段:
 无穷小 —— Luck1,Luck1 ——Luck6Luck6——无穷大。
 分区情况为:这里系统自动分配的几个片,与实际情况添加多台机是不一样的,即使只有一台,MongoDB也会按一定规则分配几个片出来。

0 0