分片是每个节点存储数据的不同片段,复制集是每个节点存储数据的相同副本
mongos:接收请求和路由请求
config servers:记录所有节点信息
shard:分片集存储数据
Mongodb版本:3.4.24
查看版本命令:mongo version
1. 端口分配和目录创建
1.1 端口分配
这个是用作下面配置文件里的,找些没用的端口,不用自己去分配
验证端口是否被使用命令:netstat -ap | grep 端口
集群节点 | 192.168.2.195 | 192.168.2.196 | 192.168.2.197 |
configsvr(配置服务) | 192.168.2.195:20000 | 192.168.2.196:20000 | 192.168.2.197:20000 |
mongos(路由) | 192.168.2.195:27017 | 192.168.2.196:27017 | 192.168.2.197:27017 |
Shard(分片) | 192.168.2.195:26021 | 192.168.2.196:26021 | 192.168.2.197:26021 |
副本集:每个分片只有一个副本集,没有冗余备份。 |
1.2 目录创建
每台设备都要创建
dbpath( 数据库配置路径):
mkdir -p /flash/system/volume/database/shard_test #数据库存储
mkdir -p /flash/system/volume/data/test/shard_test #分片存储
Logpath(日志文件配置):
mkdir -p /var/log/test/shard_test #这条没有,方便复制粘贴命令加上的
touch /var/log/test/shard_test/config.log #config server日志
touch /var/log/test/shard_test/route.log #route日志
touch /var/log/test/shard_test/shard.log #shard日志
2. config server配置服务器
2.1 配置服务器
每台设备都要配置
vi /usr/etc/dbconf/npbase_shard.conf
fork=true
quiet=true
nounixsocket=true
bind_ip=0.0.0.0
port=20000
logappend=true
configsvr=true
replSet=configs
logpath=/var/log/test/shard_test/config.log
dbpath=/flash/system/volume/database/shard_test
2.2 配置完成后启动config server
每台设备都要启动
mongod -f /usr/etc/dbconf/npbase_shard.conf
2.3 初始化配置服务器副本集
进入Mongo命令行,可选择任意配置服务器节点初始化配置副本集
只需要在一台设备上初始化
mongo -port 20000
config = (
{
_id : "configs",
members: [
{ _id : 0, host : "192.168.2.195:20000" },
{ _id : 1, host : "192.168.2.196:20000" },
{ _id : 2, host : "192.168.2.197:20000" },
]
}
)
初始化之前要保证每台设备都启动完毕,配置好了,不然会报错
rs.initiate(config)
3. shard分片集
3.1 配置分片集
shard分片集是实际存储数据的地方,配置shard一定要配置shardsvr=true。
每台设备都要配置,每台机子蓝字的地方需要改完自己IP
vi /usr/etc/dbconf/shard_test.conf
--------------分片1-----------------------
fork=true
nounixsocket=true
bind_ip=192.168.2.195
port=26021
logappend=true
shardsvr=true
replSet=shard1
logpath=/var/log/test/shard_test/shard.log
dbpath=/flash/system/volume/data/test/shard_test
--------------分片2-----------------------
fork=true
nounixsocket=true
bind_ip=192.168.2.196
port=26021
logappend=true
shardsvr=true
replSet=shard2
logpath=/var/log/test/shard_test/shard.log
dbpath=/flash/system/volume/data/test/shard_test
--------------分片3-----------------------
fork=true
nounixsocket=true
bind_ip=192.168.2.197
port=26021
logappend=true
shardsvr=true
replSet=shard3
logpath=/var/log/test/shard_test/shard.log
dbpath=/flash/system/volume/data/test/shard_test
3.2 开启shard服务
每台设备都要开启,每个shard节点服务都要开启
mongod -f /usr/etc/dbconf/shard_test.conf
3.3 初始化shard分片副本集
每台设备上都要初始化
mongo -port 26021 -host 192.168.2.195
config = (
{
_id : "shard1",
members: [
{ _id : 0, host : "192.168.2.195:26021" },
]
}
)
初始化之前要保证每台设备都启动完毕,配置好了,不然会报错
rs.initiate(config)
--------------分片2-----------------------
mongo -port 26021 -host 192.168.2.196
config = (
{
_id : "shard2",
members: [
{ _id : 0, host : "192.168.2.196:26021" },
]
}
)
初始化之前要保证每台设备都启动完毕,配置好了,不然会报错
rs.initiate(config)
--------------分片3-----------------------
mongo -port 26021 -host 192.168.2.197
config = (
{
_id : "shard3",
members: [
{ _id : 0, host : "192.168.2.197:26021" },
]
}
)
初始化之前要保证每台设备都启动完毕,配置好了,不然会报错
rs.initiate(config)
4. 配置mogos路由服务
4.1 参数启动
mongodb中的router(mongos)角色只负责提供一个入口,不存储任何的数据,router最重要的配置是指定configsvr的地址,使用复制集ip+端口的方式指定配置多个router,任何一个都能正常的获取数据。
每台设备都需要启动,蓝字的地方需要根据机子变动
mongos --port 27017 --configdb configs/192.168.2.195:20000,192.168.2.196:20000,192.168.2.197:20000 --logpath /var/log/test/shard_test/route.log --fork
4.2 将之前配置好的shard副本集添加到分片中
只需要在一台设备上初始化
mongo admin -port 27017
sh.addShard("shard1/192.168.2.195:26021")
sh.addShard("shard2/192.168.2.196:26021")
sh.addShard("shard3/192.168.2.197:26021")
查看分片
sh.status()
4.3指定数据库和集合分片策略
在刚刚初始化的那台机子上
接下来需要指定数据库分片并配置片键,片键必须是索引。
激活数据库分片功能
db.runCommand({ enablesharding:"shardtest" })
开启Hash分片
db.runCommand({ shardcollection: "shardtest.test", key: { _id:"hashed"}})
5.测试
5.1插入数据测试
mongo admin -port 27017
#切换到db shardtest
use shardtest
#往shardtest的test集合中插入20000条数据
for(i=1;i<20001;i++){db.test.insert({"name":"test","number":i,"date":new Date()});}
#查看test表中的记录数,判断数据是否插入成功
db.getCollection('test').count()
5.2 分片结果测试
20000条数据经过hash算法分别插入到了三个分片中。
三个分片分别插入了6725条、9942条记录、9942条记录。
#分片一:6725条记录
mongo -port 26021 -host 192.168.2.195
use shardtest
db.getCollection('test').count()
#分片二:6589条记录
mongo -port 26021 -host 192.168.2.196
use shardtest
db.getCollection('test').count()
#分片三:6686条记录
mongo -port 26021 -host 192.168.2.197
use shardtest
db.getCollection('test').count()
5.3 关闭一个分片节点测试
结束其中一个分片节点,再次查询shardtest数据库中test集合数量,系统报错