服务器信息:CentOS
docker版本:version 20.10.17
mongoDB:3.6.18
在两台服务器上部署mongo主从
机器A:192.168.214.111 (部署mongo主节点)
机器B:192.168.214.222 (部署mongo从节点+仲裁节点)
机器A和机器B都操作
# 数据文件
mkdir -p /usr/local/mongo/data
# 日志文件
mkdir -p /usr/local/mongo/log
# 配置文件
mkdir -p /usr/local/mongo/conf
# key文件
mkdir -p /usr/local/mongo/key
机器A和机器B都操作
cd /usr/local/mongo/conf
vi mongo.conf
mongo.conf内容如下:
net:
#启动端口
port: 27017
#允许连接的IP(0.0.0.0作用与--bind_ip_all类似)
bindIp: 0.0.0.0
systemLog:
#重新启动mongodb的时候日志拼接在以前的日志文件上
logAppend: true
security:
#路径是容器内的路径
keyFile: "/data/mongodbKey.key"
#开启客户端连接认证 disabled 关闭授权
authorization: "enabled"
replication:
replSetName: "mongo"
在机器B 192.168.214.222上执行
# 数据文件
mkdir -p /usr/local/mongo-arbiter/data
# 日志文件
mkdir -p /usr/local/mongo-arbiter/log
# 配置文件
mkdir -p /usr/local/mongo-arbiter/conf
# key文件
mkdir -p /usr/local/mongo-arbiter/key
在机器B 192.168.214.222上执行
cd /usr/local/mongo-arbiter/conf
vi mongo.conf
mongo.conf内容如下:
net:
#启动端口
port: 27017
#允许连接的IP(0.0.0.0作用与--bind_ip_all类似)
bindIp: 0.0.0.0
systemLog:
#重新启动mongodb的时候日志拼接在以前的日志文件上
logAppend: true
security:
#路径是容器内的路径
keyFile: "/data/mongodbKey.key"
#开启客户端连接认证 disabled 关闭授权
authorization: "enabled"
replication:
replSetName: "mongo"
在机器A或机器B上执行都行,我是在机器A 192.168.214.111上执行的
cd /usr/local/mongo/key
# 生成key文件
openssl rand -base64 756 > mongodbKey.key
# key文件必须设置成400,否则将会失败(设置成其他都会失败了,不知道是不是这个权限问题)
chmod 400 mongodbKey.key
# 赋予容器内key权限(主从仲裁节点都需要执行)
chown 999:999 mongodbKey.key
然后,将mongodbKey.key分别复制到机器B的 /usr/local/mongo/key 和 /usr/local/mongo-arbiter/key 路径下
并分别进入/usr/local/mongo/key 和 /usr/local/mongo-arbiter/key 路径下给mongodbKey.key授予权限
# 授予权限
chmod 400 mongodbKey.key
chown 999:999 mongodbKey.key
在机器A 192.168.214.111上执行
# mongo主节点
# replSet "mongo" 和mongo.conf中的replSetName要保持一致
docker run -di -p 27017:27017 -e TZ=Asia/Shanghai --restart always \
-v /usr/local/mongo/conf/:/data/conf \
-v /usr/local/mongo/data/:/data/db \
-v /usr/local/mongo/log:/data/log \
-v /usr/local/mongo/key/mongodbKey.key:/data/mongodbKey.key \
--name mongo_master mongo:3.6.18 --auth \
--replSet "mongo" \
--bind_ip_all -f /data/conf/mongo.conf
在机器B 192.168.214.222上执行
# mongo从节点
docker run -di -p 27017:27017 -e TZ=Asia/Shanghai --restart always \
-v /usr/local/mongo/conf/:/data/conf \
-v /usr/local/mongo/data/:/data/db \
-v /usr/local/mongo/log:/data/log \
-v /usr/local/mongo/key/mongodbKey.key:/data/mongodbKey.key \
--name mongo_slave mongo:3.6.18 --auth \
--replSet "mongo" \
--bind_ip_all -f /data/conf/mongo.conf
# 仲裁节点
docker run -di -p 27018:27017 -e TZ=Asia/Shanghai --restart always \
-v /usr/local/mongo-arbiter/conf/:/data/conf \
-v /usr/local/mongo-arbiter/data/:/data/db \
-v /usr/local/mongo-arbiter/log:/data/log \
-v /usr/local/mongo-arbiter/key/mongodbKey.key:/data/mongodbKey.key \
--name mongo_arbiter mongo:3.6.18 --auth \
--replSet "mongo" \
--bind_ip_all -f /data/conf/mongo.conf
在机器A或机器B上执行都行,我是在机器A 192.168.214.111上执行的
# 进入容器中mongo客户端
docker exec -it mongo_master mongo
# 带仲裁节点的初始化
# _id:"mongo",mongo为副本集名称(mongo.conf中的replSetName,注意保持一致),对应--replSet后的名称
# priority数值大的优先级高,即为默认主节点
config={
_id:"mongo",
members:[
{_id:0,host:"192.168.214.111:27017",priority:3},
{_id:1,host:"192.168.214.222:27017",priority:2},
{_id:2,host:'192.168.214.222:27018',arbiterOnly:true}
]
}
#初始化
rs.initiate(config)
# 初始化完成后可以查看状态
rs.status()
在mongo主节点上执行
docker exec -it mongo_master mongo
#切换至admin
use admin
#添加用户
db.createUser({user:'root',pwd:'root',roles:[{role:'userAdminAnyDatabase',db:'admin'},{role:'root',db:'admin'}]})
#登录
db.auth('root','root')
#切换至测试库
use test
#给测试库添加账户
db.createUser({user:'test',pwd:'123321',roles:[{role:'dbOwner',db:'test_db'}]})
# 认证用户
db.auth('test','123321')
#给测试库添加数据
db.userinfo.insert({"name":"李四","sex":"男"})
# 使用user:'test',pwd:'123321'连接mongo数据库,可以看到数据
(1)注意开防火墙端口
(2)如果在初始化时出现连接错误,可以在步骤2创建docker的命令上加上–network=host参数(仅mongo主从容器加,仲裁节点不需要)
(3)如果在搭建过程中出现错误,需要重新搭建,记得一定要将主从和仲裁的data路径下的数据删光,再重新搭建