📜  docker-compose mongodb 副本 - 初始化副本 (1)

📅  最后修改于: 2023-12-03 15:00:30.294000             🧑  作者: Mango

Docker-Compose MongoDB 副本 - 初始化副本

介绍

本文将介绍如何通过 Docker-Compose 部署 MongoDB 副本集,并初始化副本集,以满足高可用、持久化和数据备份等需求。MongoDB 副本集可以提供更可靠的数据访问,防止尾部节点故障数据丢失,实现高性能、低延迟、高可靠的数据库集群。

相关配置

在使用 Docker-Compose 部署 MongoDB 副本集之前,您需要先安装 Docker 和 Docker-Compose,并且了解以下概念:

  • 副本集:MongoDB 数据库管理系统的集群解决方案,包括一个主节点和多个次要节点(副本集成员)。
  • 初始化副本集:配置 MongoDB 副本集,包括选择主节点、次要节点和仲裁节点等。
  • MongoDB 镜像:从 Docker Hub 上获取 MongoDB 镜像,用于创建容器和运行 MongoDB。
步骤

以下是基于 Docker-Compose 的 MongoDB 副本集部署和初始化副本集的步骤:

1. 编写 Docker-Compose 配置文件

编写一个 Docker-Compose 配置文件 docker-compose.yml,其中定义了 MongoDB 副本集的主节点(mongo1)、次要节点(mongo2mongo3)和仲裁节点(mongo-arb):

version: '2.2'
services:
  mongo1:
    image: mongo:4.2
    container_name: mongo1
    restart: always
    ports:
      - 28017:28017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_HOSTNAME=mongo1
    volumes:
      - ./data/db1:/data/db
    networks:
      - mongo-cluster
    command: mongod --port 27017 --bind_ip 0.0.0.0 --replSet rs0

  mongo2:
    image: mongo:4.2
    container_name: mongo2
    restart: always
    ports:
      - 28018:28017
    environment:
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_HOSTNAME=mongo2
    volumes:
      - ./data/db2:/data/db
    networks:
      - mongo-cluster
    command: mongod --port 27017 --bind_ip 0.0.0.0 --replSet rs0

  mongo3:
    image: mongo:4.2
    container_name: mongo3
    restart: always
    ports:
      - 28019:28017
    environment:
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_HOSTNAME=mongo3
    volumes:
      - ./data/db3:/data/db
    networks:
      - mongo-cluster
    command: mongod --port 27017 --bind_ip 0.0.0.0 --replSet rs0

  mongo-arb:
    image: mongo:4.2
    container_name: mongo-arb
    restart: always
    environment:
      - MONGO_REPLICA_SET_NAME=rs0
      - MONGO_PORT=27017
      - MONGO_HOSTNAME=mongo-arb
    networks:
      - mongo-cluster
    command: mongod --port 27017 --bind_ip 0.0.0.0 --replSet rs0 --arbiterOnly

networks:
  mongo-cluster:

说明

  • image: 指定 MongoDB 版本
  • container_name: 指定容器名称
  • restart: 设置容器自动重启
  • ports: 常规启动端口
  • environment: 容器环境变量
  • volumes: 指定数据卷
  • networks: 指定容器所属的网络
  • command: 启动容器的命令
2. 运行 Docker-Compose 配置文件

在终端中运行以下命令启动 MongoDB 副本集:

$ docker-compose up -d
3. 初始化副本集

mongo1 为主节点,初始化 MongoDB 副本集。先进入容器,进入 mongo shell:

$ docker exec -it mongo1 bash
$ mongo

在 mongo shell 中,输入以下命令:

rs.initiate(
  {
    _id : "rs0",
    members: [
      { _id: 0, host: "mongo1:27017" },
      { _id: 1, host: "mongo2:27017" },
      { _id: 2, host: "mongo3:27017" },
      { _id: 3, host: "mongo-arb:27017", arbiterOnly: true }
    ]
  }
)

说明:

  • _id:副本集名称,需要唯一。
  • members:副本集成员列表,包括主节点、次要节点和仲裁节点等。其中,arbiterOnly 代表仲裁节点。
4. 验证副本集

在 mongo shell 中,输入以下命令验证副本集是否已初始化成功:

rs.conf()

将会返回 MongoDB 副本集的详细配置信息。您还可以执行以下命令,查看当前副本集状态:

rs.status()
总结

通过 Docker-Compose 部署 MongoDB 副本集,并初始化副本集,将您的 MongoDB 数据库管理系统提高到一个更可靠的级别。副本集成员之间的数据同步和故障切换是由 MongoDB 副本集自动处理的,这使得您的应用程序可以更高效、更可靠地使用 MongoDB。