docker使用docker-compose搭建MongoDB 6.0版本副本集(一主一从一仲裁)

790 阅读3分钟

记录一下使用docker-compose搭建mongodb 6.0版本副本集, 包含三个节点: 一主一从一仲裁。

1. 环境准备

  • 操作系统:Ubuntu 20.04.1 LTS
  • docker版本:Docker version 20.10.5
  • docker-compose版本:docker-compose version 2.1.1
  • MongoDB版本:6.0.1

1.1 新建文件夹

mkdir -p /home/eric/mongodb_cluster/config
mkdir -p /home/eric/mongodb_cluster/cluster1/db
mkdir -p /home/eric/mongodb_cluster/cluster2/db
mkdir -p /home/eric/mongodb_cluster/cluster3/db

1.2 创建集群所需要的密钥文件key

openssl rand -base64 756 > keyfile.pem
chmod 400 keyfile.pem
mv keyfile.pem /home/eric/mongodb_cluster/config/

mongodb 6.0版本副本集需要使用相同的keyfile.pem密钥文件,所以需要创建该文件。并且文件权限一定要是400, 否则启动集群时会报错。

2. 创建docker-compose.yml文件

version: '3.8'
services:
  mongodb-primary:
    image: mongo:6.0.1
    restart: always
    container_name: mongodb-primary
    ports:
      - "37017:27017"
    volumes:
      - /home/eric/mongodb_cluster/cluster1/db:/data/db
      - /home/eric/mongodb_cluster/config/keyfile.pem:/etc/keyfile.pem
    networks:
      - mongoNetwork
    command: mongod --replSet myReplSet --keyFile /etc/keyfile.pem mongod  --bind_ip_all --wiredTigerCacheSizeGB 2
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /etc/keyfile.pem
        chown 999:999 /etc/keyfile.pem
        exec docker-entrypoint.sh $$@
  mongodb-secondary1:
    image: mongo:6.0.1
    depends_on:
      - mongodb-primary
    restart: always
    container_name: mongodb-secondary1
    ports:
      - "37018:27017"
    volumes:
      - /home/eric/mongodb_cluster/cluster2/db:/data/db
      - /home/eric/mongodb_cluster/config/keyfile.pem:/etc/keyfile.pem
    networks:
      - mongoNetwork
    command: mongod --replSet myReplSet --keyFile /etc/keyfile.pem mongod  --bind_ip_all --wiredTigerCacheSizeGB 2
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /etc/keyfile.pem
        chown 999:999 /etc/keyfile.pem
        exec docker-entrypoint.sh $$@
  mongodb-secondary2:
    image: mongo:6.0.1
    depends_on:
      - mongodb-primary
    restart: always
    container_name: mongodb-secondary2
    ports:
      - "37019:27017"
    volumes:
      - /home/eric/mongodb_cluster/cluster3/db:/data/db
      - /home/eric/mongodb_cluster/config/keyfile.pem:/etc/keyfile.pem
    networks:
      - mongoNetwork
    command: mongod --replSet myReplSet --keyFile /etc/keyfile.pem mongod  --bind_ip_all --wiredTigerCacheSizeGB 2
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /etc/keyfile.pem
        chown 999:999 /etc/keyfile.pem
        exec docker-entrypoint.sh $$@

networks:
  mongoNetwork:
    driver: bridge

大多数时候, 我们总是先入为主的认为mongodb安装就需要配置mongod.conf配置文件, 但实际上启动mongodb时可以通过 mongod --args 参数指定的方式来运行, 将所有参数都放到执行命令里面, 刚好mongodb的docker版本没有配置文件, 因此我们通过这种方式来启动mongodb. 以下是docker-compose配置文件的解释.

  • ports: 三个节点分别暴露端口为37017,37018,37019
  • volumes: 三个节点分别挂载数据卷. 容器的/data/db挂载到宿主机三个不同的文件夹, 用于存放数据; 而容器的/etc/keyfile.pem则挂载到宿主机相同的密钥文件keyfile.pem
  • command: 三个节点分别启动mongod服务执行的命令, --replSet指定副本集名称, --keyFile指定密钥文件路径, --bind_ip_all允许所有ip访问, --wiredTigerCacheSizeGB设置缓存大小. 注意如果你是单机运行三个节点, wiredTigerCacheSizeGB参数非常重要, 不设置的话,三个mongodb节点会轻易占满机器内存.
  • networks: 三个节点分别加入名为mongoNetwork的网络, 桥接方式.
  • entrypoint: 这里非常重要, mongodb 6.0对/etc/keyfile.pem的文件权限要求特别严格, 因此需要先修改文件权限.

3. 启动容器及初始化

启动所有容器:

docker-compose up -d

进入容器内部进行配置:

docker exec -it mongodb-primary /bin/bash

通过shell连接mongodb, 注意mongodb 6.0使用mongosh命令, 需要先在数据库中创建一个root用户.

mongosh

use admin

db.createUser({user:"root",pwd:"your-password",roles:[{role:"root",db:"admin"}]})

db.auth('root', 'your-pasword')

然后进行副本集初始化

rs.initiate({
_id: "myReplSet",
members: [
{ _id: 0, host: "192.168.10.254:37017" },
{ _id: 1, host: "192.168.10.254:37018" },
{ _id: 2, host: "192.168.10.254:37019", arbiterOnly: true }
] })

查看副本集的状态

rs.status()