适用场景:生产环境搭建高可用 MongoDB 副本集,确保数据冗余与自动故障转移
MongoDB 版本:7.0.28(社区版)
操作系统:CentOS 7.9
架构:1 主(Primary) + 2 从(Secondary),共 3 个数据承载节点(P-S-S)
文件系统:XFS(推荐 XFS)
一、为什么需要副本集?
MongoDB 副本集(Replica Set)是实现 高可用性 和 数据冗余 的核心机制:
- 自动故障转移:主节点宕机后,从节点自动选举新主,服务不中断;
- 数据多副本:每个从节点保存完整数据副本,防止单点数据丢失;
- 读写分离(可选):从节点可承担部分读请求,提升系统吞吐。
推荐配置:3 个数据节点(P-S-S),主节点负责所有写入操作,从节点则从主节点复制数据,提供读操作的负载均衡,两个从节点都可以在选举中成为主节点。
二、环境准备
1. 服务器信息
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| mongo-node1 | 10.0.0.10 | Primary |
| mongo-node2 | 10.0.0.11 | Secondary |
| mongo-node3 | 10.0.0.12 | Secondary |
所有操作需在 三台主机上分别执行(除非特别说明)。
2. 系统初始化(所有节点)
# 配置 yum 源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
yum clean all && yum makecache
# 安装基础工具
yum install -y telnet bind-utils net-tools vim-enhanced lrzsz unzip gcc gcc-c++ ntpdate vim sysstat nmap
# 时间同步
ntpdate -s ntp1.aliyun.com
# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# 关闭防火墙与 postfix
systemctl stop firewalld && systemctl disable firewalld
systemctl stop postfix && systemctl disable postfix
# 设置主机名(每台不同)
hostnamectl set-hostname mongo-node1 # node2 改为 mongo-node2,以此类推
# 配置 hosts
cat >> 'EOF' << /etc/hosts
10.0.0.10 mongo-node1
10.0.0.11 mongo-node2
10.0.0.12 mongo-node3
EOF
三、系统优化与用户配置
# 设置最大文件与最大进程打开数
cat >> /etc/security/limits.conf << EOF
mongodb soft nproc 65535
mongodb hard nproc 65535
mongodb soft nofile 81920
mongodb hard nofile 81920
EOF
# 关闭透明大页,并使设置开机自启
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
chmod +x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
# 内核调优
cat /etc/sysctl.conf
vm.swappiness=0
net.core.somaxconn = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 65535
net.ipv4.tcp_max_syn_backlog = 65535
fs.file-max = 1000000
fs.inotify.max_user_watches = 65536
vm.max_map_count=262144
# 创建 mongodb 用户与目录
useradd -r -s /sbin/nologin mongodb
mkdir -p /app/data/mongodb/{db,logs,conf}
chown -R mongodb:mongodb /app/data
四、安装 MongoDB 7.0
安装依赖
yum install -y libcurl openssl xz-libs
下载并解压 MongoDB
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.28.tgz
tar -xzf mongodb-linux-x86_64-rhel70-7.0.28.tgz -C /app/
mv /app/mongodb-linux-x86_64-rhel70-7.0.28 /app/mongodb
chown -R mongodb:mongodb /app/mongodb
配置环境变量
cat >> /etc/profile << EOF
export MONGODB_HOME=/app/mongodb
export PATH=\MONGODB_HOME/bin:\\PATH
EOF
source /etc/profile
配置文件(所有节点内容一致)
cat >> /app/data/mongodb/conf/mongod.conf <<EOF
storage:
dbPath: /app/data/mongodb/db
wiredTiger:
engineConfig:
cacheSizeGB: 5 # 根据内存调整
systemLog:
destination: file
logAppend: true
path: /app/data/mongodb/logs/mongod.log
logRotate: rename
net:
port: 27017
bindIp: 0.0.0.0
processManagement:
fork: false # systemd 管理时不 fork
replication:
replSetName: rs0
operationProfiling:
slowOpThresholdMs: 3000 # 记录慢操作的阈值,单位为毫秒
mode: slowOp
#security: # 认证
authorization: enabled
keyFile: /app/data/mongodb/conf/mongo-keyfile
EOF
添加权限
chown mongodb:mongodb /app/data/mongodb/conf/mongod.conf
生成密钥文件(仅在主节点执行,然后复制到 node2、node3 的相同路径,注意权限)
openssl rand -base64 753 >/app/data/mongodb/conf/mongo-keyfile
chmod 600 /app/data/mongodb/conf/mongo-keyfile
chown mongodb:mongodb /app/data/mongodb/conf/mongo-keyfile
配置 systemd 服务(所有节点)
cat >> /etc/systemd/system/mongodb.service <<EOF
Unit
Description=MongoDB Database Server (Binary Install)
Documentation=https://docs.mongodb.org/manual
After=network.target
Wants=network.target
Service
Type=simple
User=mongodb
Group=mongodb
ExecStart=/app/mongodb/bin/mongod -f /app/data/mongodb/conf/mongod.conf
Restart=on-failure
RestartSec=10
TimeoutSec=300
LimitNOFILE=64000
Install
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mongodb
systemctl status mongodb # 检查是否启动成功
出处:https://www.cnblogs.com/liucx/
五、初始化副本集
1. 安装 mongosh(仅需在一台节点操作)
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/7.0/x86_64/RPMS/mongodb-mongosh-2.2.15.x86_64.rpm
rpm -ivh mongodb-mongosh-2.2.15.x86_64.rpm
2. 连接并初始化副本集(先不启用认证)
注意:首次初始化时,mongod.conf 中 暂时注释掉 security 部分,否则无法无认证连接。
mongosh mongo-node1:27017
// 在 mongosh 中执行
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo-node1:27017" },
{ _id: 1, host: "mongo-node2:27017" },
{ _id: 2, host: "mongo-node3-:27017" }
]
})
## 成功后提示:{ ok: 1 },shell 提示符变为 rs0:PRIMARY>
3. 验证副本集状态
rs.conf() // 查看配置
rs.status() // 查看各节点状态(应显示 1 Primary + 2 Secondary)
4. 创建管理员账号
use admin
db.createUser({
user: "root",
pwd: "T6WBVZBAdY1ddflzq", // 请务必使用强密码并妥善保管
roles: [{ role: "root", db: "admin" }]
})
六、启用认证并重启服务
1. 取消注释 security 配置
确保 /app/data/mongodb/conf/mongod.conf 中包含:
security:
authorization: enabled
keyFile: /app/data/mongodb/conf/mongo-keyfile
2. 滚动重启 MongoDB 服务
为避免集群脑裂,按以下顺序操作:
# 1. 先停止两个从节点
ssh mongo-node2 "systemctl stop mongodb"
ssh mongo-node3 "systemctl stop mongodb"
# 2. 再停止主节点
systemctl stop mongodb
# 3. 先启动主节点
systemctl start mongodb
# 4. 再启动两个从节点
ssh mongo-node2 "systemctl start mongodb"
ssh mongo-node3 "systemctl start mongodb"
七、验证副本集与数据同步
1. 使用认证方式连接
mongosh "mongodb://mongo-node1:27017" -u root -p 'T6WBVZBAdY1ddflzq' --authenticationDatabase admin
2. 查看副本集状态
rs.conf() // 查看配置
rs.status() // 查看各节点状态(应显示 1 Primary + 2 Secondary)
3. 插入测试数据(验证同步)
use test
db.tt.insertOne({
articleid: "100003",
content: "今天天气真好,阳光明媚",
userid: "1001",
nickname: "liu"
})
4. 查询数据(可在任意节点验证)
db.tt.find().pretty()
从节点默认不允许读取(出于一致性考虑),如需读从,需显式开启:
// 在从节点执行
rs.slaveOk(true)
db.tt.find()
附:连接字符串示例(应用端使用)
mongodb://root:T6WBVZBAdY1ddflzq@10.0.0.10:27017,10.0.0.10:27017,10.0.0.10:27017/?replicaSet=rs0&authSource=admin&readPreference=primary
参考:
Mongodb生产说明:https://www.mongodb.com/zh-cn/docs/manual/administration/production-notes/
Mongodb副本集说明:https://www.mongodb.com/zh-cn/docs/v7.0/core/replica-set-architecture-three-members/
Mongodb部署说明:https://www.mongodb.com/zh-cn/docs/v7.0/tutorial/deploy-replica-set/