本文是通过三台机器部署的三个 mongo 副本组成的集群,每个节点部署一个 mongo 服务,数据存储采用绑定 nfs 进行存储
前提: 机器上安装好 dockerdocker-compose

在这里插入图片描述

1. 生成 keyFile

  • MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
  • keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
  • 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
  • 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。这是MongoDB官方推荐keyFile的生成方式
# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key

还有另外值的注意的是该keyfile文件的所属用户不正确会出现:bad file错误。解决:(不是必须执行,出错执行)

sudo chown 999 mongodb.key

keyFile复制到其他两台机器上

mkdir /data/mongo/{data,configdb} -pv

# 将mongodb.key复制到 /data/mongo目录下,注意根据实际的磁盘空间创建目录

2. 详细的 docker-compose.yml 文件信息

我这是使用的 nfs 存储的mongo的数据,配置里面的 nfs_host_ip 需要替换为你自己的 nfs server的ip
可参考博客:https://blog.51cto.com/u_16175450/7974774 进行配置

  • 一号机
version: "3"

services:
  mongodb1:
    image: mongo:5.0.6
    container_name: mongo1
    restart: always
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=shuhuantong
      - MONGO_INITDB_ROOT_PASSWORD=shuhuantong123
      - MONGO_PACKAGE=mongodb-org
      - MONGO_REPO=repo.mongodb.org
      - HOME=/data/db
      - MONGO_DATA_DIR=/data/db
      - MONGO_INITDB_DATABASE=ipaas
      - TZ=Asia/Shanghai
    command: mongod --replSet rs0 --keyFile /mongodb.key
    volumes:
      - volume-data:/data/db
      - /etc/localtime:/etc/localtime
      - /data/mongo/configdb:/data/configdb
      - /data/mongo/mongodb.key:/mongodb.key
    deploy:
      resources:
        limits:
          cpus: '8'
          memory: 32G
        reservations:
          cpus: '4'
          memory: 16G
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /mongodb.key
        chown 999:999 /mongodb.key
        exec docker-entrypoint.sh $$@
volumes:
  volume-data:
    driver_opts:
      type: nfs
      o: addr=nfs_host_ip,nolock,soft,rw
      device: ":/data/nfs/mongo"

  • 二号机
version: "3"

services:
  mongodb1:
    image: mongo:5.0.6
    container_name: mongo2
    restart: always
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=shuhuantong
      - MONGO_INITDB_ROOT_PASSWORD=shuhuantong123
      - MONGO_PACKAGE=mongodb-org
      - MONGO_REPO=repo.mongodb.org
      - HOME=/data/db
      - MONGO_DATA_DIR=/data/db
      - MONGO_INITDB_DATABASE=ipaas
      - TZ=Asia/Shanghai
    command: mongod --replSet rs0 --keyFile /mongodb.key
    volumes:
      - volume-data:/data/db
      - /etc/localtime:/etc/localtime
      - /data/mongo/configdb:/data/configdb
      - /data/mongo/mongodb.key:/mongodb.key
    deploy:
      resources:
        limits:
          cpus: '8'
          memory: 32G
        reservations:
          cpus: '4'
          memory: 16G
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /mongodb.key
        chown 999:999 /mongodb.key
        exec docker-entrypoint.sh $$@
volumes:
  volume-data:
    driver_opts:
      type: nfs
      o: addr=nfs_host_ip,nolock,soft,rw
      device: ":/data/nfs/mongo2"

  • 三号机
version: "3"

services:
  mongodb1:
    image: mongo:5.0.6
    container_name: mongo3
    restart: always
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=shuhuantong
      - MONGO_INITDB_ROOT_PASSWORD=shuhuantong123
      - MONGO_PACKAGE=mongodb-org
      - MONGO_REPO=repo.mongodb.org
      - HOME=/data/db
      - MONGO_DATA_DIR=/data/db
      - MONGO_INITDB_DATABASE=ipaas
      - TZ=Asia/Shanghai
    command: mongod --replSet rs0 --keyFile /mongodb.key
    volumes:
      - volume-data:/data/db
      - /etc/localtime:/etc/localtime
      - /data/mongo/configdb:/data/configdb
      - /data/mongo/mongodb.key:/mongodb.key
    deploy:
      resources:
        limits:
          cpus: '8'
          memory: 32G
        reservations:
          cpus: '4'
          memory: 16G
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /mongodb.key
        chown 999:999 /mongodb.key
        exec docker-entrypoint.sh $$@
volumes:
  volume-data:
    driver_opts:
      type: nfs
      o: addr=nfs_host_ip,nolock,soft,rw
      device: ":/data/nfs/mongo3"

3. 启动三个容器

分别在三台机器上执行启动命令

# 启动命令
docker-compose -f docker-compose.yml up -d

# 重启命令
docker-compose -f docker-compose.yml restart

# 停止命令
docker-compose -f docker-compose.yml stop

# 删除容器命令
docker-compose -f docker-compose.yml rm

4. 配置集群

  • 进入 Mongo 容器链接 Mongo
# 选择第一个容器mongo1,进入mongo 容器
docker exec -it mongo1 /bin/bash
 
# 登录mongo
mongo -u shuhuantong -p shuhuantong123

通过以下指令配置 mongo 副本集集群

# 认证
> use admin
> db.auth('shuhuantong', 'shuhuantong123')

成功返回1,失败返回0

5. 使用配置文件初始化集群

单主机模式部署 3副本集 添加节点必须使用宿主机IP+PORT,使用容器内部IP的情况下代码层面连接到 mongodb-cluster 集群,
获取到的集群地址信息为 docker 容器内部 IP,若业务代码没有部署在 mongodb 主机则无法访问

  1. 配置文件
> config={_id:"rs0",members:[ 
{_id:0,host:"192.168.8.120:27017"}, 
{_id:1,host:"192.168.8.121:27017"}, 
{_id:2,host:"192.168.8.122:27017"}] 
}
  1. 初始化集群
> rs.initiate(config)
  1. 增长 mongo1 和 mongo2 的权重
> cfg = rs.conf()

# 修改权重
> cfg.members[0].priority=5
> cfg.members[1].priority=3

# 从新配置
> rs.reconfig(cfg)
  1. 验证副本集
# 切换节点查看同步状态:

> rs.printReplicationInfo()

# 仅当建立了集合后副节点才会进行同步
GitHub 加速计划 / compose / compose
39
5
下载
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
最近提交(Master分支:4 个月前 )
8f644eea Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com> 3 天前
56e92e34 Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> 3 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐