MongoDB 7.0 副本集高可用部署

适用场景:生产环境搭建高可用 MongoDB 副本集,确保数据冗余与自动故障转移
MongoDB 版本:7.0.28(社区版)
操作系统:CentOS 7.9
架构:1 主(Primary) + 2 从(Secondary),共 3 个数据承载节点(P-S-S)
文件系统:XFS(推荐 XFS)


一、为什么需要副本集?

MongoDB 副本集(Replica Set)是实现 高可用性 和 数据冗余 的核心机制:

  • 自动故障转移:主节点宕机后,从节点自动选举新主,服务不中断;
  • 数据多副本:每个从节点保存完整数据副本,防止单点数据丢失;
  • 读写分离(可选):从节点可承担部分读请求,提升系统吞吐。

    8fdce0d1ddd44c91a2a2063beb5c582c

 推荐配置: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

注意事项:
认证与权限:启用副本集时,务必配置安全性(如 必须设置为 600权限 和 配置用户权限)。
网络延迟:使用 rs.status() 中的 pingMs 字段监控节点间延迟,建议 < 10ms。确保节点之间的网络连接良好,以减少数据同步延迟。
节点数量:推荐奇数个数据承载节点(如 3、5),避免“脑裂。最小高可用配置为 3 节点(P-S-S);若成本受限,可采用 2 数据节点 + 1 仲裁节点(Arbiter),但仲裁节点不存储数据,。
数据一致性:默认情况下,所有读写操作都在 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/

posted @ 2026-01-21 20:16  Mr'liu  阅读(10)  评论(0)    收藏  举报