Mongodb的分片部署

分片也是一种集群,但是跟主从集群(MongoDB的主从部署)和副本集(Mongodb的副本集部署)实现的功能不一样。容易混淆,我们现在来了解分片。

1.什么时候用分片(参考资料:http://www.2cto.com/database/201208/148030.html)

2.分片的原理(参考资料:http://www.cnblogs.com/huangxincheng/archive/2012/03/07/2383284.html)

3.开始部署(参考资料:http://blog.csdn.net/irelandken/article/details/8003203#comments)

4.分片的管理(参考资料:http://www.2cto.com/database/201208/148030.html)



1.什么时候用分片

在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存

就吃不消了,这个时候我们可以考虑分片。


什么时候需要分片:
a.机器的磁盘不够用了
b.单个mongod已经不能满足些数据的性能需要了
c.想将大量数据放在内存中提高性能
一般来说,先要从不分片开始,然后在需要的时候将其转换成分片

2.分片的原理
Mongodb的分片部署_第1张图片

解释:

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

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

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

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

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


分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上
MongoDB支持自动分片,可以摆脱手动分片的管理.集群自动切分数据,做负载均衡

3.开始部署
分片集群的构造如下:
Mongodb的分片部署_第2张图片

分片集群由以下3个服务组成:

  1. Shards Server: 每个shard由一个或多个mongod进程组成,用于存储数据
  2. Config Server: 用于存储集群的Metadata信息,包括每个Shard的信息和chunks信息
  3. Route Server: 用于提供路由服务,由Client连接,使整个Cluster看起来像单个DB服务器

这里我们用一台机子192.168.0.188模拟部署 3个分片+一个Config Server+一个Route Process
端口如下:
Shard Sever 1 : 38010
Shard Sever 2 : 38011
Shard Sever 3 : 38012

Config Server : 40000
Route Process : 50000



1.创建3个Shard Server
(其实就是以shards server分片服务器的方式启动mongodb,我们启动三个端口)

启动方式一
直接在命令行输出查看
./mongod --dbpath=/data/shard/s0 --shardsvr --port 38010 --directoryperdb --rest
./mongod --dbpath=/data/shard/s1 --shardsvr --port 38011 --directoryperdb --rest
./mongod --dbpath=/data/shard/s2 --shardsvr --port 38012 --directoryperdb --rest

启动方式二
正式运行要后台运行就用下面的:
./mongod --dbpath=/data/shard/s0 --shardsvr --port 38010 --directoryperdb --logpath=/data/shard/log/s0.log --logappend --fork --rest
./mongod --dbpath=/data/shard/s1 --shardsvr --port 38011 --directoryperdb --logpath=/data/shard/log/s1.log --logappend --fork --rest
./mongod --dbpath=/data/shard/s2 --shardsvr --port 38012 --directoryperdb --logpath=/data/shard/log/s2.log --logappend --fork --rest


这里我们用第一种启动方式分别启动三个端口。
第一步:创建存放数据目录,日志目录
[root@x1 ~]# mkdir -p /data/shard/s0
[root@x1 ~]# mkdir -p /data/shard/s1
[root@x1 ~]# mkdir -p /data/shard/s2
[root@x1 ~]# mkdir -p /data/shard/log


第二步:ctrl+alt+f1进入控制台1启动端口38010
在mongodb安装目录的bin目录运行下面的代码:
./mongod --dbpath=/data/shard/s0 --shardsvr --port 38010 --directoryperdb --rest
Mongodb的分片部署_第3张图片

第三步:ctrl+alt+f2进入控制台2启动端口38011
在mongodb安装目录的bin目录运行下面的代码:
./mongod --dbpath=/data/shard/s1 --shardsvr --port 38011 --directoryperdb --rest
Mongodb的分片部署_第4张图片


第四步:ctrl+alt+f3进入控制台2启动端口38012
在mongodb安装目录的bin目录运行下面的代码:
./mongod --dbpath=/data/shard/s2 --shardsvr --port 38012 --directoryperdb --rest
Mongodb的分片部署_第5张图片

2.启动Config Server, Config Server : 40000
启动方式一:信息直接在命令行输出
./mongod --dbpath /data/shard/config --configsvr --port 40000 --directoryperdb --rest

启动方式二:正式运行要后台运行就用下面的:
./mongod  --dbpath /data/shard/config --configsvr --port 40000  --logpath=/data/shard/log/config.log --fork --directoryperdb --rest

第一步:创建存放配置信息的目录
mkdir -p /data/shard/config
第二步:启动(第一种方式)
ctrl+alt+f4进入控制台4启动config server
在mongodb安装目录的bin目录运行下面的代码:
./mongod --dbpath /data/shard/config --configsvr --port 40000 --directoryperdb --rest
Mongodb的分片部署_第6张图片


3,启动Route Process,Route Process : 50000
启动方式一:信息直接在命令行输出
./mongos --port 50000 --configdb 192.168.0.188:40000 --chunkSize 1 
--chunkSize 1 (MB)指定分片的最小单位容量,这里设置1M,方便查看效果 
启动方式二:正式运行要后台运行就用下面的:
./mongos --port 50000 --configdb 192.168.0.188:40000 --chunkSize 50 --logpath=/data/shard/log/route.log --fork

步骤:用方式一启动
ctrl+alt+f5进入控制台5启动Route Process
在mongodb安装目录的bin目录运行下面的代码:
./mongos --port 50000 --configdb 192.168.0.188:40000 --chunkSize 1 
Mongodb的分片部署_第7张图片



 4.配置sharding
步骤:
ctrl+alt+f6进入控制台6启动Route Process
用Mongo Shell 登录 Route Process
./mongo --port 50000
use admin (记得执行这一点,切换到admin数据库)
//添加分片节点,每个分片都是mongod实例或者一个副本集
db.runCommand({addshard:"192.168.0.188:38010",allowLocal:true})
db.runCommand({addshard:" 192.168.0.188:38011",allowLocal:true})
db.runCommand({addshard:" 192.168.0.188:38012",allowLocal:true})
allowLocal:true仅仅开发时才将分片配置到本地,生产时不能这样
Mongodb的分片部署_第8张图片

用mongovue连接这几个端口,观察结果:
Mongodb的分片部署_第9张图片
Mongodb的分片部署_第10张图片




5.对数据库mytest启用分片

在控制台6的Mongo Shell中运行
use admin
db.runCommand({enablesharding:"mytest"})
Mongodb的分片部署_第11张图片

在Mongovue中可以看到 启用分片的数据库已经在config的databases中有登记:
Mongodb的分片部署_第12张图片



6.对数据库mytest中的集合student启用分片,设置片键为_id
递增片键方式
use admin
db.runCommand({shardcollection:"mytest.users",key:{_id:1}})

随机片键方式
use admin
db.runCommand({shardcollection:"mytest.users",key:{ram:1}})

在控制台6的Mongo Shell中运行
db.runCommand({shardcollection:"mytest.student",key:{_id:1}})

Mongodb的分片部署_第13张图片


6.分片集群插入数据测试:
步骤:测试插入60万条数据
在控制台6的Mongo Shell中运行
use mytest
for(var i=1; i<=600000; i++) db.student.insert({age:i,name:"mary",addr:"guangzhou",country:"China"})
在config的chunks可以看到分了多少片,以及片键的最小到最大的范围
Mongodb的分片部署_第14张图片

3个shard服务器里可以看到都有了mytest数据库以及student集合

Mongodb的分片部署_第15张图片

部署成功。


4.分片的管理

1.移除Shard Server,回收数据
在控制台6的Mongo Shell中运行
use admin
db.runCommand({"removeshard" : "192.168.0.188:38011"})
Mongodb的分片部署_第16张图片

在mongovue中查看process的config中的shards发现移除的shard服务端提示已排水:

Mongodb的分片部署_第17张图片


看移除的分片服务器发现数据清空了为0了(这些数据已经被回收分配到剩余的两个分片中):

Mongodb的分片部署_第18张图片


2.新增Shard Server

在控制台6的Mongo Shell中运行
use admin
db.runCommand({"addshard" : "192.168.0.188:38011"})



PS:规定加入的新mongod不能含有相同的数据库,如果有的会报错,先把同名的数据库删除之后才能新增为shard server


PS:如果要移除的分片是基片(也就是标注为primary的分片,这里是192.168.0.188:38010),那么要先手动修改数据库mytest的基片,改为192.168.0.188:38011后再移除 38010

Mongodb的分片部署_第19张图片

Mongodb的分片部署_第20张图片


执行: 
mongos> db.runCommand({"moveprimary" : "mytest","to" : " 192.168.0.188:38011"})
依赖要删除的片的关系全部删除后,再找执行一次:
db.runCommand({"removeshard" : " 192.168.0.188:38010"})




你可能感兴趣的:(Mongodb的分片部署)