当前位置: 首页 > news >正文

MongoDB单节点转副本集(Docker安装版本)

为什么需要副本集?

场景单节点副本集
支持 Oplog
MongoShake 同步
数据备份恢复仅全量全量+增量
高可用

核心结论:MongoShake 依赖 Oplog 实现实时同步,而 Oplog 只在副本集模式下产生。

Docker Compose 配置

version: '3.8'
services:
mongo:
image: registry.cn-qingdao.aliyuncs.com/s-test/mongo:7.0.5
restart: always
container_name: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: ***
MONGO_INITDB_ROOT_PASSWORD: ****
ports:
- 26016:27017
volumes:
- /home/docker/mongodb/db:/data/db
- /home/docker/mongodb/config:/data/configdb
- /home/docker/mongodb/keyfile:/opt/keyfile
- /etc/localtime:/etc/localtime:ro
command: mongod --replSet rs0 --bind_ip_all --keyFile /opt/keyfile/kfile

配置说明

参数说明
--replSetrs0副本集名称
--bind_ip_all-允许所有 IP 连接
--keyFile/opt/keyfile/kfile内部认证密钥文件

🔧 部署步骤

第一步:创建 keyfile 目录和文件

# 创建目录 sudo mkdir -p /home/docker/mongodb/keyfile # 生成 keyfile(756字节的base64字符串) sudo openssl rand -base64 756 | sudo tee /home/docker/mongodb/keyfile/kfile # 设置目录权限(700) sudo chmod 700 /home/docker/mongodb/keyfile # 设置文件权限(400,只读) sudo chmod 400 /home/docker/mongodb/keyfile/kfile # 设置所有者为 mongodb 用户(UID 999) sudo chown -R 999:999 /home/docker/mongodb/keyfile

第二步:启动容器

docker-compose down docker-compose up -d

第三步:初始化副本集

# 进入容器 docker exec -it mongo mongosh -u sm_local -p Sm2014Hj --authenticationDatabase admin # 在 mongosh 中执行初始化 rs.initiate() # 验证状态 rs.status()

成功标志

  • { ok: 1 }表示初始化成功

  • rs.status()stateStr显示PRIMARY


⚠️ 常见错误及解决方案

错误 1:security.keyFile is required

错误日志

BadValue: security.keyFile is required when authorization is enabled with replica sets

原因:副本集模式下启用了认证,但未配置 keyFile。

解决方案:按照第一步创建并配置 keyfile。


错误 2:permissions on /opt/keyfile are too open

错误日志

Read security file failed: permissions on /opt/keyfile are too open

原因:keyfile 目录或文件权限过于宽松。

解决方案

sudo chmod 700 /home/docker/mongodb/keyfile sudo chmod 400 /home/docker/mongodb/keyfile/kfile sudo chown -R 999:999 /home/docker/mongodb/keyfile

错误 3:NotMasterOrSecondaryNotPrimaryOrSecondary

错误信息

{ "codeName": "NotMasterOrSecondary", "errmsg": "node is not in primary or recovering state" }

原因:副本集尚未初始化,或初始化未完成。

解决方案

// 在 mongosh 中执行 rs.initiate()

或者:

docker exec -it mongo mongosh -u sm_local -p Sm2014Hj --authenticationDatabase admin --eval "

cfg = rs.conf() cfg.members[0].host = "ip:26016" // 改为实际 IP 和端口 rs.reconfig(cfg)

"


错误 4:No such file or directory

错误日志

Error reading file /home/docker/mongodb/keyfile/kfile: No such file or directory

原因:Compose 中指定的 keyfile 路径与实际文件名不一致。

解决方案:检查 Compose 中的--keyFile参数与挂载目录下的文件名是否一致。


📌 权限要求速查表

项目权限命令
keyfile 目录700(drwx------)chmod 700 /path/to/keyfile
keyfile 文件400(-r--------)chmod 400 /path/to/kfile
目录/文件所有者999:999chown -R 999:999 /path/to/keyfile

999是容器内 mongodb 用户的 UID,必须匹配。


🔌 连接方式

容器内部连接

docker exec -it mongo mongosh -u name -p password --authenticationDatabase admin

外部应用连接

连接字符串

mongodb://name:password@宿主机IP:26016/?authSource=admin&replicaSet=rs0

验证连接

// 查看副本集状态 rs.status() // 查看当前节点角色 db.isMaster() // 测试读写 db.test.insertOne({ name: "test" }) db.test.find()

✅ 验证清单

完成部署后,逐项确认:

检查项验证命令期望结果
容器运行正常docker ps | grep mongo状态Up
日志无错误docker logs mongo 2>&1 | grep -i error无输出
副本集已初始化rs.status().ok1
节点角色为 PRIMARYrs.status().members[0].stateStrPRIMARY
Oplog 已开启rs.printReplicationInfo()显示 oplog 信息
认证可正常连接db.auth("sm_local", "Sm2014Hj")1

科普点:副本集 (简单了解,下篇文章详细介绍三机三节点部署方案)

一张图帮你理清概念:

MongoDB 部署架构

├── 单节点 (Standalone)
│ └── 一个实例,无冗余,无 Oplog ❌

├── 副本集 (Replica Set)
│ ├── 单成员副本集 (你的现状)
│ │ └── 1个节点,有 Oplog ✅,无冗余
│ │
│ ├── 三成员副本集 (生产推荐)
│ │ ├── 1个 PRIMARY (主节点,可读写)
│ │ └── 2个 SECONDARY (从节点,只读)
│ │
│ └── 五成员及以上副本集
│ └── 更高可用性

└── 分片集群 (Sharded Cluster)
├── 多个副本集作为分片
├── 路由节点 (mongos)
└── 配置服务器 (Config Server)


🎯 不同部署方案对比

方案存储成本高可用故障容忍适用场景
单机单节点1x0台开发测试
单机三节点3x0台无意义,不推荐
三机三节点3x1-2台生产环境
跨机房三节点3x1个机房异地容灾
http://www.jsqmd.com/news/588705/

相关文章:

  • 国内支持全网手机/座机/400/95/96号码认证的服务商清单 - 企业服务推荐
  • 9.3LED点阵屏显示动画
  • 全域数学理论宇宙本源正式宣言(乖乖数学)
  • 3步高效获取电子课本:tchMaterial-parser让国家中小学智慧教育平台资源轻松到手
  • YOLO系列算法改进 | C3k2改进篇 | 融合SACF光谱引导自适应跨层融合 | 光谱聚合与空间细节协同增强,跨层融合信息零损失,适用于多光谱遥感检测与边缘部署场景 | AAAI 2026
  • 【完整源码+数据集+部署教程】喷嘴检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • 大模型指令微调入门基础教程(非常详细),从通才到专才全景解剖,收藏这一篇就够了!
  • 2026洛氏硬度计品牌深度盘点:金属材料行业洛氏硬度计企业推荐 - 品牌推荐大师
  • 北美推动视频车联网市场到2030年达到2200万台
  • 英特尔斥资142亿美元回购爱尔兰Fab 34晶圆厂股权
  • 深度拆解 Linux Ext 系列文件系统:从硬件底层到软硬链接全流程
  • 100天精通Android Kotlin:50个实战项目构建你的全栈技能图谱
  • 【手把手详细教程】 Trae AI和Vscode~使用第三方中转API配置Claude ,GPT,Gemini等大模型教程
  • 根据所给文字范围,为您提供的总结标题为:“使用栅格法结合蚁群算法规划机器人全局路径
  • 跨境电商多平台管理 2 小时上手
  • 黑马头条日记 | 分布式任务调度平台XXL-JOB —— XXL之力一举完成热点文章定时计算
  • BaiduPCS-Web技术解密:构建高效百度网盘加速工具的前后端架构深度剖析
  • 一篇吃透RNN(循环神经网络),LSTM(长短期记忆网络),BiLSTM(双向长短期记忆网络)算法,计算机小白也能轻松看懂
  • LangChain4j聊天记忆存储选型指南:除了MongoDB,向量库、Redis、S3怎么选?
  • CTF杂项Misc零基础通关攻略!隐写\+编码\+流量分析,新手最快拿分题型
  • 长程Agent入门基础教程(非常详细),搞懂埃森哲MemexRL“建索引”,收藏这一篇就够了!
  • 遗传算法VRP问题:VRP,多车容量约束 针对物流问题,根据实际情况,设置多车多容量,采用遗传...
  • LINE Pay沙盒环境从申请到调试:一份给新手的完整踩坑记录(含PC端测试技巧)
  • the brain understanding by first LLM engineer.
  • R3A: Reliable RTL Repair Framework with Multi-Agent Fault Localization and Stochastic Tree-of-Though
  • 从0到1落地以太坊DApp:智能合约编写+前端交互全流程保姆级实战
  • Prompt提示词使用技巧与实战案例
  • Datawhale首次进入全球前30!
  • 【电池容量提取+锂电池寿命预测】 基于Transformer-BiGRU的锂电池剩余寿命预测Matlab代码(单变量)
  • Godot游戏练习01-第24节-多人游戏暂停菜单,游戏优化