最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在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 架构,不能混用 rhel8 或 amazon2 包:
- 去正式找对应版本,例如:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel90-7.0.14.tgz - 解压后重命名成短路径,比如
mv mongodb-linux-x86_64-rhel90-7.0.14 mongodb,避免后续路径过长出错 - 确认
ldd --version输出 glibc ≥ 2.28(Rocky 9 满足),但别指望 RPM 能跑通
三个节点共用一台机器?端口和目录必须严格隔离
单机搭副本集不是“复制粘贴三次配置”,而是每个实例要完全独立:不同端口、不同数据目录、不同日志路径、不同 PID 文件。否则启动时会抢锁或覆盖数据。
典型错误是把三个 mongod.conf 里 dbpath 都写成 /data/db,结果只有第一个能起来,后面两个报 Unable to lock file: /data/db/mongod.lock。
正确做法(以端口 27017/27018/27019 为例):
- 创建三套目录:
mkdir -p /usr/local/mongodb/{node1,node2,node3}/{data,logs,conf} - 每个
mongod.conf里明确指定:port=27017、dbpath=/usr/local/mongodb/node1/data、logpath=/usr/local/mongodb/node1/logs/mongod.log、pidfilepath=/usr/local/mongodb/node1/logs/mongod.pid -
bind_ip必须设为127.0.0.1(不是0.0.0.0),否则副本集成员间无法通过 localhost 互相发现
初始化副本集前,先连上主节点并执行 rs.initiate()
别急着敲 rs.add(),第一步永远是让主节点自己形成一个单成员副本集。常见错误是直接连上就加其他节点,结果报 no replset config object retrieved。
操作顺序必须是:
- 启动第一个节点:
mongod -f /usr/local/mongodb/node1/conf/mongod.conf - 用
mongosh --port 27017连上去 - 在 admin 库执行:
rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "127.0.0.1:27017" }] }) - 等状态变成
"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 默认启用 firewalld 和 SELinux,即使你绑定了 127.0.0.1,MongoDB 副本集内部通信仍走 TCP,会被拦截。现象是 rs.status() 里其他节点状态始终是 "stateStr" : "(not reachable/healthy)"。
临时验证可先关掉:
sudo systemctl stop firewalld-
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,那副本集成员之间根本看不见彼此。
相关文章
- 掌握Excel表格数据处理基本操作提升工作效率的秘诀 08-29
- 小米路由r3g和3g是一样的吗(小米路由r3g和3g有什么不同) 08-29
- 如何轻松将PPT转换为竖版布局提升演示效果 08-29
- 探索如何让两个Excel表格之间实现高效数据同步 08-29
- 轻松掌握将PPT转换为竖版的实用实用技巧 08-29
- 异环小吱技能是什么 异环 小吱技能介绍 08-29