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

最新下载

热门教程

如何在CentOS7上部署MongoDB副本集?

时间:2026-08-10 10:21:49 编辑:袖梨 来源:一聚教程网

mongod 启动后不会自动组成副本集,必须手动执行 rs.initiate() 并传入完整成员配置;replSet 仅声明名称,不触发初始化;三节点 replSet 名称须完全一致;SELinux、bind_ip、dbpath、端口、keyfile 等配置均需严格校验。

mongod 启动后不自动组成副本集,必须手动执行 rs.initiate() —— 这是绝大多数人卡住的第一步。


配置文件里 replSet 只是声明名称,不是启动副本集

很多人以为在 mongod.conf 里写了 replSet=rs0 就算配好了副本集,其实这只是告诉进程“我将来要加入叫 rs0 的副本集”,它自己仍是独立节点。真正触发选举和状态同步,得靠客户端命令。

  1. replSet 参数必须三台机器完全一致(包括大小写、空格),否则 rs.add() 会报 replSet name mismatch
  2. CentOS7 默认 SELinux 开启,若日志路径或 dbpath 不在标准位置(如 /var/lib/mongo),需用 semanage fcontext 放行,否则 mongod 静默失败
  3. bind_ip 别写 127.0.0.1localhost —— 其他节点连不上;推荐写具体内网 IP,或 0.0.0.0 + 配合防火墙(firewall-cmd --add-port=27017/tcp

初始化时 rs.initiate() 必须用完整 config 对象

直接敲 rs.initiate() 会创建单节点副本集(只有自己),后续加节点会失败:错误提示 already initialized 且无法再改成员列表。必须一开始就指定全部成员。

  1. 示例 config(三个节点,含仲裁):
    cfg = { _id: "rs0", members: [ {_id: 0, host: "192.168.1.10:27017"}, {_id: 1, host: "192.168.1.11:27017"}, {_id: 2, host: "192.168.1.12:27017", arbiterOnly: true}] }
  2. 执行顺序:先连主节点(任意一台),use admin,再 rs.initiate(cfg);成功返回 { "ok" : 1 }
  3. 如果某节点网络不通,rs.initiate() 会卡住或超时,此时删掉该节点条目重试,等集群稳定后再用 rs.add() 加入

仲裁节点(arbiter)不能复用数据目录或端口

仲裁节点不存数据,但 dbpath 必须存在且可写,否则 mongod 启动失败 —— 错误日志里常见 Failed to unlink socket filePermission denied

  1. 仲裁节点的 dbpath 目录可以为空,但不能指向其他节点正在用的路径(比如和主节点共用 /data/mongo
  2. 仲裁节点也要监听端口,且该端口不能被其他 mongod 占用;即使只做投票,也必须能被主/从节点 TCP 连通(telnet 192.168.1.12 27017 要通)
  3. 仲裁节点配置里不要加 oplogSizedirectoryperdb —— 无效且可能引发 warning

认证开启后,rs.initiate() 必须用 keyfile 或 x.509

一旦配置了 security.authorization: enabledsecurity.keyFile,所有节点启动前必须同步同一份 keyfile(权限必须是 chmod 400),且初始化时连接要用 admin 用户认证。

  1. keyfile 生成命令:openssl rand -base64 756 > /etc/mongod-keyfile && chmod 400 /etc/mongod-keyfile
  2. 初始化前先认证:mongo --host 192.168.1.10:27017 -u "admin" -p "pwd" --authenticationDatabase "admin"
  3. 没配 keyfile 就开 authorization: enabledmongod 会直接拒绝启动,日志报 KeyFile must be specified when authorization is enabled

副本集真正可用的标志不是所有 mongod 进程都 running,而是 rs.status().members[n].stateStr 出现 PRIMARYSECONDARYARBITER —— 中间任何一环断开(比如时间不同步、hostname 解析失败、防火墙拦截心跳包),状态就会卡在 STARTUPRECOVERING

热门栏目