深色模式
MongoDB 部署与副本集
摘要:MongoDB 的高可用单元是副本集(Replica Set):一个主节点接收写入,多个从节点异步复制oplog,主节点故障自动选举新主。本文搭建最小生产形态的三节点副本集。
适用环境
bash
cat /etc/os-release | grep -E '^ID='
mkdir -p /data/mongodb/{data,log}
# 三台机器 27017 互通
nc -zv 10.0.1.41 270171
2
3
4
2
3
4
操作步骤
1. 安装(以官方仓库为例)
bash
# RHEL 系:添加官方 repo 后安装 mongodb-org
sudo yum install -y mongodb-org
# Debian/Ubuntu
sudo apt-get install -y mongodb-org
mongod --version | head -n 11
2
3
4
5
6
2
3
4
5
6
2. 配置 mongod.conf
yaml
# /etc/mongod.conf
storage:
dbPath: /data/mongodb/data
systemLog:
destination: file
path: /data/mongodb/log/mongod.log
logAppend: true
net:
bindIp: 127.0.0.1,10.0.1.41
port: 27017
replication:
replSetName: rs0
processManagement:
fork: true1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
bash
sudo systemctl enable --now mongod1
3. 开启认证(推荐先建管理员再开启)
bash
mongosh1
javascript
use admin
db.createUser({ user: "root", pwd: "Str0ngPass!2026", roles: ["root"] })1
2
2
yaml
# mongod.conf 追加后重启
security:
authorization: enabled
keyFile: /data/mongodb/keyfile # 副本集成员间认证,权限需为 6001
2
3
4
2
3
4
bash
openssl rand -base64 756 > /data/mongodb/keyfile
chmod 600 /data/mongodb/keyfile
sudo systemctl restart mongod1
2
3
2
3
危险
keyFile 权限必须为 600 且三台内容一致,否则 mongod 启动失败;不要把它提交到代码仓库。
4. 初始化副本集
bash
mongosh -u root -p 'Str0ngPass!2026' --authenticationDatabase admin1
javascript
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "10.0.1.41:27017", priority: 2 },
{ _id: 1, host: "10.0.1.42:27017", priority: 1 },
{ _id: 2, host: "10.0.1.43:27017", priority: 1 }
]
})
rs.status()1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
5. 创建业务账号(最小权限)
javascript
use shopdb
db.createUser({ user: "app_rw", pwd: "Str0ngPass!2026", roles: [{ role: "readWrite", db: "shopdb" }] })
db.createUser({ user: "app_ro", pwd: "Str0ngPass!2026", roles: [{ role: "read", db: "shopdb" }] })1
2
3
2
3
6. 验证故障切换
bash
# 在主节点上停止 mongod,观察约 10 秒内选出新主
sudo systemctl stop mongod
# 在其余节点查看
rs.status() | grep -A2 '"stateStr"'1
2
3
4
2
3
4
验证
javascript
// 主节点写入
use shopdb
db.probe.insertOne({ ts: new Date() })
// 从节点读取(需先允许从节点读)
rs.secondaryOk()
db.probe.find()
// 查看复制延迟
rs.printSecondaryReplicationInfo()1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
bash
mongosh -u app_ro -p 'Str0ngPass!2026' --authenticationDatabase shopdb --eval "db.probe.countDocuments()"1
常见坑
WARNING
从节点默认不可读,需先执行 rs.secondaryOk()(旧版 rs.slaveOk())。
WARNING
副本集节点数应为奇数,或用仲裁节点(arbiter)凑选举票数;两节点副本集任一宕机即无法选出主节点。
DANGER
未开启认证直接暴露 27017 到公网会被勒索清库;务必配置 authorization 与防火墙/安全组。