前置条件
副本集模式的优劣本文就不在介绍了,其他文章有更加详细的介绍,想了解的同学可以先行移步其他文章。
本文介绍在三台服务器上分别构建 MongoDB 并组合成副本集。
本文编写时间:2024 年 6 月 2 日
拉取 Docker 镜像
docker pull mongo
想指定版本的,直接去 docker hub 查询版本号就好了https://hub.docker.com/_/mongo
创建映射目录
mkdir /root/mongodb
mkdir /root/mongodb/db
mkdir /root/mongodb/logs
mkdir /root/mongodb/config
创建日志文件
touch /root/mongodb/logs/mongod.log
编写 MangoDB 配置文件
vim /root/mongodb/config/mongod.conf
配置文件内容
processManagement:
fork: false
net:
bindIpAll: true
port: 27017
systemLog:
destination: file
path: "/data/logs/mongod.log"
logAppend: true
replication:
oplogSizeMB: 256
replSetName: rs
storage:
dbPath: "/data/db/mongo"
security:
keyFile: "/data/mongodb/keyfile"
配置文件中的内容大家可以参考配置文件选项 - MongoDB 手册 v 7 。 0
设置keyfile
仅主节点操作
openssl rand -base64 666 > /root/mongodb/keyfile
chmod 600 /root/mongodb/keyfile
将生成的文件keyfile,复制的副节点的相同位置,并且同样配置 chmod 600
(重点)配置权限
所有服务器均执行该操作!
chown 999:999 /root/mongodb/keyfile
chown 999:999 /root/mongodb/config/mongod.conf
chown 999:999 /root/mongodb/logs/mongod.log
很多文章没有chown 999:999 这一步,导致容器无法访问文件,报错 error open file bad file
启动 docker
主节点
docker run -itd --name=mongo-master -p 27001:27017 --restart=always \
-v /root/mongodb/db:/data/db/mongo \
-v /root/mongodb/logs:/data/logs \
-v /root/mongodb/config/mongod.conf:/etc/mongod.conf \
-v /root/mongodb/keyfile:/data/mongodb/keyfile \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=Password \
mongo \
--config /etc/mongod.conf \
--auth
副节点
docker run -itd --name=mongo-salve -p 27001:27017 --restart=always \
-v /root/mongodb/db:/data/db/mongo \
-v /root/mongodb/logs:/data/logs \
-v /root/mongodb/config/mongod.conf:/etc/mongod.conf \
-v /root/mongodb/keyfile:/data/mongodb/keyfile \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=Password \
mongo \
--config /etc/mongod.conf \
--auth
进入容器内部
主节点操作即可
替换成自己的 IP 地址
docker exec -it mongo-master mongosh
use admin
config = {_id:"rs", version:1, members:[{_id:0, host:"11.11.11.11:27001", priority:9}, {_id:1, host:"22.22.22.22:27001", priority:3}, {_id:2, host:"33.33.33.33:27001",priority:1}]}
db.auth("root","Password")
rs.initiate(config)
rs.status()