使用docker——10分钟内 完成一个高可用的 MongoDB 副本集部署

实验目的

  1. 掌握 Docker 容器化部署 MongoDB 副本集 的方法

  2. 理解 主从同步、故障转移、数据一致性 等核心机制

  3. 熟悉 MongoDB 集群管理命令运维监控技巧


🔧 实验环境

  • 操作系统: Rocky Linux 9 / CentOS 7+

  • 软件依赖:

    • Docker 20.10+

    • docker-compose 1.29+

  • 硬件要求:

    • 最低配置: 2核CPU / 4GB内存 / 20GB磁盘

    • 推荐配置: 4核CPU / 8GB内存 (用于模拟多节点)

1. 环境准备

复制代码
# 创建目录结构
mkdir -p mongo-com/{data/primary,data/secondary,data/arbiter,keys}
cd mongo-com

# 生成密钥文件(容器内外权限一致)
openssl rand -base64 756 > keys/mongodb-keyfile
chmod 400 keys/mongodb-keyfile
chown 999:999 keys/mongodb-keyfile  # MongoDB容器默认用户

2. 编写 docker-compose.yaml

复制代码
version: '3.8'

services:
  mongo-primary:
    image: mongo:6.0
    container_name: mongo-primary
    command: mongod --auth --keyFile /keys/mongodb-keyfile --replSet rs2 --bind_ip_all --oplogSize 1024
    ports:
      - "27017:27017"
    volumes:
      - ./data/primary:/data/db
      - ./keys:/keys
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin123
    user: "999:999"
    healthcheck:
      test: mongosh -u admin -p admin123 --eval "db.adminCommand('ping')"
      interval: 10s
      timeout: 5s

  mongo-secondary:
    image: mongo:6.0
    container_name: mongo-secondary
    command: mongod --auth --keyFile /keys/mongodb-keyfile --replSet rs2 --bind_ip_all
    ports:
      - "27018:27017"
    volumes:
      - ./data/secondary:/data/db
      - ./keys:/keys
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin123
    user: "999:999"
    depends_on:
      mongo-primary:
        condition: service_healthy

  mongo-arbiter:
    image: mongo:6.0
    container_name: mongo-arbiter
    command: mongod --auth --keyFile /keys/mongodb-keyfile --replSet rs2 --bind_ip_all
    volumes:
      - ./keys:/keys
      - ./data/arbiter:/data/db
    user: "999:999"
    depends_on:
      mongo-primary:
        condition: service_healthy

3. 启动容器集群

复制代码
# 启动服务(自动等待主节点健康)
复制代码
docker-compose up -d
复制代码
若报错如下,可从以下问题排除

(1)查看错误详情(关键步骤)

docker logs mongo-primary # 查看具体错误原因

(2)常见原因及解决方案

🔴 问题1:密钥文件权限错误

在宿主机检查密钥文件权限

ls -l keys/mongodb-keyfile

必须显示: -r-------- 1 999 999

修复命令:

chmod 400 keys/mongodb-keyfile

chown 999:999 keys/mongodb-keyfile

🔴 问题2:数据目录权限问题

检查数据目录所有权

ls -ld data/primary/

应显示: drwxr-xr-x 2 999 999

修复命令:

sudo chown -R 999:999 data/

sudo chmod -R 700 data/

🔴 问题3:端口冲突

检查27017端口占用

sudo netstat -tulnp | grep 27017

解决方案:

  • 停止占用进程:sudo systemctl stop mongod

  • 或修改 docker-compose.yaml 中的端口映射(如 27027:27017

  1. 强制清理并重启

彻底清理旧容器

docker-compose down -v

sudo rm -rf data/primary/*

重新启动

docker-compose up -d

检查状态(所有容器应为healthy) watch -n 1 'docker-compose ps'


4. 初始化副本集(一键脚本)

复制代码
docker exec mongo-primary mongosh -u admin -p admin123 --eval '
rs.initiate({
  _id: "rs2",
  members: [
    { _id: 0, host: "mongo-primary:27017", priority: 2 },
    { _id: 1, host: "mongo-secondary:27017", priority: 1 },
    { _id: 2, host: "mongo-arbiter:27017", arbiterOnly: true }
  ],
  settings: {
    heartbeatTimeoutSecs: 10,
    electionTimeoutMillis: 10000,
    chainingAllowed: false
  }
})'
复制代码
# 等待10秒后检查状态
sleep 10 && docker exec mongo-primary mongosh -u admin -p admin123 --eval 'rs.status()'

5. 数据同步验证

复制代码
# 主节点插入数据
docker exec mongo-primary mongosh -u admin -p admin123 --eval '
db.test.insertOne({
  _id: "cluster-test",
  message: "副本集同步验证",
  timestamp: new Date()
})'

# 从节点查询(自动等待同步)
docker exec mongo-secondary mongosh -u admin -p admin123 --eval '
rs.secondaryOk();
db.test.find().readPref("secondary");'

6. 故障转移测试

复制代码
# 模拟主节点宕机
docker pause mongo-primary

# 观察选举(从节点窗口执行)
docker logs -f mongo-secondary | grep -E "ELECT|stepdown"

# 恢复原主节点
docker unpause mongo-primary

# 验证角色切换
docker exec mongo-primary mongosh -u admin -p admin123 --eval 'rs.isMaster()'

✅ 验证要点

项目 预期结果 验证命令
副本集状态 所有节点 health:1 rs.status()
主从角色 主节点 PRIMARY,从节点 SECONDARY rs.isMaster()
数据同步 从节点能查询到主节点插入的数据 db.test.find()
故障转移 主节点宕机后从节点升主 docker logs 观察选举日志

⚠️ 常见问题处理

  1. 容器启动失败

    复制代码
    # 检查日志
    docker-compose logs mongo-primary
    
    # 常见修复
    chown -R 999:999 data/ keys/
  2. 节点无法加入副本集

    复制代码
    # 强制重新配置
    docker exec mongo-primary mongosh -u admin -p admin123 --eval '
    rs.reconfig({_id:"rs2",members:[]},{force:true})'
  3. 认证失败

    复制代码
    # 确保密钥文件一致
    docker exec mongo-primary cat /keys/mongodb-keyfile | md5sum

通过以上流程,您将在 10分钟内 完成一个高可用的 MongoDB 副本集部署。所有步骤已在全新 CentOS/Rocky Linux 机器上验证通过。

相关推荐
冉冰学姐10 小时前
SSM装修服务网站5ff59(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·装修服务网站
库库83910 小时前
Redis分布式锁、Redisson及Redis红锁知识点总结
数据库·redis·分布式
落日漫游10 小时前
docker 网络模式
docker
沧澜sincerely10 小时前
Redis 缓存模式与注解缓存
数据库·redis·缓存
努力向前的JF(s1hjf)10 小时前
雷达点云数据展示在webviz(ROS1)
云原生·eureka
Elastic 中国社区官方博客11 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
nzxzn11 小时前
MYSQL第二次作业
数据库·mysql
核桃杏仁粉11 小时前
excel拼接数据库
数据库·oracle·excel
TiAmo zhang12 小时前
SQL Server 2019实验 │ 设计数据库的完整性
数据库·sqlserver
冻咸鱼12 小时前
MySQL的CRUD
数据库·mysql·oracle