分片也是一种集群,但是跟主从集群(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.分片的原理
解释:
人脸: 代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的。
mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合....
好了,mongos就是一个路由服务器,它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群,数据
和片的对应关系以及相应的配置信息保存在"config服务器"上。
mongod: 一个普通的数据库实例或者副本集,如果不分片的话,我们会直接连上mongod。
分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上
MongoDB支持自动分片,可以摆脱手动分片的管理.集群自动切分数据,做负载均衡
3.开始部署
分片集群的构造如下:
分片集群由以下3个服务组成:
- Shards Server: 每个shard由一个或多个mongod进程组成,用于存储数据
- Config Server: 用于存储集群的Metadata信息,包括每个Shard的信息和chunks信息
- 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
第三步:ctrl+alt+f2进入控制台2启动端口38011
在mongodb安装目录的bin目录运行下面的代码:
./mongod --dbpath=/data/shard/s1 --shardsvr --port 38011 --directoryperdb --rest
第四步:ctrl+alt+f3进入控制台2启动端口38012
在mongodb安装目录的bin目录运行下面的代码:
./mongod --dbpath=/data/shard/s2 --shardsvr --port 38012 --directoryperdb --rest
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
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
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仅仅开发时才将分片配置到本地,生产时不能这样
用mongovue连接这几个端口,观察结果:
5.对数据库mytest启用分片
在控制台6的Mongo Shell中运行
use admin
db.runCommand({enablesharding:"mytest"})
在Mongovue中可以看到 启用分片的数据库已经在config的databases中有登记:
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}})
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可以看到分了多少片,以及片键的最小到最大的范围
3个shard服务器里可以看到都有了mytest数据库以及student集合
部署成功。
4.分片的管理
1.移除Shard Server,回收数据
在控制台6的Mongo Shell中运行
use admin
db.runCommand({"removeshard" : "192.168.0.188:38011"})
在mongovue中查看process的config中的shards发现移除的shard服务端提示已排水:
看移除的分片服务器发现数据清空了为0了(这些数据已经被回收分配到剩余的两个分片中):
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
执行:
mongos> db.runCommand({"moveprimary" : "mytest","to" : "
192.168.0.188:38011"})
依赖要删除的片的关系全部删除后,再找执行一次:
db.runCommand({"removeshard" : "
192.168.0.188:38010"})