一、简介
分片(sharding)是MongoDB用来将大型集合水平分割到不同服务器(或者复制集)上所采用的方法。
不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。
分片集群由以下3个服务组成:
- Shards Server: 每个shard由一个或多个mongod进程组成,用于存储数据。
- Router Server:
数据库集群的请求入口,所有请求都通过Router(mongos)进行协调,不需要在应用程
序添加一个路由选择器,Router(mongos)就是一个请求分发中心它负责把应用程序的请求转发到对应的 Shard服务器上。 - Config Server: 配置服务器。存储所有数据库元信息(路由、分片)的配置。
二、配置 并启动config节点集群
- 解压并重命名MongoDB
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.5.tgz
mv mongodb-linux-x86_64-rhel70-4.4.5 shard_cluster
- 进入并创建目录
cd shard_cluster/
mkdir config
- 进入config创建log目录
cd config
mkdir config1 logs
- 创建配置服务器配置config-17017.conf
vi config-17017.conf
# 数据库文件位置
dbpath=config/config1
#日志文件位置
logpath=config/logs/config1.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
- 启动
cd ../
./bin/mongod -f config/config-17017.conf
- 配置集群其它两个节点
cd config/
mkdir config2
mkdir config3
cp config-17017.conf config-17018.conf
cp config-17017.conf config-17019.conf
# 数据库文件位置
dbpath=config/config2
#日志文件位置
logpath=config/logs/config2.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17018
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
# 数据库文件位置
dbpath=config/config3
#日志文件位置
logpath=config/logs/config3.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17019
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
- 启动配置服务
cd ../
./bin/mongod -f config/config-17018.conf
./bin/mongod -f config/config-17019.conf
- 进入任意节点的mongo shell 并添加配置节点集群,这里要注意 use admin
./bin/mongo --port 17017
use admin
var cfg ={"_id":"configsvr",
"members":[
{"_id":1,"host":"192.168.200.103:17017"},
{"_id":2,"host":"192.168.200.103:17018"},
{"_id":3,"host":"192.168.200.103:17019"}
]
};
rs.initiate(cfg)
#查看状态
rs.status()
三、配置shard1集群
shard1集群搭建37017到37019
- 新建目录
cd shard_cluster/
mkdir shard
cd shard
mkdir shard1 shard2
cd shard1
mkdir shard1-37017 shard1-37018 shard1-37019
- 创建配置文件
vi shard1-37017.conf
dbpath=shard/shard1/shard1-37017
bind_ip=0.0.0.0
port=37017
fork=true
logpath=shard/shard1/shard1-37017.log
replSet=shard1
shardsvr=true
vi shard1-37018.conf
dbpath=shard/shard1/shard1-37018
bind_ip=0.0.0.0
port=37018
fork=true
logpath=shard/shard1/shard1-37018.log
replSet=shard1
shardsvr=true
vi shard1-37019.conf
dbpath=shard/shard1/shard1-37019
bind_ip=0.0.0.0
port=37019
fork=true
logpath=shard/shard1/shard1-37019.log
replSet=shard1
shardsvr=true
- 启动
./bin/mongod -f shard/shard1/shard1-37017.conf
./bin/mongod -f shard/shard1/shard1-37018.conf
./bin/mongod -f shard/shard1/shard1-37019.conf
- 进行集群配置
./bin/mongo --port 37017
var cfg ={"_id":"shard1",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"192.168.200.103:37017"},
{"_id":2,"host":"192.168.200.103:37018"},
{"_id":3,"host":"192.168.200.103:37019"}
]
};
rs.initiate(cfg)
rs.status()
四、配置shard2集群
shard2集群搭建47017到47019
配置和shard1大致
- 创建配置文件
cd shard/shard2
mkdir shard2-47017 shard2-47018 shard2-47019
mkdir logs
vi shard2-47017.conf
dbpath=shard/shard2/shard2-47017
bind_ip=0.0.0.0
port=47017
fork=true
logpath=shard/shard2/logs/shard2-47017.log
replSet=shard2
shardsvr=true
vi shard2-47018.conf
dbpath=shard/shard2/shard2-47018
bind_ip=0.0.0.0
port=47018
fork=true
logpath=shard/shard2/logs/shard2-47018.log
replSet=shard2
shardsvr=true
vi shard2-47019.conf
dbpath=shard/shard2/shard2-47019
bind_ip=0.0.0.0
port=47019
fork=true
logpath=shard/shard2/logs/shard2-47019.log
replSet=shard2
shardsvr=true
- 启动
cd ../../
./bin/mongod -f shard/shard2/shard2-47017.conf
./bin/mongod -f shard/shard2/shard2-47018.conf
./bin/mongod -f shard/shard2/shard2-47019.conf
- 进行集群配置
./bin/mongo --port 47017
var cfg ={"_id":"shard2",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"192.168.200.103:47017"},
{"_id":2,"host":"192.168.200.103:47018"},
{"_id":3,"host":"192.168.200.103:47019"}
]
};
rs.initiate(cfg)
rs.status()
五、配置和启动路由节点
- 新建目录
cd shard_cluster/
mkdir route/logs -p
- 进入route目录,新建配置文件
cd route
vi route-27017.conf
port=27017
bind_ip=0.0.0.0
fork=true
logpath=route/logs/route.log
configdb=configsvr/192.168.200.103:17017,192.168.200.103:17018,192.168.200.103:17019
- 启动路由
cd ../
./bin/mongos -f route/route-27017.conf
- 进入mongos
./bin/mongo --port 27017
- 查看分片节点状态
sh.status()
- 向路由中添加分片集群shard1和shard2
sh.addShard("shard1/192.168.200.103:37017,192.168.200.103:37018,192.168.200.103:37019");
sh.addShard("shard2/192.168.200.103:47017,192.168.200.103:47018,192.168.200.103:47019");
sh.status()
- 开启数据库和集合分片(指定片键)
为数据库开启分片功能
sh.enableSharding("lossdate_test")
为指定集合开启分片功能
sh.shardCollection(“lossdate_test.lossdate_test_datas”,{“片键字段名如 name”:索引说明})
sh.shardCollection("lossdate_test.lossdate_test_datas",{"name":"hashed"})
- 向集合中插入数据测试
use lossdate_test;
通过切换到shard1和shard2查看是否同步
show dbs
最后通过路由循环向集合中添加数
for(var i = 1; i <= 1000; i ++) {
db.lossdate_test_datas.insert(
{"name":"test" + i,
salary:(Math.random()*20000).toFixed(2)
}
);
}
六、验证
分别进入shard1和shard2进行查询验证分片
use lossdate_test
db.lossdate_test_datas.find()
shard1:
shard2:
七、安全认证
- 创建用户
开启安全认证之前, 进入路由
在admin创建管理员和在lossdate_test下创建普通用户
#创建管理员
use admin
db.createUser({
user:"root",
pwd:"123456",
roles:[{role:"root",db:"admin"}]
})
#创建普通用户
use lossdate_test
db.createUser({
user:"lossdate",
pwd:"123456",
roles:[{role:"readWrite",db:"lossdate_test"}]
})
- 关闭所有的 配置节点 分片节点 和 路由节点
#安装psmisc
yum install psmisc
命令 快速关闭多个进程
killall mongod
killall mongo
killall mongos
- 生成 密钥文件 并 修改权限
cd /usr/local/mongodb/shard_cluster/
mkdir data/mongodb -p
openssl rand -base64 756 > data/mongodb/testKeyFile.file
chmod 600 data/mongodb/testKeyFile.file
- 配置节点集群和分片节点集群,开启安全认证和指定密钥文件
在分别在config、shard1和shard2集群的配置文件中加上:
auth=true
keyFile=data/mongodb/testKeyFile.file
例:config-17017.conf config-17018.conf config-17019.conf
vi config/config-17017.conf
...
vi shard/shard1/shard1-37017.conf
...
vi shard/shard2/shard2-47017.conf
...
- 在路由配置文件中配置密钥文件
vi route/route-27017.conf
keyFile=data/mongodb/testKeyFile.file
- 启动所有的 配置节点、分片节点 和 路由节点 使用路由进行权限验证
编写一个shell脚本批量启动
vi startup.sh
./bin/mongod -f config/config-17017.conf
./bin/mongod -f config/config-17018.conf
./bin/mongod -f config/config-17019.conf
./bin/mongod -f shard/shard1/shard1-37017.conf
./bin/mongod -f shard/shard1/shard1-37018.conf
./bin/mongod -f shard/shard1/shard1-37019.conf
./bin/mongod -f shard/shard2/shard2-47017.conf
./bin/mongod -f shard/shard2/shard2-47018.conf
./bin/mongod -f shard/shard2/shard2-47019.conf
./bin/mongos -f route/route-27017.conf
接着为startup.sh添加执行权限
chmod +x startup.sh
最后执行脚本
./startup.sh
- 验证
进入路由节点
./bin/mongo --port 27017
执行show dbs,不生效
接着验证管理员
use admin
db.auth("root","123456")
再执行show dbs,生效
退出,继续验证普通用户
exit
./bin/mongo --port 27017
use lossdate_test
db.auth("lossdate","123456")
- Spring boot 连接安全认证的分片集群
配置:
spring.data.mongodb.username=账号
spring.data.mongodb.password=密码
#spring.data.mongodb.uri=mongodb://账号:密码@IP:端口/数据库名