MongoDB 7.0 副本集高可用部署

适用场景:生产环境搭建高可用 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/

相关推荐
开开心心就好16 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
予枫的编程笔记17 小时前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun17 小时前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__17 小时前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
陈桴浮海17 小时前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
生活很暖很治愈17 小时前
Linux——环境变量PATH
linux·ubuntu
?re?ta?rd?ed?17 小时前
linux中的调度策略
linux·运维·服务器
深圳市九鼎创展科技17 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
hweiyu0017 小时前
Linux 命令:tr
linux·运维·服务器
Trouvaille ~17 小时前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议