集群规划:
有三个复制集 每个复制集有一个路由节点,配置节点,三个分片
(主节点,从节点,仲裁节点)
*****仲裁节点只能选举,不能参与实际的分片
一共有33+32=15个
数据分为3个片,每个片都是一个复制集,分别为shard1,shard2,shard3
- 建立存放mongodb的数据文件
sudo mkdir -p /data/mongodbtest1
sudo mkdir -p /data/mongodbtest2
sudo mkdir -p /data/mongodbtest3
- 为mongos、config、shard1、shard2、shard3建立目录,
用来存放数据和日志文件(mongos路由服务器不存储数据,只需建立日志文件)
#/data/mongodbtest1文件目录
sudo mkdir -p /data/mongodbtest1/mongos/log
sudo mkdir -p /data/mongodbtest1/config/data
sudo mkdir -p /data/mongodbtest1/config/log
sudo mkdir -p /data/mongodbtest1/shard11/data
sudo mkdir -p /data/mongodbtest1/shard11/log
sudo mkdir -p /data/mongodbtest1/shard12/data
sudo mkdir -p /data/mongodbtest1/shard12/log
sudo mkdir -p /data/mongodbtest1/shard13/data
sudo mkdir -p /data/mongodbtest1/shard13/log
#/data/mongodbtest2文件目录
sudo mkdir -p /data/mongodbtest2/mongos/log
sudo mkdir -p /data/mongodbtest2/config/data
sudo mkdir -p /data/mongodbtest2/config/log
sudo mkdir -p /data/mongodbtest2/shard21/data
sudo mkdir -p /data/mongodbtest2/shard21/log
sudo mkdir -p /data/mongodbtest2/shard22/data
sudo mkdir -p /data/mongodbtest2/shard22/log
sudo mkdir -p /data/mongodbtest2/shard23/data
sudo mkdir -p /data/mongodbtest2/shard23/log
#/data/mongodbtest3文件目录
sudo mkdir -p /data/mongodbtest3/mongos/log
sudo mkdir -p /data/mongodbtest3/config/data
sudo mkdir -p /data/mongodbtest3/config/log
sudo mkdir -p /data/mongodbtest3/shard31/data
sudo mkdir -p /data/mongodbtest3/shard31/log
sudo mkdir -p /data/mongodbtest3/shard32/data
sudo mkdir -p /data/mongodbtest3/shard32/log
sudo mkdir -p /data/mongodbtest3/shard33/data
sudo mkdir -p /data/mongodbtest3/shard33/log
3 启动配置服务器,端口设置为:10001,20001,30001
sudo /usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodbtest1/config/data --port 10001 --logpath /data/mongodbtest1/config/log/config.log --fork
sudo /usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodbtest2/config/data --port 20001 --logpath /data/mongodbtest2/config/log/config.log --fork
sudo /usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodbtest3/config/data --port 30001 --logpath /data/mongodbtest3/config/log/config.log --fork
4 启动mongos路由服务器,端口设置为:10002,20002,30002
sudo /usr/local/mongodb/bin/mongos --configdb localhost:10001,localhost:20001,localhost:30001 --port 10002 --logpath /data/mongodbtest1/mongos/log/mongos.log --fork
sudo /usr/local/mongodb/bin/mongos --configdb localhost:10001,localhost:20001,localhost:30001 --port 20002 --logpath /data/mongodbtest2/mongos/log/mongos.log --fork
sudo /usr/local/mongodb/bin/mongos --configdb localhost:10001,localhost:20001,localhost:30001 --port 30002 --logpath /data/mongodbtest3/mongos/log/mongos.log --fork
5 分别启动各个复制集的分片shard1,shard2,shard3
#shard1,端口号分别为10003,10004,10005
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --dbpath /data/mongodbtest1/shard11/data --logpath /data/mongodbtest1/shard11/log/shard1.log --port 10003 --oplogSize 1024 --fork
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --dbpath /data/mongodbtest1/shard12/data --logpath /data/mongodbtest1/shard12/log/shard2.log --port 10004 --oplogSize 1024 --fork
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --dbpath /data/mongodbtest1/shard13/data --logpath /data/mongodbtest1/shard13/log/shard3.log --port 10005 --oplogSize 1024 --fork
#shard2,端口号分别为20003,20004,20005
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --dbpath /data/mongodbtest2/shard21/data --logpath /data/mongodbtest2/shard21/log/shard1.log --port 20003 --oplogSize 1024 --fork
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --dbpath /data/mongodbtest2/shard22/data --logpath /data/mongodbtest2/shard22/log/shard2.log --port 20004 --oplogSize 1024 --fork
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --dbpath /data/mongodbtest2/shard23/data --logpath /data/mongodbtest2/shard23/log/shard3.log --port 20005 --oplogSize 1024 --fork
#shard3,端口号分别为30003,30004,30005
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --dbpath /data/mongodbtest3/shard31/data --logpath /data/mongodbtest3/shard31/log/shard1.log --port 30003 --oplogSize 1024 --fork
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --dbpath /data/mongodbtest3/shard32/data --logpath /data/mongodbtest3/shard32/log/shard2.log --port 30004 --oplogSize 1024 --fork
sudo /usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --dbpath /data/mongodbtest3/shard33/data --logpath /data/mongodbtest3/shard33/log/shard3.log --port 30005 --oplogSize 1024 --fork
6 查看mongod进程:ps -aux |grep mongod
7 添加复制集
登录localhost:10003 设置shard1复制集
sudo /usr/local/mongodb/bin/mongo localhost:10003
config = { _id:"shard1", members:[
{_id:0,host:"localhost:10003"},
{_id:1,host:"localhost:10004"},
{_id:2,host:"localhost:10005",arbiterOnly:true}
]
}
rs.initiate(config);
登录localhost:20003 设置shard2复制集
sudo /usr/local/mongodb/bin/mongo localhost:20003
use admin
config = { _id:"shard2", members:[
{_id:0,host:"localhost:20003"},
{_id:1,host:"localhost:20004"},
{_id:2,host:"localhost:20005",arbiterOnly:true}
]
}
rs.initiate(config);
登录localhost:30003 设置shard3复制集
---
sudo /usr/local/mongodb/bin/mongo localhost:30003
use admin
config = { _id:"shard3", members:[
{_id:0,host:"localhost:30003"},
{_id:1,host:"localhost:30004"},
{_id:2,host:"localhost:30005",arbiterOnly:true}
]
}
rs.initiate(config);
---
* 分别查看复制集配置结果
shard1
shard2
shard3
8串联路由服务器:
连接任一台路由服务器:
sudo /usr/local/mongodb/bin/mongo localhost:10002
串联路由服务器并配置复制集
use admin
db.runCommand( { addshard : "shard1/localhost:10003,localhost:10004,localhost:10005"});
db.runCommand( { addshard : "shard2/localhost:20003,localhost:20004,localhost:20005"});
db.runCommand( { addshard : "shard3/localhost:30003,localhost:30004,localhost:30005"});
查看分片服务器的配置
db.runCommand( { listshards : 1 } );
---仲裁节点不会显示
指定test集合使分片生效
db.runCommand( { enablesharding :"test"});
对test数据库的某一个集合进行分片,片键采用Hash片键(散列分布)
db.runCommand({shardcollection:"test.userinfo",key:{"_id": "hashed"}})
9 测试分片结果
连接mongos服务器
sudo /usr/local/mongodb/bin/mongo localhost:10002
插入数据
use test
for(var i=0;i<100000;i++){db.userinfo.insert({"username":"user"+i});}
查看分片情况:
db.userinfo.stats();
查看集群状态:
(查看每个片有两个块):
sh.status();
查看插入的数据在分片的结果:
启动shard1分片10003
启动shard1分片2 10004
启动shard1分片3 10005
启动shard2分片1 20003
启动shard2分片2 20004
启动shard2分片3 20005
启动shard3分片1 30003
启动shard3分片2 30004
启动shard3分片3 30005