记录一下使用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()