centos 7 搭建 mongodb 5.0 副本集必须使用官方 yum 源(禁用 epel/第三方源),并调优内核参数(tcp_fin_timeout=30、vm.swappiness=1、fs.file-max=655360),否则因系统资源限制导致心跳超时、选举失败或 oplog 同步卡顿;配置需严格统一 replsetname、显式 bindip、keyfile(600权限)与 hostname 解析,初始化前须逐项验证网络连通性及日志错误。

直接上结论:CentOS 7 搭建 MongoDB 5.0 副本集,yum 安装最稳,但必须用官方源(不能用 EPEL 或阿里云镜像),且内核参数不调优会导致心跳超时、选举失败或 oplog 同步卡住——这不是配置问题,是 Linux 层面的资源限制在咬人。
为什么不能用 EPEL 或第三方 Yum 源
EPEL 提供的 mongodb 包早已停止维护,版本普遍卡在 3.2 或更早,不支持 keyFile 认证、YAML 格式配置、replSetName 的现代语法,也无法启用 mongosh(mongo shell 已弃用)。官方源持续更新到 5.0+,包结构清晰:mongodb-org-server 含完整服务脚本,mongodb-org-shell 提供 mongosh。
实操建议:
- 删掉所有残留的 EPEL MongoDB 包:
yum remove mongodb* - 创建
/etc/yum.repos.d/mongodb-org-5.0.repo,内容必须含gpgcheck=1和对应 GPG key(如https://www.mongodb.org/static/pgp/server-5.0.asc),否则yum install会静默跳过关键组件 - 确认
baseurl中的$releasever被正确解析为7(不是7Server或空值),可用rpm -q --qf '%{VERSION}' centos-release验证
必须调优的三个内核参数
MongoDB 副本集节点间靠 TCP 心跳维持状态,默认每 2 秒发一次。若 net.ipv4.tcp_fin_timeout 过长或 vm.swappiness 过高,会导致连接堆积、选举超时(日志常见 Failed to heartbeat 或 electionTimeoutMillis elapsed)。
实操建议(每台节点都执行):
-
echo 'net.ipv4.tcp_fin_timeout = 30' >> /etc/sysctl.conf—— 避免TIME_WAIT连接占满端口 -
echo 'vm.swappiness = 1' >> /etc/sysctl.conf—— 抑制交换,防止oplog同步卡顿 -
echo 'fs.file-max = 655360' >> /etc/sysctl.conf—— 提升文件描述符上限,避免连接数不足 - 执行
sysctl -p生效
配置文件与安全启动的关键细节
CentOS 7 默认安装后配置文件为 /etc/mongod.conf,YAML 格式。副本集启动前,以下几项必须显式设置,且全集一致:
-
replication.replSetName:值需完全相同(如rs0),大小写敏感 -
net.bindIp:**不能写0.0.0.0**,应明确指定本机 IP(如192.168.40.128),否则keyFile认证失败或跨节点通信被拒绝 -
security.authorization和security.keyFile必须共存;keyFile权限必须为600,且所有节点内容完全一致 -
/etc/hosts必须精确映射各节点 IP 与 hostname(如192.168.40.128 node1),否则rs.initiate()会报nodename nor servname provided
初始化前必须验证的连通性检查
副本集初始化失败,90% 是网络或权限问题,不是配置语法错误。别急着跑 rs.initiate(),先逐节点验证:
- 用
telnet 192.168.40.129 27017测试其他节点端口是否可达(确保firewalld已停:systemctl stop firewalld) - 用
ssh node2(基于/etc/hosts配置)确认 hostname 解析无误 - 在任意节点执行
mongosh --host 192.168.40.129:27017 --eval "db.runCommand({ping:1})",确认能连通且无认证拒绝 - 查日志第一手线索:
journalctl -u mongod -n 50 -f,重点关注replSetInitiate、keyFile、bindIp相关错误行
真正容易被忽略的是:内核参数修改后未 sysctl -p,或 keyFile 权限不是 600,或 /etc/hosts 中 hostname 多了个点(如 node1.)——这些都会让副本集卡在“看似配置对,实则连不上”的死循环里。











