首页 > 数据库 >Docker 部署之 docker-compose 部署 MongoDB 三副本集群(三节点)

Docker 部署之 docker-compose 部署 MongoDB 三副本集群(三节点)

时间:2024-08-09 20:24:05浏览次数:16  
标签:compose mongo 部署 MongoDB key mongodb docker data MONGO

docker-compose 部署 MongoDB

本文是通过三台机器部署的三个 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()

# 仅当建立了集合后副节点才会进行同步

标签:compose,mongo,部署,MongoDB,key,mongodb,docker,data,MONGO
From: https://blog.csdn.net/qq_43239389/article/details/141063742

相关文章

  • 本地化部署GraphRAG+Ollama,实现基于知识图谱的智能问答
    citingfromhttps://medium.com/@vamshirvk/unlocking-cost-effective-local-model-inference-with-graphrag-and-ollama-d9812cc60466之前写过一篇使用deepseek和智谱AI实现《红楼梦》中人物关系智能问答的随笔但deepseek提供的免费tokens只有500万个,GraphRAG构建图谱的索引和......
  • 通过下载docker镜像部署milvus(2.4.6)
    Os:Centos7milvus:2.4.6Python:3.6.51.查看docker和docker-compose版本[root@host134milvus]#docker-vDockerversion26.1.4,build5650f9b[root@host134milvus]#docker-compose-vdocker-composeversion1.29.2,buildunknown安装docker的方法如下:https://www.cnbl......
  • 从Java类加载器源码浅析到线上热部署实现
    1Java代码的执行过程写了这么多代码,有没有想过我们的代码是怎么执行的?或者说定义了那么多类,我们的class是怎么加载到内存的?Java语言属于一种高级语言,而cpu能执行的只有机器码,所以Java代码的运行离不开jvm虚拟机的编译,下面用一张图说明在HotSpot虚拟机中Java代码加载到cpu执行的......
  • JSP古诗词学习系统3we8k(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、项目背景与意义古诗词作为中华文......
  • JSP个人信息管理系统0w9j8--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,密码表,账单表,记事本,备忘录,充电站,学习总结,工作总结,好友列表开题报告内容一、项目背景与意义随着信息技术的飞速发展,个人信息的管理变得越......
  • JSP公安应急储备物资信息管理系统gk6r0(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:办公室处,审计处,保障部,单位,批文,计划,申购,采购,预算,合同,资产,资产分类,仓储,日常使用,财务处开题报告内容一、项目背景公安应急储备物资是公安......
  • JSP个人学习情况统计平台kuy0w--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,课程信息,类型,下载文档,学习记录技术要求:    开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用......
  • OpenGauss部署案例之---OpenEuler 20.03部署OpenGauss企业版
    案例说明:在OpenEuler20.03系统,x86架构下部署OpenGauss5.0.1企业版单实例数据库。数据库版本:openGauss=#selectversion();version------------------------------------------------------------......
  • KubeSphere 部署 Kafka 集群实战指南
    本文档将详细阐述如何利用Helm这一强大的工具,快速而高效地在K8s集群上安装并配置一个Kafka集群。实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor镜像仓库ksp-co......
  • server2019部署
    安装部署server2019(datacenter)和远程服务器一、安装s2019下载2019镜像,在目标主机上使用iso文件存储当作启动盘装系统,或者打开iso文件,点击setup安装系统。安装系统过程中没有特殊操作,根据需求自行安装即可二、激活s2019使用工具,url:https://wwf.lanzout.com/iMXxb26xiko......