1 准备环境(主从一样操作)
1.1 准备主从映射目录
# 数据文件
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
1.2 准备配置文件(主从仲裁都一样)
cd /usr/local/mongo/conf
vi 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"
1.3 准备key文件(这里的key文件只需要生成一份即可,保证主从仲裁用的同一个key文件)
cd /usr/local/mongo/key
# 生成key文件
openssl rand -base64 756 > mongodbKey.key
# key文件必须设置成400,否则将会失败(设置成其他都会失败了,不知道是不是这个权限问题)
chmod 400 mongodbKey.key
# 赋予容器内key权限(主从仲裁节点都需要执行)
chown 999:999 mongodbKey.key
1.4 准备仲裁
# 数据文件
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
2 安装主从MongoDB(主一台服务器,备仲裁一台服务器)
# 主服务器
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
# 备服务器
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
3 在主上初始化节点
docker exec -it mongo_master mongo
# 带仲裁节点的初始化
# _id为副本集名称,对应--replSet后的名称
# 27017为主节点,27018为从节点,27019为仲裁节点,可以配置多个从节点和仲裁节点
config={
_id:"mongo",
members:[
{_id:0,host:"ip:port",priority:3},
{_id:1,host:"ip:port",priority:2},
{_id:2,host:'ip:port',arbiterOnly:true}
]
}
# 不带仲裁节点的初始化
config={
_id:"mongo",
members:[
{_id:0,host:"ip:port",priority:3},
{_id:1,host:"ip:port",priority:2}
]
}
rs.initiate(config)
4 查看状态
rs.status()
如出现以下就是部署成功 PRIMARY主节点 SECONDARY从节点
5 添加和删除从节点和主节点
rs.add("ip:port")
rs.remove("ip:port")
6 添加和删除仲裁节点
rs.addArb("ip:port")
rs.remove("ip:port")
7 创建用户验证主从数据是否成功(主上操作)
docker exec -it mongo_master mongo
#切换至admin
use admin
#添加用户
db.createUser({user:'root',pwd:'root',roles:[{role:'userAdminAnyDatabase',db:'admin'},{role:'dbAdminAnyDatabase',db:'admin'}]})
#登录
db.auth('root','root')
#切换至测试库
use test
#给测试库添加账户
db.createUser({user:'test',pwd:'root',roles:[{role:'dbOwner',db:'lsqt_db_1'},{role:'dbOwner',db:'lsqt_db_2'}]})
#给测试库添加数据
db.userinfo.insert({"name":"张三","sex":"男"})