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/

相关推荐
文静小土豆2 小时前
Rocky Linux 二进制 安装K8S-1.35.0高可用集群
linux·运维·kubernetes
暮云星影2 小时前
二、linux系统 应用开发:整体Pipeline流程
linux·arm开发
weixin_430750934 小时前
OpenMediaVault debian Linux安装配置企业私有网盘(三) 静态ip地址配置
linux·服务器·debian·nas·网络存储系统
403240734 小时前
[Jetson/Ubuntu 22.04] 解决挂载 exFAT 硬盘报错 “unknown filesystem type“ 及只读权限问题的终极指南
linux·运维·ubuntu
Source.Liu4 小时前
【沟通协作软件】使用 Rufus 制作 Ubuntu 启动盘的详细过程
linux·ubuntu
Love丶伊卡洛斯4 小时前
Ubuntu 部署 STUN服务端
linux·运维·ubuntu
梁洪飞4 小时前
通过链接文件和Start.S学习armv7
linux·arm开发·嵌入式硬件·学习·arm
DN金猿4 小时前
使用ubuntu安装nginx时报错
linux·nginx·ubuntu
小赵还有头发5 小时前
安装Ceres与glog
linux·学习·无人机·ceres·glog