一、 架构图如下
分片副本集部署规划:
- 2个mongos实例分别在192.168.1.1、192.168.1.2上,端口为27019
- 3个config实例分别在192.168.2.1、192.168.2.2、192.168.2.3上,端口为27018,副本集名为configs
- shard1分片的副本集配置的三个实例分别在192.168.3.1、192.168.3.2、192.168.3.3上,端口为27017
- shard2分片的副本集配置的三个实例分别在192.168.4.1、192.168.4.2、192.168.4.3上,端口为27017
二、 创建/home/mongodb/{log,data,key}路径目录,用于存放mongodb的日志、数据和访问key。
三、mongos实例的config.conf配置文件如下:
systemLog:
destination: file
# mongos服务器日志的存储路径
path: "/home/mongodb/log/mongos.log"
logAppend: true
sharding:
# 添加config副本集配置
# 例如config副本集配置的三个实例分别在192.168.2.1、192.168.2.2、192.168.2.3上,端口为27018,副本集名为configs。者该配置如下所写
configDB: configs/192.168.2.1:27018,192.168.2.2:27018,192.168.2.3:27018
security:
# 访问key的路径
keyFile: "/home/mongodb/key/mongodb_keyfile"
clusterAuthMode: "keyFile"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
# 配置mongos的端口号为27019
port: 27019
四、config实例的config.conf配置文件如下:
systemLog:
destination: file
# config服务器日志的存储路径
path: "/home/mongodb/log/mongos.log"
logAppend: true
storage:
# config服务器数据的存储路径
dbPath: "/home/mongodb/data"
journal:
enabled: true
security:
# 启用身份认证
authorization: "enabled"
# 访问key的路径
keyFile: "/home/mongodb/key/mongodb_keyfile"
clusterAuthMode: "keyFile"
sharding:
# 标识该实例用于config服务器
clusterRole: "configsvr"
replication:
oplogSizeMB: 1024
# config副本集的名字
replSetName: "configs"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
# 配置config的端口号为27018
port: 27018
四、分片下每一个mongod实例的config.conf配置文件如下:
systemLog:
destination: file
# shard服务器日志的存储路径
path: "/home/mongodb/log/shard.log"
logAppend: true
storage:
# shard服务器数据的存储路径
dbPath: "/home/mongodb/data"
journal:
enabled: true
security:
# 启用身份认证
authorization: "enabled"
# 访问key的路径
keyFile: "/home/mongodb/key/mongodb_keyfile"
clusterAuthMode: "keyFile"
sharding:
# 标识该实例用于shard分片
clusterRole: "shardsvr"
replication:
oplogSizeMB: 1024
# shard副本集的名字
replSetName: "shard1"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
# 配置shard的端口号为27017
port: 27017
五、key的生成
mongodb_key_address=/home/mongodb/key/mongodb_keyfile
openssl rand -base64 756 > $mongodb_key_address
chmod 400 $mongodb_key_address
所有实例中都使用同一个key,复制key后还得要修改400权限后mongodb才可以正常运行。
六、 准备好所有的conf配置文件和key后,第一步首先启动负责shard的六个mongod实例。
# shard1分片
# 在192.168.3.1主机中运行
mongod -f /home/mongodb/config.conf
# 在192.168.3.2主机中运行
mongod -f /home/mongodb/config.conf
# 在192.168.3.3主机中运行
mongod -f /home/mongodb/config.conf
# shard2分片
# 在192.168.4.1主机中运行
mongod -f /home/mongodb/config.conf
# 在192.168.4.2主机中运行
mongod -f /home/mongodb/config.conf
# 在192.168.4.3主机中运行
mongod -f /home/mongodb/config.conf
然后登入shard1分片中任意一台主机中运行以下代码
# 向端口号为27017的mongodb服务器输入指令
mongo -port 27017 << mongo
use admin;
config={_id:'shard1',members:[{_id: 0 ,host: '192.168.3.1:27017'},{_id: 1 ,host: '192.168.3.2:27017'},{_id: 2 ,host: '192.168.3.3:27017'}]};
rs.initiate(config);
exit;
mongo
然后再登入shard2分片中任意一台主机中运行以下代码
# 向端口号为27017的mongodb服务器输入指令
mongo -port 27017 << mongo
use admin;
config={_id:'shard2',members:[{_id: 0 ,host: '192.168.4.1:27017'},{_id: 1 ,host: '192.168.4.2:27017'},{_id: 2 ,host: '192.168.4.3:27017'}]};
rs.initiate(config);
exit;
mongo
此时,shard1、shard2分片的副本集已经正式启动了。
七、 然后再启动config的三个mongod实例。
# 在192.168.2.1主机中运行
mongod -f /home/mongodb/config.conf
# 在192.168.2.2主机中运行
mongod -f /home/mongodb/config.conf
# 在192.168.2.3主机中运行
mongod -f /home/mongodb/config.conf
然后登入其中任意一台主机中运行以下代码
# 向端口号为27018的mongodb服务器输入指令
mongo -port 27018 << config
use admin;
config={_id:'configs',members:[{_id: 0 ,host: '192.168.2.1:27018'},{_id: 1 ,host: '192.168.2.2:27018'},{_id: 2 ,host: '192.168.2.3:27018'}]};
rs.initiate(config);
exit;
config
那么config服务器的副本集也已经正式启动了。
八、 启动mongos的服务。
# 在192.168.1.1主机中运行
mongos -f /home/mongodb/config.conf
# 在192.168.1.2主机中运行
mongos -f /home/mongodb/config.conf
任选一台mongos主机,运行以下代码
# 向端口号为27019的mongodb服务器输入指令
mongo -port 27019 << mongos
use admin;
# 创建root权限的账户,密码建议更改较为复杂的密码
db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]});
# 用root账户登陆MongoDB
db.auth("root","root");
# 添加分片集群信息
sh.addShard("shard1/192.168.3.1:27017,192.168.3.2:27017,192.168.3.3:27017");
sh.addShard("shard2/192.168.4.1:27017,192.168.4.2:27017,192.168.4.3:27017");
# 自此分片添加已经完成,下面为对具体某集合执行分片指令
# 设置分片规则(此处对testDB.col进行哈希分片):
# 进入testDB库
use testDB;
# 创建集合col
db.createCollection(col);
# 为集合col添加{"id":1}索引
db.col.createIndex({"id":1})
# 指定test_db分片生效:
db.runCommand({enablesharding:"testDB"});
# 指定数据库里需要分片的集合和片键:
db.runCommand({shardcollection:"testDB.col",key:{id:"hashed"}})
exit
mongos
MongoDB分片副本集已经正式启动,并以完成对testDB.col集合进行分片并以文档中的id作为片键,执行哈希分片。
九、 分片副本集的测试用例如下:
首先登陆一台mongos服务器的主机,并用root权限账户实行登陆,在mongos服务器中运行以下代码
use testDB
for(var i = 0;i<5000;i++){
var arr = [{id:0}];
for(var j = 0;j<1000;j++){
arr.push({id:i,value_j:j});
}
db.testDB.insertMany(arr);
}
执行以上代码后,相当于向testDB.col集合插入5005000条数据。然后在执行以下代码,观察testDB.col集合的分块情况。
sh.status()
执行后可以观察到该集合在分片中的数据分布情况。