MongoDB单节点转副本集(Docker安装版本)
为什么需要副本集场景单节点副本集支持 Oplog❌✅MongoShake 同步❌✅数据备份恢复仅全量全量增量高可用❌✅核心结论MongoShake 依赖 Oplog 实现实时同步而 Oplog 只在副本集模式下产生。Docker Compose 配置version: 3.8services:mongo:image: registry.cn-qingdao.aliyuncs.com/s-test/mongo:7.0.5restart: alwayscontainer_name: mongoenvironment:MONGO_INITDB_ROOT_USERNAME: ***MONGO_INITDB_ROOT_PASSWORD: ****ports:- 26016:27017volumes:- /home/docker/mongodb/db:/data/db- /home/docker/mongodb/config:/data/configdb- /home/docker/mongodb/keyfile:/opt/keyfile- /etc/localtime:/etc/localtime:rocommand: 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 # 生成 keyfile756字节的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⚠️ 常见错误及解决方案错误 1security.keyFile is required错误日志BadValue: security.keyFile is required when authorization is enabled with replica sets原因副本集模式下启用了认证但未配置 keyFile。解决方案按照第一步创建并配置 keyfile。错误 2permissions 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错误 3NotMasterOrSecondary或NotPrimaryOrSecondary错误信息{ 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)错误 4No 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/keyfilekeyfile 文件400(-r--------)chmod 400 /path/to/kfile目录/文件所有者999:999chown -R 999:999 /path/to/keyfile999是容器内 mongodb 用户的 UID必须匹配。 连接方式容器内部连接docker exec -it mongo mongosh -u name -p password --authenticationDatabase admin外部应用连接连接字符串mongodb://name:password宿主机IP:26016/?authSourceadminreplicaSetrs0验证连接// 查看副本集状态 rs.status() // 查看当前节点角色 db.isMaster() // 测试读写 db.test.insertOne({ name: test }) db.test.find()✅ 验证清单完成部署后逐项确认检查项验证命令期望结果容器运行正常docker ps | grep mongo状态Up日志无错误docker logs mongo 21 | grep -i error无输出副本集已初始化rs.status().ok1节点角色为 PRIMARYrs.status().members[0].stateStrPRIMARYOplog 已开启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) 不同部署方案对比方案存储成本高可用故障容忍适用场景单机单节点1x❌0台开发测试单机三节点3x❌0台无意义不推荐三机三节点3x✅1-2台生产环境跨机房三节点3x✅1个机房异地容灾
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2483738.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!