目录
一、架构目标
搭建mongodb分布式集群(副本集 + 分片集群),测试mongodb分布式集群,我用三个服务器,10.0.0.1,10.0.0.2,10.0.0.3,这三个服务器不知道是否事实存在,我拿来做个例子),本次测试我使用mongo 4.0,基于mongo配置文件进行docker部署
图片来源(https://docs.mongodb.com/manual/core/sharded-cluster-components/)
sever | port | name | description |
10.0.0.1 | 27017 | mongos | 路由1 |
10.0.0.2 | 27017 | mongos | 路由2 |
10.0.0.1 | 8000 | configsvr0 | 配置服务 |
10.0.0.2 | 8000 | configsvr1 | 配置服务副本 |
10.0.0.3 | 8000 | configsvr2 | 配置服务副本 |
10.0.0.1 | 9005 | shardsvr00 | 分片1 |
10.0.0.1 | 9006 | shardsvr01 | 分片1副本 |
10.0.0.1 | 9007 | shardsvr02 | 分片1仲裁 |
10.0.0.2 | 9005 | shardsvr10 | 分片2 |
10.0.0.2 | 9006 | shardsvr20 | 分片2副本 |
10.0.0.2 | 9007 | shardsvr30 | 分片2仲裁 |
二、部署配置服务器
1、10.0.0.1
docker run -d -p 9000:27019 --name configsvr0 -v /home/mongod/config/configsvr0:/data/configdb docker.io/mongo:4.0.0 --configsvr --replSet "rs_configsvr" --bind_ip_all
--configsvr 定义为mongo配置服务器
--replSet 副本集名称,相同副本须使用同一个副本集名称
-v 宿主机的目录:挂载到容器的目录
-p 端口映射,如果防火墙没有放行端口,可能此操作会失败
--bind_ip_all 允许所有地址访问
备注:配置服务器启动端口为 27019
2、10.0.0.2
docker run -d -p 9000:27019 --name configsvr1 -v /home/mongod/config/configsvr0:/data/configdb docker.io/mongo:4.0.0 --configsvr --replSet "rs_configsvr" --bind_ip_all
3、10.0.0.3
docker run -d -p 9000:27019 --name configsvr2 -v /home/mongod/config/configsvr0:/data/configdb docker.io/mongo:4.0.0 --configsvr --replSet "rs_configsvr" --bind_ip_all
结果显示:
备注:如果docker ps 没有刚才创建的容器名称,可以使用docker logs <容器id>查看docker 日志
4、初始化配置服务复制集
# 进入容器中,创建的三个配置服务中随便一个
docker exec -it configsvr0 bash
# 登录mongo
mongo --host 10.0.0.1 --port 8000
# 初始化
rs.initiate({
_id: "rs_configsvr",
configsvr: true,
members: [
{ _id : 0, host : "10.0.0.1:8000" },
{ _id : 1, host : "10.0.0.2:8000" },
{ _id : 2, host : "10.0.0.3:8000" }
]
}
)
结果显示:
三、创建分片副本集
1、分片副本集配置文件
#所有用到的文件夹和文件必须在创建的时候给权限,包括重新创建,也需要重新给权限,并且文件夹要提前创建好
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /home/mongod/db #分片数据库路径
journal:
enabled: true
directoryPerDB: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/mongod/log/mongod.log # 分片日志
# network interfaces
net:
bindIpAll: true
# how the process runs
#processManagement:
# fork: true
# set auth?
setParameter:
enableLocalhostAuthBypass: false
#operationProfiling:
replication:
replSetName: rs_shardsvr0 #分片服务名称
sharding:
clusterRole: shardsvr
备注:详细配置可参见(http://docs.mongodb.org/manual/reference/configuration-options/)
2、10.0.0.1 分片
1、分片服务器部署
docker run --name shardsvr00 -d -p 9005:27018 -v /home/mongod/shard0:/home/mongod docker.io/mongo:4.0.0 -f /home/mongod/conf/mongod.conf
2、分片服务副本集部署
docker run --name shardsvr00 -d -p 9006:27018 -v /data1/mongod/shard0:/home/mongod docker.io/mongo:4.0.0 -f /home/mongod/conf/mongod.conf
3、仲裁服务器
docker run --name shardsvr00 -d -p 9007:27018 -v /home/mongod/shard2:/home/mongod docker.io/mongo:4.0.0 -f /home/mongod/conf/mongod.conf
注意事项:
1、需要提前建立需要的文件夹。并赋予权限(chmod -R 777 文件夹)。
2、三个分片服务器建立在三个位置,(docker代码 -v 参数即为实际建立需要的文件夹),需要注意对应创建分片配置文件,文件内容一致。
3、注意配置文件中的数据库文件报错路径以及日志文件路径,按需更改。
4、分片服务端口需要映射 27018
结果显示:
4、初始化分片服务器
# 登录进容器中
docker exec -it shardsvr00 bash
#登录分片服务器
mongo --host 10.0.0.1 --port 9000
rs.initiate(
{
_id : "rs_shardsvr0",
members: [
{ _id : 0, host : "10.0.0.1:9000",priority:5 },
{ _id : 1, host : "10.0.0.1:9001",priority:3 },
{ _id : 2, host : "10.0.0.1:9002",arbiterOnly:true }
]
}
)
#rs.status() 查看状态
3、10.0.0.2分片
1、分片服务器部署
docker run --name shardsvr10 -d -p 9005:27018 -v /home/mongod/shard0:/home/mongod docker.io/mongo:4.0.0 -f /home/mongod/conf/mongod.conf
2、分片服务副本集部署
docker run --name shardsvr10 -d -p 9006:27018 -v /data1/mongod/shard0:/home/mongod docker.io/mongo:4.0.0 -f /home/mongod/conf/mongod.conf
3、仲裁服务器
docker run --name shardsvr10 -d -p 9007:27018 -v /home/mongod/shard2:/home/mongod docker.io/mongo:4.0.0 -f /home/mongod/conf/mongod.conf
注意事项:
需要更改配置服务器中的分片服务名称
结果显示:
4、初始化分片服务器
# 登录进容器中
docker exec -it shardsvr10 bash
#登录分片服务器
mongo --host 10.0.0.2 --port 9005
rs.initiate(
{
_id : "rs_shardsvr0",
members: [
{ _id : 0, host : "10.0.0.2:9005",priority:5 },
{ _id : 1, host : "10.0.0.2:9006",priority:3 },
{ _id : 2, host : "10.0.0.2:9007",arbiterOnly:true }
]
}
)
#rs.status() 查看状态
四,创建mongos,连接mongos到分片集群
1、10.0.0.1
1、分片路由部署
docker run --name mongos0 -d -p 27017:27017 --entrypoint "mongos" docker.io/mongo:4.0.0 --configdb rs_configsvr/10.0.0.1:8000,10.0.0.2:8000,10.0.0.3:8000 --bind_ip_all
备注:
rs_configsvr/10.0.0.1:8000,10.0.0.2:8000,10.0.0.3:8000: 配置服务名称/配置服务端口(多个用逗号分隔)
结果显示
2、初始化mongos
# 进入mongos 容器中
docker exec -it mongos0 bash
# 连接mongos
mongo --host 127.0.0.1 --port 27017
# 添加分片服务器
sh.addShard("rs_shardsvr0/10.0.0.1:9000,10.0.0.1:9001,10.0.0.1:9002")
sh.addShard("rs_shardsvr1/10.0.0.2:9005,10.0.0.2:9006,10.0.0.2:9007")
结果展示
1
2、10.0.0.2
1、分片路由部署
docker run --name mongos0 -d -p 27017:27017 --entrypoint "mongos" docker.io/mongo:4.0.0 --configdb rs_configsvr/10.0.0.1:8000,10.0.0.2:8000,10.0.0.3:8000 --bind_ip_all
备注:
rs_configsvr/10.0.0.1:8000,10.0.0.2:8000,10.0.0.3:8000: 配置服务名称/配置服务端口(多个用逗号分隔)
结果显示
2、初始化mongos
# 进入mongos 容器中
docker exec -it mongos0 bash
# 连接mongos
mongo --host 127.0.0.1 --port 27017
# 添加分片服务器
sh.addShard("rs_shardsvr0/10.0.0.1:9000,10.0.0.1:9001,10.0.0.1:9002")
sh.addShard("rs_shardsvr1/10.0.0.2:9005,10.0.0.2:9006,10.0.0.2:9007")
结果展示
1
备注:多个路由配置是相同的,不是搭建副本集(我自己理解的),路由1什么配置,怎么操作,路由2也一样。
整个搭建Mongodb 集群就完成了,感兴趣可以自己尝试一下!