一聚教程网:一个值得你收藏的教程网站

热门教程

如何在RockyLinux9上配置MongoDB副本集?

时间:2026-08-29 09:02:49 编辑:袖梨 来源:一聚教程网

Rocky Linux 9 上安装 MongoDB 必须避开 RPM 包的 glibc 2.34 兼容坑,直接用 dnf install mongodb-org 会因 __libc_single_threaded 符号缺失而失败;唯一可靠方案是手动下载对应 rhel9 架构的 tar.gz 包(如 mongodb-linux-x86_64-rhel90-7.0.14.tgz),解压后严格隔离端口、数据目录、日志路径及 PID 文件部署多实例,并确保 bindIp 包含 127.0.0.1、关闭 firewalld/SELinux 或精准放行端口与打 SELinux 标签。

Rocky Linux 9 上装 MongoDB 要避开 glibc 兼容坑

直接用 dnf install mongodb-org 会失败,报 undefined symbol: __libc_single_threaded —— 这是 MongoDB 最新 RPM 包(7.0+)和 Rocky 9 默认 glibc 2.34 的 ABI 不匹配导致的,不是配置问题,是二进制层面不兼容。

实操建议只有一条路:放弃包管理器安装,改用 tar.gz 手动部署。下载地址必须选 rhel9 架构,不能混用 rhel8amazon2 包:

  1. 去正式找对应版本,例如:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel90-7.0.14.tgz
  2. 解压后重命名成短路径,比如 mv mongodb-linux-x86_64-rhel90-7.0.14 mongodb,避免后续路径过长出错
  3. 确认 ldd --version 输出 glibc ≥ 2.28(Rocky 9 满足),但别指望 RPM 能跑通

三个节点共用一台机器?端口和目录必须严格隔离

单机搭副本集不是“复制粘贴三次配置”,而是每个实例要完全独立:不同端口、不同数据目录、不同日志路径、不同 PID 文件。否则启动时会抢锁或覆盖数据。

典型错误是把三个 mongod.confdbpath 都写成 /data/db,结果只有第一个能起来,后面两个报 Unable to lock file: /data/db/mongod.lock

正确做法(以端口 27017/27018/27019 为例):

  1. 创建三套目录:mkdir -p /usr/local/mongodb/{node1,node2,node3}/{data,logs,conf}
  2. 每个 mongod.conf 里明确指定:port=27017dbpath=/usr/local/mongodb/node1/datalogpath=/usr/local/mongodb/node1/logs/mongod.logpidfilepath=/usr/local/mongodb/node1/logs/mongod.pid
  3. bind_ip 必须设为 127.0.0.1(不是 0.0.0.0),否则副本集成员间无法通过 localhost 互相发现

初始化副本集前,先连上主节点并执行 rs.initiate()

别急着敲 rs.add(),第一步永远是让主节点自己形成一个单成员副本集。常见错误是直接连上就加其他节点,结果报 no replset config object retrieved

操作顺序必须是:

  1. 启动第一个节点:mongod -f /usr/local/mongodb/node1/conf/mongod.conf
  2. mongosh --port 27017 连上去
  3. 在 admin 库执行:rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "127.0.0.1:27017" }] })
  4. 等状态变成 "ok" : 1 再启动第二、第三个节点,再分别执行 rs.add("127.0.0.1:27018")rs.add("127.0.0.1:27019")

注意:所有 host 字段必须用 IP + 端口,不能写 localhost(某些版本解析失败);_id 名称(如 rs0)三节点配置文件里 replSet=rs0 必须完全一致。

防火墙和 SELinux 不关,副本集根本连不通

Rocky 9 默认启用 firewalldSELinux,即使你绑定了 127.0.0.1,MongoDB 副本集内部通信仍走 TCP,会被拦截。现象是 rs.status() 里其他节点状态始终是 "stateStr" : "(not reachable/healthy)"

临时验证可先关掉:

  1. sudo systemctl stop firewalld
  2. sudo setenforce 0(永久关闭需改 /etc/selinux/config

生产环境不能这么干,得精确放行端口:sudo firewall-cmd --permanent --add-port=27017-27019/tcp,然后 sudo firewall-cmd --reload。SELinux 则需打标签:sudo semanage fcontext -a -t mongod_var_lib_t "/usr/local/mongodb/node1/data(/.*)?",再 restorecon -Rv /usr/local/mongodb

最易被忽略的是:mongod 进程默认不允许监听多个地址,如果配置里 bind_ip 漏写了 127.0.0.1,只写了内网 IP,那副本集成员之间根本看不见彼此。

热门栏目