分片架构是在复制集基础之上形成的
分片架构,一般都是两台机器一个片
仲裁无所谓,每个片的仲裁都可以同时放在一台机器上
config需要一台单独的机器
mongos(路由)是一个客户端的路由,放在应用服务器上就可以了
生产中至少:主从4台,config1台+仲裁1台=6台
一个复制集叫做一个分片,一个分片被称之为一个复制集
客户端是看不见分片的
路由管分配,然后通过路由找config,然后检索数据
硬件的配置:
mongodb的主从,必须是SSD或者pciessd硬盘,而且mongodb非常消耗内存,所以一般内存最少都得是128G或者256G(最低标配也得是64G)
仲裁, 是无所谓的
config,最好也是和主从一样的硬件需求,因为需要查询(mongodb的更新很慢,但是查询是非常快的,因为它是文档型的)
分片架构=复制集架构*2+arbiter+config+mongos
config是什么?
config里面记录着数据的分布,知道哪个片中包含什么样的数据,所以config至关重要,需要单独放在一台机器上,而且可能不止一个config
运行机制:应用服务器通过路由查找config,确定数据在哪个分片上,然后再检索数据
分片架构搭建:
1、在mongodb复制集架构的基础之上再搭建一套复制集,如何做?参考mongodb复制集搭建文档
主机名+IP地址:
node1,192.168.2.241
node2,192.168.4.242
--注:这里将241做主,242做从,arbiter(仲裁)放在241上面
--注:需要注意的几点:
1、编辑配置文件的时候,端口号和shard是不一样的
2、配置复制集的时候IP和端口号也是不一样的
2、配置服务器config搭建(实验将config放在了239上,生产中要单放一个机器上)
mkdir -p /export/mongodb/config
echo $keystring >/export/mongodb/key/config
chmod 600 /export/mongodb/key/*
[root@node1 bin]# /export/mongodb/bin/mongod --configsvr --port 40011 --keyFile /export/mongodb/key/config --dbpath /export/mongodb/config --logpath /export/mongodb/log/config.log --logappend --fork
--注:这里面的40011是config的端口号
3、配置mongos路由服务器:(239上)
[root@node1 bin]# echo 123456 > /export/mongodb/key/mongos
[root@node1 bin]# chmod 600 /export/mongodb/key/*
[root@node1 bin]# /export/mongodb/bin/mongos --keyFile /export/mongodb/key/mongos --configdb 192.168.2.239:40011 --port 30011 --logpath /export/mongodb/log/mongos.log --logappend --fork
--注:这里面的30011是路由的端口号
--注:路由是不需要记录数据的,所以不需要指定data路径;config是需要
4、配置分片
需要进入到登录mongos路由服务器上面进行分片
配置分片,需要使用admin库(必须在admin上执行添加分片的操作)
db.runCommand({addshard:"shard1/192.168.2.239:20011,192.168.2.240:20011,192.168.2.239:20012"});
db.runCommand({addshard:"shard2/192.168.2.241:20021,192.168.2.242:20021,192.168.2.241:20022"});
查看分片信息:db.runCommand({listshards:1});
仲裁节点不会列出来
开启mongodb的分片
mongos> db.runCommand({enablesharding:"test"})
指定哪个集合要分片,片键
mongos> db.runCommand({shardcollection:"test.t1",key:{x:1}})
5、模拟测试
插入1万的数据(数据量越大,分片越平均)
mongos> for (var i=1;i<1000000;i++) db.t1.insert({name:"mongo",x:i})
查看分片状态:
mongos> db.printShardingStatus()
--注:这里面有所有的分片,哪个后面有true,哪个就表示分片成功了
mongos,路由,是看全局数据的,比如说因为我这里将mongos放在了239上,登录mongos,查看一下全局一共有多少的数据
241————分片上查看均衡的数据量
240————分片上查看均衡的数据量