MongoDB 三节点副本集离线部署运维手册

手册说明

适用环境:Linux(CentOS9/Rocky9)、无外网、无法使用yum仓库

核心架构:三节点副本集(1主2从),高可用、自动故障转移、读写分离

安装目录:/opt/mongodb(全程统一,无任何路径偏差)

MongoDB版本:8.2.6(长期稳定版,离线二进制包安装)

手册用途:服务器部署操作、日常运维、故障排查、存档查阅

一、前期准备

1.1 节点规划

|------------|--------------|-------|-----------------|-------------------|
| 节点名称 | 内网IP | 端口 | 预设角色 | 核心职责 |
| mongodb-01 | 10.20.12.207 | 27017 | Primary(主节点,优选) | 处理写请求、主导选举 |
| mongodb-02 | 10.20.12.207 | 27017 | Secondary(从节点) | 同步数据、提供读服务、故障时备选主 |
| mongodb-03 | 10.20.12.207 | 27017 | Secondary(从节点) | 同步数据、提供读服务、故障时备选主 |

1.2 目录规划(所有节点统一)

核心目录(全程固定,不可修改,避免部署异常):

  • 安装目录:/opt/mongodb(二进制包解压后存放路径)
  • 数据目录:/opt/mongodb/data(存储业务数据)
  • 日志目录:/opt/mongodb/log(MongoDB运行日志)
  • 密钥目录:/opt/mongodb/key(集群通信密钥,权限严格控制)
  • 备份目录:/opt/mongodb/backup(定时备份数据存放)
  • 配置文件:/opt/mongodb/mongod.conf(核心配置文件)
  • 脚本目录:/opt/(启停脚本、安装脚本存放)(启停脚本未使用,直接使用systemd管理启停)

1.3 安装包下载

MongoDB 8.2.6 离线二进制包(Linux x64):

下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel93-8.2.6.tgz

下载后,将 .tgz 压缩包上传到所有节点的 /opt/ 目录下(必传,否则无法执行安装脚本)。

1.4 硬件基础要求(生产标准)

  • CPU:4核及以上(保证并发性能)
  • 内存:8G~16G(WiredTiger缓存设为内存50%)
  • 磁盘:独立SSD(必须,禁止机械盘,避免IO瓶颈)
  • 网络:同机房内网,延迟<10ms(保证数据同步速度)

二、离线安装步骤(所有节点执行)

2.1 一键安装脚本(核心步骤)

  1. 新建安装脚本,路径:/opt/install_mongo.sh

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #!/bin/bash # MongoDB 离线一键安装(安装目录:/opt/mongodb) # 适用:无外网、CentOS9/Rocky9、MongoDB 8.2.6 # 1. 进入安装包所在目录 cd /opt # 2. 解压二进制包 tar -zxvf mongodb-linux-x86_64-rhel93-8.2.6.tgz # 3. 重命名为 mongodb(固定目录名,避免路径混乱) mv mongodb-linux-x86_64-rhel93-8.2.6 mongodb # 4. 创建MongoDB运行用户(最小权限,避免root运行) useradd -r -s /sbin/nologin mongodb # 5. 创建数据、日志、密钥、备份目录 mkdir -p /opt/mongodb/{data,log,key,backup} # 6. 授权目录(确保mongodb用户拥有全部权限) chown -R mongodb:mongodb /opt/mongodb chmod 700 /data/mongodb/key # 密钥目录严格权限,防止泄露 # 7. 配置环境变量(全局可直接执行mongod、mongosh命令) echo 'export PATH=$PATH:/opt/mongodb/bin' >> /etc/profile source /etc/profile # 8. 安装完成提示 echo "=== MongoDB 离线安装完成(安装目录:/opt/mongodb) ===" echo "=== 下一步:配置mongod.conf文件 ===" |

  1. 给脚本授权并执行(所有节点必须执行):

|-----------------------------------------------------------|
| chmod +x /opt/install_mongo.sh cd /opt ./install_mongo.sh |

  1. 验证安装:执行 mongod --version,出现版本信息即安装成功。

2.2 系统基础优化(所有节点执行,必做)

优化目的:关闭影响MongoDB性能的系统配置,保证集群稳定运行

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 1. 关闭防火墙(生产可按需配置端口放行,此处为简化部署) systemctl stop firewalld && systemctl disable firewalld # 2. 关闭SELinux(避免权限拦截) setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 3. 关闭THP(透明大页,MongoDB性能致命坑) echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag # 4. 内核参数优化(内存、IO、网络) cat >> /etc/sysctl.conf <<EOF vm.swappiness = 1 # 禁止内存交换,避免性能抖动 vm.dirty_ratio = 15 # 脏数据占比,防止IO阻塞 vm.dirty_background_ratio = 5 # 后台刷脏数据阈值 fs.file-max = 655350 # 最大文件句柄数 EOF sysctl -p # 生效内核参数 # 5. 资源限制(提升MongoDB可打开文件数、进程数) cat >> /etc/security/limits.conf <<EOF mongodb soft nofile 65535 mongodb hard nofile 65535 mongodb soft nproc 65535 mongodb hard nproc 65535 EOF |

三、核心配置文件(每台节点专属)

配置文件路径:/opt/mongodb/mongod.conf(所有节点统一路径,仅修改bindIp)

3.1 mongodb-0 1 (1 0.20.12.207 ,主节点)配置

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| systemLog: destination: file # 日志输出到文件 path: /opt/mongodb/log/mongod.log # 日志路径 logAppend: true # 日志追加,不覆盖 timeStampFormat: iso8601 # 日志时间格式 storage: dbPath: /opt/mongodb/data # 数据存储路径 engine: wiredTiger # 默认存储引擎,生产必用 wiredTiger: cacheSizeGB: 4 # 缓存大小(8G内存设4G,16G设8G,为内存50%) collectionConfig: blockCompressor: zstd # 集合数据压缩,提升存储效率 net: port: 27017 # 服务端口 bindIp: 192.168.10.101,127.0.0.1 # 绑定本机IP,禁止公网访问 maxIncomingConnections: 2000 # 最大连接数,适配高并发 replication: replSetName: rs0 # 副本集名称,三台必须一致 oplogSizeMB: 51200 # Oplog大小(50G),防止大写入覆盖导致同步中断 processManagement: fork: true # 后台运行 pidFilePath: /opt/mongodb/mongod.pid # PID文件路径 security: authorization: enabled # 开启账号密码认证 keyFile: /opt/mongodb/key/keyfile # 集群通信密钥路径 |

3.2 mongodb-0 2 (1 0.20.12.208 ,从节点)配置

与mongo1配置完全一致,仅修改bindIp

|-----------------------------------------------------------------|
| net: port: 27017 bindIp: 110.20.12.208,127.0.0.1 # 改为mongo2本机IP |

3.3 mongodb-03 (1 0.20.12.209 ,从节点)配置

与mongo1配置完全一致,仅修改bindIp

|----------------------------------------------------------------|
| net: port: 27017 bindIp: 10.20.12.209,127.0.0.1 # 改为mongo3本机IP |

四、集群密钥配置(保证集群通信安全)

密钥作用:集群节点之间通信加密,防止未授权节点加入,仅在mongo1生成,分发到所有节点。

4.1 生成密钥(仅 mongodb-0 1 执行)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 生成密钥文件(路径固定,不可修改) openssl rand -base64 756 > /opt/mongodb/key/keyfile # 严格授权(密钥文件权限必须为600,否则MongoDB无法启动) chmod 600 /opt/mongodb/key/keyfile chown mongodb:mongodb /opt/mongodb/key/keyfile |

4.2 分发密钥(仅 mongodb-0 1 执行,分发到 mongodb-0 2、 mongodb-03

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 分发到mongodb-02 scp /opt/mongodb/key/keyfile root@10.20.12.208:/opt/mongodb/key/ # 分发到mongodb-03 scp /opt/mongodb/key/keyfile root@10.20.12.209:/opt/mongodb/key/ |

4.3 密钥授权(mongo db-0 2、mongo db-0 3分别执行)

|--------------------------------------------------------------------------------------------------------------|
| # 授权密钥文件,与mongodb-01保持一致 chmod 600 /data/mongodb/key/keyfile chown mongodb:mongodb /data/mongodb/key/keyfile |

五、启停脚本配置(所有节点执行)

脚本路径:/opt/,方便快速启停MongoDB,无需输入复杂命令。

5.1 启动脚本(start_mongo.sh)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #!/bin/bash # MongoDB 启动脚本(安装目录:/opt/mongodb) /opt/mongodb/bin/mongod -f /opt/mongodb/mongod.conf echo "MongoDB 启动完成!可执行 systemctl status mongod 查看状态" echo "连接命令:mongosh -u root -p MongoDB@123456789 --authenticationDatabase admin" |

5.2 停止脚本(stop_mongo.sh)

|-----------------------------------------------------------------------------------------------------------------------------------|
| #!/bin/bash # MongoDB 停止脚本(安装目录:/opt/mongodb) /opt/mongodb/bin/mongod --shutdown -f /opt/mongodb/mongod.conf echo "MongoDB 停止完成!" |

5.3 重启脚本(restart_mongo.sh)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #!/bin/bash # MongoDB 重启脚本(安装目录:/opt/mongodb) echo "正在停止 MongoDB..." /opt/mongodb/bin/mongod --shutdown -f /opt/mongodb/mongod.conf sleep 3 # 等待3秒,确保完全停止 echo "正在启动 MongoDB..." /opt/mongodb/bin/mongod -f /opt/mongodb/mongod.conf echo "MongoDB 重启完成!" |

5.4 脚本授权(所有节点执行)

|-----------------------------------------------------------------------|
| chmod +x /opt/start_mongo.sh /opt/stop_mongo.sh /opt/restart_mongo.sh |

六、Systemd开机自启配置(所有节点执行,生产必做)

作用:服务器重启后,MongoDB自动启动,无需手动操作,保证集群高可用。

6.1 新建服务文件

文件路径:/etc/systemd/system/mongod.service

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Unit] Description=MongoDB Server # 服务描述 After=network.target # 网络启动后,再启动MongoDB [Service] User=mongodb # 以mongodb用户运行 Group=mongodb # 所属用户组 ExecStart=/opt/mongodb/bin/mongod -f /opt/mongodb/mongod.conf # 启动命令 ExecStop=/opt/mongodb/bin/mongod --shutdown -f /opt/mongodb/mongod.conf # 停止命令 Type=forking # 后台运行模式 PrivateTmp=true # 私有临时目录,提升安全性 LimitNOFILE=655350 LimitNPROC=655350 [Install] WantedBy=multi-user.target # 多用户模式下开机自启 |

6.2 生效并设置开机自启(所有节点执行)

|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 重新加载systemd配置 systemctl daemon-reload # 设置开机自启 systemctl enable mongod # 启动MongoDB服务 systemctl start mongod # 查看服务状态(验证是否启动成功) systemctl status mongod |

6.3 Systemd常用命令(日常运维)

|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| systemctl start mongod # 启动 systemctl stop mongod # 停止 systemctl restart mongod # 重启 systemctl status mongod # 查看状态 systemctl disable mongod # 取消开机自启 |

七、集群初始化(仅mongo1执行,核心步骤)

初始化目的:将三台节点组成副本集,设置主从角色、选举规则,完成集群搭建。

7.1 连接MongoDB(mongo1执行)

一键安装mongosh

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 下载最新版 mongosh(x86_64,兼容 8.2.5) wget https://downloads.mongodb.com/compass/mongosh-2.3.8-linux-x64.tgz # 解压 tar -zxvf mongosh-2.3.8-linux-x64.tgz # 复制到你的 MongoDB bin 目录 cp mongosh-2.3.8-linux-x64/bin/mongosh /opt/mongodb/bin/ # 加执行权限 chmod +x /opt/mongodb/bin/mongosh #连接 /opt/mongodb/bin/mongosh |

7.2 初始化副本集

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| // 定义副本集配置(_id必须与mongod.conf中的replSetName一致,为rs0) var cfg = { _id: "ysbrs0", members: [ {_id: 0, host: "10.20.12.207:27017", priority: 10}, // 主节点,优先级最高(10) {_id: 1, host: "10.20.12.208:27017", priority: 1}, // 从节点,优先级1 {_id: 2, host: "10.20.12.209:27017", priority: 1} // 从节点,优先级1 ] }; // 执行初始化(仅执行一次,执行后集群开始选举主节点) rs.initiate(cfg); |

7.3 创建超级管理员账号(集群认证必备)

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| // 切换到admin数据库(系统默认管理员数据库) use admin; // 创建超级管理员(root角色,拥有所有权限) db.createUser({ user: "root", // 用户名 pwd: "MongoDB@123456789", // 密码(生产建议修改为复杂密码) roles: [{role: "root", db: "admin"}] // 角色与数据库 }); // 验证账号(可选,确认创建成功) db.auth("root", "MongoDB@123456789 |

7.4 集群优化配置(提升稳定性,减少同步延迟)

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| // 查看当前副本集配置 var rsConf = rs.conf(); // 关闭链式同步(从节点仅从主节点同步,避免多级同步导致延迟) rsConf.settings.chainingAllowed = false; // 应用配置(生效优化) rs.reconfig(rsConf); // 查看集群状态(确认初始化成功、主从角色正常) rs.status(); |

7.5 初始化验证

执行 rs.status() 后,满足以下条件即初始化成功:

  • Mongodb-01(10.20.12.207)的 stateStr 为 "PRIMARY"(主节点)
  • Mongodb-02、mongodb-03 的 stateStr 为 "SECONDARY"(从节点)
  • 所有节点的 health 为 1(节点健康)

八、日常运维命令(核心必备)

8.1 连接集群(所有节点均可执行)

|---------------------------------------------------------------------------------|
| # 使用管理员账号连接 mongosh -u root -p MongoDB@123456789 --authenticationDatabase admin |

8.2 集群健康巡检(连接后执行)

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| rs.status() // 查看集群整体状态(主从角色、节点健康、同步状态) rs.isMaster() // 查看当前主节点 db.printSecondaryReplicationInfo() // 查看从节点同步延迟(延迟应<100ms) db.serverStatus().connections // 查看当前连接数 db.serverStatus().mem // 查看内存使用情况 db.serverStatus().disk // 查看磁盘使用情况 |

8.3 数据备份(主节点执行,定时备份)

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 全量备份(备份到指定目录,按日期命名) mongodump -u root -p MongoDB@123456789 --authenticationDatabase admin \ -o /data/mongodb/backup/$(date +%Y%m%d) # 备份说明:可添加到定时任务(crontab),每天凌晨低峰执行 |

8.4 故障转移测试(可选,验证高可用)

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 1. 在主节点(mongo1)停止MongoDB systemctl stop mongod # 2. 在任意从节点连接集群,执行rs.status(),查看新主节点选举情况 # 3. 新主节点选举完成后,恢复mongo1的MongoDB服务 systemctl start mongod # 4. 再次查看rs.status(),mongo1会自动变为从节点,同步新主节点数据 |

九、常见故障排查(生产必备)

9.1 MongoDB启动失败

  • 原因1:密钥文件权限错误(必须为600),解决方案:执行 chmod 600 /data/mongodb/key/keyfile
  • 原因2:配置文件bindIp错误(未绑定本机IP),解决方案:修改mongod.conf的bindIp为当前节点IP
  • 原因3:目录权限不足,解决方案:执行 chown -R mongodb:mongodb /opt/mongodb /data/mongodb
  • 原因4:端口被占用,解决方案:执行 netstat -tulnp | grep 27017,杀死占用进程

9.2 从节点同步延迟过大

  • 原因1:Oplog大小不足,解决方案:修改mongod.conf的oplogSizeMB,增大至50G以上,重启集群
  • 原因2:网络延迟过高,解决方案:检查节点之间网络,确保同机房内网、延迟<10ms
  • 原因3:开启链式同步,解决方案:执行 var cfg=rs.conf(); cfg.settings.chainingAllowed=false; rs.reconfig(cfg);

9.3 主节点选举失败

  • 原因1:节点时间不同步,解决方案:所有节点执行 ntpdate ntp.aliyun.com,配置时间同步
  • 原因2:节点数量不是奇数,解决方案:确保集群为3/5/7个节点(本手册为3节点,符合要求)
  • 原因3:密钥文件不一致,解决方案:重新分发密钥,确保所有节点密钥文件一致、权限正确

十、核心最佳实践(生产规范)

    1. 安装目录固定为/opt/mongodb,不随意修改,避免运维混乱
    1. 生产环境必须开启账号认证+密钥加密,禁止裸奔部署
    1. 数据目录必须使用独立SSD,禁止使用机械盘和系统盘
    1. 定期备份数据(每天1次),防止数据丢失
    1. 维护集群时,采用滚动重启(先从节点、后主节点),避免业务停机
    1. 定期巡检集群状态,重点关注同步延迟、内存、磁盘使用情况
    1. 禁止使用root用户运行MongoDB,采用最小权限的mongodb用户
    1. 集群节点尽量部署在不同机架,避免机架断电导致集群全挂

十一、完整部署流程总结(落地顺序)

  1. 所有节点:上传MongoDB二进制包到/opt/目录
  1. 所有节点:执行install_mongo.sh,完成离线安装
  1. 所有节点:执行系统优化脚本,关闭防火墙、THP等
  1. 所有节点:编写mongod.conf,修改对应节点的bindIp
  1. mongo1:生成密钥,分发到mongo2、mongo3,所有节点授权密钥
  1. 所有节点:创建启停脚本,配置systemd开机自启,启动MongoDB
  1. mongo1:连接MongoDB,初始化副本集、创建管理员账号、优化集群参数
  1. 验证集群:查看rs.status(),确认主从角色、同步状态正常
  1. 日常运维:配置定时备份、定期巡检,确保集群稳定运行

附录:常用命令汇总

|---------------|---------------------------------------------------------------------------------------------------------------|
| 操作目的 | 命令 |
| 启动MongoDB(脚本) | /opt/start_mongo.sh |
| 停止MongoDB(脚本) | /opt/stop_mongo.sh |
| 重启MongoDB(脚本) | /opt/restart_mongo.sh |
| 连接集群 | mongosh -u root -p MongoDB@htjs20260418 --authenticationDatabase admin |
| 查看集群状态 | rs.status() |
| 查看主节点 | rs.isMaster() |
| 全量备份 | mongodump -u root -p MongoDB@123456789 --authenticationDatabase admin -o /data/mongodb/backup/$(date +%Y%m%d) |
| 查看服务状态 | systemctl status mongod |

相关推荐
爱学习的小囧2 小时前
ESXi VMkernel 端口 MTU 最佳设置详解
运维·服务器·网络·php·虚拟化
qq_342295822 小时前
CSS如何制作点击展开时的手风琴动画_平滑过渡max-height高度
jvm·数据库·python
Lucifer三思而后行2 小时前
zCloud 纳管 MySQL 8.4 数据库
数据库·mysql·oracle
我是菜菜呀呃2 小时前
达梦数据库日常运维SQL和问题排查
数据库
m0_748920363 小时前
Golang goquery怎么解析HTML_Golang goquery教程【核心】
jvm·数据库·python
m0_746752303 小时前
golang如何编写Markdown转HTML工具_golang Markdown转HTML工具编写详解
jvm·数据库·python
weixin_424999363 小时前
C#怎么使用TopLevel顶级语句 C#顶级语句怎么写如何省略Main方法简化控制台程序【语法】
jvm·数据库·python
Elastic 中国社区官方博客3 小时前
Elastic Security、Observability 和 Search 现在在你的 AI 工具中提供交互式 UI
大数据·运维·人工智能·elasticsearch·搜索引擎·安全威胁分析·可用性测试
qq_372154233 小时前
如何利用Bootstrap的Flex工具类快速排版
jvm·数据库·python