mongodb docker 集群搭建

3 minute read

Published:

Replica Set 架构 mongodb docker 集群搭建。

结构:Replica Set 架构(一主一从一仲裁)

优点:具备故障转移能力、仲裁节点起到选举作用节省部分资源

集群搭建配置

0、若测试时需要删除当前集群,重新建集群

cd /home/ls/mongodb_cluster
docker-compose -f mongodb_cluster.yml down
rm -rf /home/ls/mongodb_cluster/mongodb.key
rm -rf /home/ls/mongodb_cluster/data 

1、生成 keyFile

mkdir /home/ls/mongodb_cluster
cd /home/ls/mongodb_cluster
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key

2、编写配置文件

cd /home/ls/mongodb_cluster
vim mongodb_cluster.yml

内容如下:

version: '3.6'
services:
  master:
    image: mongo:3.6.4
    container_name: qs_master
    volumes:
      - /home/ls/mongodb_cluster/data/replset/master:/data/db
      - /home/ls/mongodb_cluster/mongodb.key:/data/mongodb.key
    ports:
      - 8027:27017
    networks:
      - mongoNet
    environment:
      MONGO_INITDB_ROOT_USERNAME: ***
      MONGO_INITDB_ROOT_PASSWORD: ***
    command: mongod --dbpath /data/db --replSet qs_mongo --oplogSize 128 --keyFile /data/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  slave:
    image: mongo:3.6.4
    container_name: qs_slave
    volumes:
      - /home/ls/mongodb_cluster/data/replset/slaver:/data/db
      - /home/ls/mongodb_cluster/mongodb.key:/data/mongodb.key
    ports:
      - 8028:27017
    networks:
      - mongoNet
    environment:
      MONGO_INITDB_ROOT_USERNAME: ***
      MONGO_INITDB_ROOT_PASSWORD: ***
    command: mongod --dbpath /data/db --replSet qs_mongo --oplogSize 128 --keyFile /data/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  arbiter:
    image: mongo:3.6.4
    container_name: qs_arbiter
    volumes:
      - /home/ls/mongodb_cluster/data/replset/arbiter:/data/db
      - /home/ls/mongodb_cluster/mongodb.key:/data/mongodb.key
    ports:
      - 8029:27017
    networks:
      - mongoNet
    environment:
      MONGO_INITDB_ROOT_USERNAME: ***
      MONGO_INITDB_ROOT_PASSWORD: ***
    command: mongod --dbpath /data/db --replSet qs_mongo --smallfiles --oplogSize 128 --keyFile /data/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

networks:
  mongoNet:
    driver: bridge

3、根据配置文件创建容器

注:这里使用 docker-compose 而不是 dockerdocker-compose 是 docker 中用于集群管理的工具。

docker-compose -f mongodb_cluster.yml up -d

4、可查看刚刚创建的容器

通过 docker 查看

docker ps -a
# 注意到这里显示的容器名为 qs_master、qs_slave、qs_arbiter(跟配置文件的 container_name 一致)

通过 docker-compose 查看

docker-compose -f mongodb_cluster.yml ps -a
# 注意这里要指定配置文件是什么,该命令只会显示该配置文件下的集群容器信息
# 注意到这里显示的容器名为 master、slave、arbiter(看配置文件每个容器的头部名一致)

5、在 master 节点上配置主从仲裁信息

docker-compose -f mongodb_cluster.yml exec master mongo admin -u *** -p ***
# 在 master 节点上配置从和仲裁节点的信息
# !!!有时候会报错时间戳哈希错误,请记得再输一次!!!
rs.initiate()
rs.add('slave:27017')
rs.add('arbiter:27017',true)

# 查看配置与副本级状态
rs.conf()
rs.status()

# 退出
exit

至此搭建成功

集群测试

测试同步功能

1、在 master 节点上插入信息

docker-compose  -f mongodb_cluster.yml exec master mongo admin -u *** -p ***
use test
db.test.insert({msg: 'this is from primary', ts: new Date()})
exit

2、在 slave 中检测信息是否同步

docker-compose -f mongodb_cluster.yml exec slave mongo admin -u *** -p ***
# 因为默认从节点是不可读的,所以先需要开启读权限
rs.slaveOk()

use test
db.test.find()
exit

3、在 arbiter 中检测信息是否同步

docker-compose -f mongodb_cluster.yml exec arbiter mongo admin -u *** -p ***

(这里会显示读取失败,因为仲裁节点不是用来读的)

rs.slaveOk()
use test
db.test.find()
exit

故障转移测试

1、查看节点当前的性质

# master 节点是 PRIMARY
docker-compose  -f mongodb_cluster.yml exec master mongo admin -u *** -p ***
# 显示 newset:PRIMARY>

# slave 节点是 SECONDARY
docker-compose -f mongodb_cluster.yml exec slave mongo admin -u *** -p ***
# 显示 newset:SECONDARY>

# arbiter 节点是 ARBITER
docker-compose -f mongodb_cluster.yml exec arbiter mongo admin -u *** -p ***
# 显示 newset:ARBITER>

2、假设 master 节点掉线了

docker-compose -f mongodb_cluster.yml stop master

3、查看节点当前的性质,发现 slave 节点变为 PRIMARY,故障转移成功

# slave 节点是 PRIMARY
docker-compose -f mongodb_cluster.yml exec slave mongo admin -u *** -p ***
# 显示 newset:PRIMARY>

# arbiter 节点是 ARBITER
docker-compose -f mongodb_cluster.yml exec arbiter mongo admin -u *** -p ***
# 显示 newset:ARBITER>

MongoDB 基础使用

1、安装镜像启动容器

# 安装 MongoDB 最新版本的镜像
docker pull mongo

# MongoDB 容器基本创建方法和数据目录挂载
docker run -itd -p 8030:27017 -v /home/lsy/test_db:/data/db --name test mongo --auth

2、连接创建管理用户

  • mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
  • 切换到admin数据库,添加的账号才是管理员账号。
  • 用户只能在用户所在数据库登录,包括管理员账号。
  • mongo的用户是以数据库为单位来建立的,每个数据库有自己的管理员。
  • 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
# 尝试连接
docker exec -it test mongo admin

# 添加管理用户
db.createUser({ user:'lsy', pwd:'***', roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});

db.auth('lsy', '***')

3、创建新数据库

# 如果数据库不存在,则创建数据库,否则切换到指定数据库。
use student

# 为当前数据库添加用户
db.createUser({ user:'boy', pwd:'***', roles:[ { role:'readWrite', db: 'student'}]})

db.auth('boy', '***')

# 每个数据库都有自己的 user 表
show users
exit

4、正常连接

docker exec -it test /bin/bash
mongo
use admin
db.auth('lsy', '***')
exit

补充:可视化工具 MongoDB Compass

参考资料及致谢

基于 Docker 的 MongoDB 主从集群

docker使用 docker-compose 部署MongoDB4.0 部署replica set(副本集)集群

容器化 MongoDB 集群

手把手教你用Docker部署一个MongoDB集群

Mongodb集群搭建的三种方式