docker-compose部署mongodb4.4.8副本集群 + 权限 + springBoot集成测试

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: docker-compose部署mongodb4.4.8副本集群 + 权限 + springBoot集成测试

3种集群模式参考链接:http://c.biancheng.net/view/6567.html

MongoDB 有三种集群部署模式

分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。

  • Master-Slaver 是一种主从副本的模式,目前已经不推荐使用。
  • Replica Set 模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。
  • Sharding 模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
Sharding 模式追求的是高性能,而且是三种集群中最复杂的。在实际生产环境中,通常将 Replica Set 和 Sharding 两种技术结合使用。

在实际生产环境中,副本集和分片是结合起使用的,可满足实际应用场景中高可用性和高可扩展性的需求。
但是对于我来说,目前只需要用到副本集集群做到故障自动切换、实现高可用,以及支持多文档事务操作即可;

搭建实操

整体集群模式实战参考链接:

Linux:http://c.biancheng.net/view/6568.html

docker:https://segmentfault.com/a/1190000039142073

副本集搭建

docker-compose部署参考链接:

https://www.cnblogs.com/ricklz/p/13237419.html

http://monkeywie.cn/2020/03/10/mongodb-replica-set/?utm_source=tuicool&utm_medium=referral

搭建过程

# 创建挂载需要用到的文件夹(可自定义路径)
# 线上最好分不同的机器搭建,我测试暂时搭建在一台机器上
mkdir -p /ecsmount/docker/mongo-replica-cluster/{
   
   mongo-replica-1/{
   
   data/db,conf},mongo-replica-2/{
   
   data/db,conf},mongo-replica-3/{
   
   data/db,conf}}

# 生成auth.key, 用于多节点之间的认证
cd /ecsmount/docker/mongo-replica-cluster
openssl  rand -base64  756  > ./auth.key
# 权限设置,为必要步骤
# chown mongodb:mongodb ./auth.key
chown systemd-bus-proxy:ssh_keys ./conf/auth.key
chmod 400 ./auth.key  

cp ./auth.key  ./mongo-replica-1/conf
cp ./auth.key  ./mongo-replica-2/conf
cp ./auth.key  ./mongo-replica-3/conf
rm -rf ./auth.key

分别写三个 docker-compose.yml

version: '3.6'
services:
  mongo-replica-1:
    restart: always
    # build: .
    image: mongo:4.4.8-rc0-focal
    container_name: mongo-replica-1  # 容器名,不同副本使用不同名字
    ports:
      - 27117:27017       # 外部映射端口改为自定义的端口
    volumes:
      # 数据目录  挂载出来后,即使删除容器,再用该挂载数据与docker-compose.yml文件启动容器,即可恢复到原来的数据以及用户信息
      - ./data/db:/data/db
      # 自定义数据备份目录,可以定时全量备份数据出来
      - ./mybackup:/mybackup
      # conf文件夹
      - ./conf:/conf

      - /etc/localtime:/etc/localtime
    environment:
      # 配置root用户, 只需要在第一台机器中配置即可(也可以都配置成一样的,如果不一样,效果未知,可以自己测试一下),其他副本集节点会自动同步过去
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=123

      - TZ=Asia/Shanghai
      # 缓存大小配置为使用 1.5GB , 考虑服务器中还有其他服务需要占用内存,可自定义大小
      - wiredTigerCacheSizeGB=1.5


    # 执行命令,覆盖默认命令
    # --replSet rs  指定副本集名称为rs
    # --keyFile /conf/auth.key  各节点使用一个key进行认证
    command: mongod --replSet rs --keyFile /conf/auth.key 

    # 使用springBoot连接测试后,才知道还好提前配置了hosts, 建议在rs.initiate() 初始化集群时直接写host,不要写局网ip,后面测试时遇到坑也会在后面写到
    # 容器中的hosts配置,自定义host与服务器局网IP映射
    extra_hosts:
     - "server-d-1:172.16.218.205"
     - "server-d-2:172.16.0.84"

启动完成后执行初始化命令

docker exec -it mongo-replica-1 bash
mongo 
use admin  
db.auth("root","123")     # rs的相关方法需要先登录才能使用
rs.initiate({
   
    _id: "rs", members: [{
   
   _id:1,host:"172.16.0.84:27117"},{
   
   _id:2,host:"172.16.0.84:27217"},{
   
   _id:3,host:"172.16.0.84:27317"}]})
rs.status()

在这里插入图片描述

rs.status() 效果:

在这里插入图片描述

#移除节点
rs.remove("172.16.0.84:27317");
# mongo副本集的最小推荐配置是三台,如果服务器资源不够,可以将第三台设置为仲裁节点(仲裁节点只参与投票,不同步数据)
rs.addArb("172.16.0.84:27317");
# 或者是在初始化时就直接将第三台设置为仲裁节点,关键参数:arbiterOnly:true
rs.initiate({
   
    _id: "rs", members: [{
   
   _id:1,host:"172.16.0.84:27117"},{
   
   _id:2,host:"172.16.0.84:27217"},{
   
   _id:3,host:"172.16.0.84:27317", arbiterOnly:true}]})

搭建成功后的补充:关于认证文件的权限设置的说明

  • 方法一:直接在宿主机设置(推荐)
1、在mongo容器中需要设置权限: <=400    (直接在宿主机中设置好即可)
chmod 400 ./auth.key

2、在mongo容器中需要设置的用户与组: mongodb:mongodb
# 但是我们还没启动容器,只能在宿主机中先设置为:systemd-bus-proxy:ssh_keys
chown   systemd-bus-proxy:ssh_keys  ./auth.key
# 启动容器后,发现容器内该文件的  用户:用户组 映射为了  mongodb:mongodb

  • 方法二:使用 Entrypoint(未测试)

    Entrypoint设置在运行容器时,首先执行的命令和参数。

    # 在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义
    # 注意是覆盖,确认原镜像中被覆盖没问题的话,可以按其他博主的方法写在 docker-compose.yml中:
        command: mongod --replSet mongos --keyFile /data/mongodb.key
        restart: always
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /data/mongodb.key
            chown 999:999 /data/mongodb.key
            exec docker-entrypoint.sh $$@
    # 该配置片段取自:https://www.cnblogs.com/ricklz/p/13237419.html
    

搭建过程常用命令

# 停止并删除容器,清空容器挂载数据
docker-compose down
rm -rf ./data/db/*

副本无法查询 :not master and slaveOk=false

因为SECONDARY默认是不允许读写的,

https://stackoverflow.com/questions/8990158/mongodb-replicates-and-error-err-not-master-and-slaveok-false-code

在这里插入图片描述

设置方法:

# 两种方法都是一样的效果, 每次mongo 会话都要设置一次
db.getMongo().setSecondaryOk()
rs.secondaryOk();

在其他机器部署新增节点

# 当前服务器(server-d-2)     新机器(server-d-1) 
# 在新机器上创建目录
mkdir -p /ecsmount/docker/mongo-replica-cluster/mongo-replica-4/{
   
   data/db,conf}

# 新机器需要 auth.key 与 docker-compose.yml 两个文件即可
# 在server-d-2机器上复制以上2个文件到新机器中
scp -P 50148 ./docker-compose.yml  root@server-d-1:/ecsmount/docker/mongo-replica-cluster/mongo-replica-4/
scp -P 50148 ./conf/auth.key   root@server-d-1:/ecsmount/docker/mongo-replica-cluster/mongo-replica-4/conf/

# 在新机器上检查文件auth.key 权限,一定要设置文件权限
chown systemd-bus-proxy:ssh_keys ./conf/auth.key
chmod 400 ./conf/auth.key  

# 修改新机器上的docker-compose.yml中的容器名与外部端口(新机器上不冲突,非必要,但建议还是区分开来)
container_name: mongo-replica-4  # 容器名,不同副本使用不同名字
ports:
  - 27417:27017                    # 第四个节点

# 新机器上启动后,进入主机PRIMARY中执行添加节点的操作
rs.add("172.16.218.205:27417")    # 这个是我新机器的ip地址
rs.status()

在这里插入图片描述

在服务器中登陆mondo测试

1、在主节点测试写入、修改、删除数据,是否能同步到其他节点查询到;
2、手动停止主节点容器,观察从节点是否有重新选举主节点;
3、在新的主节点中插入、修改、新增数据,然后启动之前的主节点,观察启动后是否同步了最新的数据过来;
# 过程太繁琐,截图:略!

在springBoot中测试

yml连接配置

spring:
  application:
    name: springboot-mongodb
  data:
    mongodb:
      uri: mongodb://imAdmin:123456@server-d-2:27117,server-d-2:27217/im?replicaSet=rs   # 副本集群主机单节点负责读写
# 关于读写分离的配置,其他博主也有分享一些方案,但是鉴于 “副本滞后” 的影响,结合自己业务情况,决定还是使用单机节点负责读与写,副本节点负责数据同步备份。

跑测试类时报错:

在这里插入图片描述在这里插入图片描述

修改集群配置,将局网IP使用host替换

参考链接:mongodb集群修改IP地址 https://blog.csdn.net/wangkai_123456/article/details/109512009

docker  exec -it  mongo-replica-1   bash
cat /etc/hosts   # 确认hosts配置中是否有自己配置的host

# 查看当前配置,准备修改
cfg = rs.conf()
# 修改三个节点的host(把局网IP替换成对应的host)
cfg.members[0].host = "server-d-2:27117"
cfg.members[1].host = "server-d-2:27217"
cfg.members[2].host = "server-d-1:27417"
# 确认修改后的配置
cfg 
# 保存配置
rs.reconfig(cfg)

修改前截图:

在这里插入图片描述

修改后截图 rs.status()

在这里插入图片描述

查看各个容器日志,正常!继续跑test测试类,正常!!!

在这里插入图片描述

在这里插入图片描述

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的在线测试管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的在线测试管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
9天前
|
分布式计算 API Spark
Spline部署&测试
Spline是Spark的元数据管理和血缘追踪工具,通过Docke部署。安装涉及下载docker-compose.yml和.env文件,使用`docker compose up -d`命令启动,包括rest-server(核心,处理血缘数据并存储在ArangoDB)、arangodb(多模型数据库)、ui(Web服务)等组件。测试中使用pyspark进行血缘捕获,通过spark-submit命令指定Spline相关依赖并连接到Spline服务器。成功后,血缘数据可在Spline UI中查看。未来计划在DolphinScheduler上测试Spark SQL任务并启用血缘追踪。
23 0
|
12天前
|
关系型数据库 MySQL 数据库
测试部署PolarDB-X 分布式与集中式
在本文中,作者详述了在CentOS 7.9上部署测试PolarDB-X分布式与集中式数据库的过程。PolarDB-X作为阿里云优化的分布式数据库,提供高稳定性和与MySQL的兼容性,是应对单体数据库扩展性和性能瓶颈的解决方案,同时也符合国产化需求。文章介绍了部署环境准备,包括关闭防火墙和SELinux,设置系统参数,安装Python3和Docker,以及配置MySQL客户端。接着,通过PXD工具部署了PolarDB-X的集中式和分布式版,遇到的问题包括阿里云镜像源异常导致的部署失败以及指定版本安装的困扰。最后,作者进行了初步的压力测试,并对文档完善、生态工具建设以及提供更多使用案例提出了建议。
282 9
测试部署PolarDB-X 分布式与集中式
|
13天前
|
Java 关系型数据库 Docker
docker打包部署spring boot应用(mysql+jar+Nginx)
docker打包部署spring boot应用(mysql+jar+Nginx)
|
20天前
|
Java 数据库连接 Spring
K8S+Docker理论与实践深度集成java面试jvm原理
K8S+Docker理论与实践深度集成java面试jvm原理
|
21天前
|
机器学习/深度学习 Shell C++
测试本地部署ChatGLM-6B | ChatGPT
ChatGLM-6B是款62亿参数的中英对话模型,类似ChatGPT,可在6GB显存(INT4量化)的GPU或CPU上运行。它提供流畅、多样的对话体验。用户可从Hugging Face或清华云下载模型配置。部署涉及创建Python环境,安装依赖,下载模型到`ckpt`文件夹。测试时加载tokenizer和模型,使用示例代码进行交互。应用包括基于MNN和JittorLLMs的推理实现,以及langchain-ChatGLM、闻达、chatgpt_academic和glm-bot等项目。5月更文挑战第10天
36 1
|
21天前
|
NoSQL 测试技术 MongoDB
【MongoDB 专栏】MongoDB 的性能基准测试与评估
【5月更文挑战第11天】MongoDB的性能基准测试对于优化至关重要,涉及数据读写速度、查询响应时间及吞吐量等指标。测试应明确目标和范围,选择合适的工具,考虑数据模型、索引、查询优化和系统配置等因素。性能评估需关注读写吞吐量、响应时间和资源利用率。通过多次测试、逐步增加负载和对比其他系统,识别性能瓶颈并持续优化。随着技术发展,测试方法和工具将持续创新,以应对复杂性能挑战。
【MongoDB 专栏】MongoDB 的性能基准测试与评估
|
21天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
21天前
|
存储 安全 开发者
【Docker 专栏】Docker 与云存储服务的集成
【5月更文挑战第9天】在数字化时代,Docker和云存储服务的结合为企业和开发者提供了强大工具。Docker的高效性、可移植性和隔离性,加上云存储的扩展性、高可靠性和高可用性,通过集成可以实现数据持久化、便捷部署和资源优化。常见的集成包括AWS S3、Azure Blob Storage和Google Cloud Storage。集成时需注意安全、性能和兼容性问题,未来集成将更加紧密和智能化,助力企业创造更大价值。
【Docker 专栏】Docker 与云存储服务的集成
|
21天前
|
存储 测试技术 持续交付
【Docker 专栏】Docker 与 CI/CD 的集成策略
【5月更文挑战第8天】本文探讨了Docker在CI/CD流程中的作用,强调了环境一致性、快速部署和资源隔离等优势。通过在构建、测试和部署阶段集成Docker,可以提升软件开发效率和质量。具体集成策略包括使用Dockerfile构建镜像、整合CI/CD工具如Jenkins和GitLab。集成带来的好处包括提高效率、增强可靠性、加速交付和简化管理。然而,也需应对镜像管理、网络配置和安全等问题。通过案例分析,证明了Docker与CI/CD集成的有效性和必要性。
【Docker 专栏】Docker 与 CI/CD 的集成策略