docker环境下mongo副本集的部署及异常修复

这篇具有很好参考价值的文章主要介绍了docker环境下mongo副本集的部署及异常修复。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近更换了办公地点。部署在本地docker环境里的mongo数据库不能使用了。原因是本地的ip地址变更。以前的mongo副本集的配置需要更新。处理完后,索性重新记录一下mongo副本集在docker中的部署流程。

mongo的事务及副本集

我们先了解一下什么是事务,事务是一组对数据库执行的操作,这些操作作为一个不可分割的工作单元。在MongoDB中,一个事务可以涉及多个文档和多个集合。例如一个订单的下单过程,涉及到订单的生成,商品库存变化等多个文档的变化。在服务端执行过程中,如果某一段代码产生了错误。不使用事务的话,可能会导致订单生成来,商品库存却不变的情况发生。而使用事务后,整个下单将会作为一个整体,所有数据变化成功后,才会被最终写入数据库中。

在MongoDB中使用事务需要满足一些前提条件。以下是使用MongoDB事务的主要前提:

  1. MongoDB版本:

    • 事务功能是在MongoDB 4.0版本中引入的。因此,要使用MongoDB事务,必须使用4.0版本或更高版本。
  2. 副本集:

    • 事务功能通常需要在副本集环境中运行。虽然在4.0版本中引入了单节点事务支持,但在实际生产环境中,建议在副本集中使用事务,以提供更好的高可用性和故障容忍性。
  3. 写操作:

    • 事务只能用于读写操作,包括插入、更新和删除。只有在进行写操作时,才能在事务中使用。
  4. 支持的存储引擎:

    • MongoDB事务支持WiredTiger存储引擎。确保你的MongoDB实例使用的是WiredTiger存储引擎。

我们主要来了解一下副本集。
MongoDB的副本集(Replica Set)是一种用于提供数据冗余和高可用性的数据库架构。副本集包含多个MongoDB实例,其中一个是主节点,其余是从节点。以下是副本集的一些关键概念和目的:

  1. 主节点(Primary):

    • 主节点是副本集的核心,负责处理所有写操作和客户端的读操作。只有主节点才能执行写操作,而且它会将这些写操作的结果同步到所有从节点。
  2. 从节点(Secondary):

    • 从节点是主节点的副本,用于提供数据冗余和高可用性。从节点接收主节点的写操作,并在本地执行这些写操作,从而保持与主节点的数据同步。从节点可以用于读操作,但不处理写操作。
  3. 数据冗余和高可用性:

    • 副本集的一个主要目的是提供数据冗余,确保数据不会因硬件故障或其他问题而丢失。同时,通过将读操作分发到从节点,副本集提供了更好的读取性能和高可用性。
  4. 自动故障转移:

    • 如果主节点发生故障,副本集会自动选择一个从节点作为新的主节点,确保系统的可用性。这种自动故障转移是副本集的一个重要特性。
  5. 部署多个节点:

    • MongoDB副本集可以包含多个节点,从而提供更强大的数据冗余和可用性。节点可以部署在不同的物理位置,以提高系统的容错性。

副本集部署

参考:windows下搭建mongo副本集

    1. 首先需要在docker中启用3个mongo实例,并设置他们为同一个副本集。我这里是直接配置的docker-compose.yml文件来启用实例。
# 创建3个实例,并设置他们副本集为 --replSet mongos,并创建每个实例的数据存储文件
  mongodb1:
    image: mongo:4.2.1
    volumes:
      - ./data/mongo1:/data/db
      - ./MongoDB/copy:/copy
    user: root
    container_name: mongodb1
    ports:
      - 27018:27017
    command: mongod --replSet mongos
    restart: always
  mongodb2:
    image: mongo:4.2.1
    volumes:
      - ./data/mongo2:/data/db
      - ./MongoDB/copy2:/copy
    user: root
    container_name: mongodb2
    ports:
      - 27019:27017
    command: mongod --replSet mongos
    restart: always
  mongodb3:
    image: mongo:4.2.1
    volumes:
      - ./data/mongo3:/data/db
      - ./MongoDB/copy3:/copy
    user: root
    container_name: mongodb3
    ports:
      - 27020:27017
    command: mongod --replSet mongos
    restart: always
    1. 进入任意mongo实例中,初始化副本集,使副本集生效。
	1. docker exec -it mongodb1 /bin/sh

	2. 进入mongo,初始化副本集。
	   rs.initiate({
    		_id: "mongos",
    		members: [
		        { _id : 0, host : "192.168.1.35:27018" },
		        { _id : 1, host : "192.168.1.35:27019" },
		        { _id : 2, host : "192.168.1.35:27020" }
		    ]
		});
	# 因为我是本地环境的副本集,所以设置host为本地IP。

	# 执行后的结果
	{
        "ok" : 1,
        "operationTime" : Timestamp(1562140190, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1562140190, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
	}
    1. 校验正确性
#使用 rs.status()检查副本集是否被正确设置
{
        "set" : "mongos",
        "date" : ISODate("2024-01-17T06:58:59.456Z"),
        "myState" : 2,
        "term" : NumberLong(7873),
        "syncingTo" : "192.168.1.35:27019",
        "syncSourceHost" : "192.168.1.35:27019",
        "syncSourceId" : 1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "majorityVoteCount" : 2,
        "writeMajorityCount" : 2,
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1705474733, 1),
                        "t" : NumberLong(7873)
                },
                "lastCommittedWallTime" : ISODate("2024-01-17T06:58:53.638Z"),
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1705474733, 1),
                        "t" : NumberLong(7873)
                },
                "readConcernMajorityWallTime" : ISODate("2024-01-17T06:58:53.638Z"),
                "appliedOpTime" : {
                        "ts" : Timestamp(1705474733, 1),
                        "t" : NumberLong(7873)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1705474733, 1),
                        "t" : NumberLong(7873)
                },
                "lastAppliedWallTime" : ISODate("2024-01-17T06:58:53.638Z"),
                "lastDurableWallTime" : ISODate("2024-01-17T06:58:53.638Z")
        },
        "lastStableRecoveryTimestamp" : Timestamp(1705474703, 1),
        "lastStableCheckpointTimestamp" : Timestamp(1705474703, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.1.35:27018",
                        "ip" : "192.168.1.35",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 20000,
                        "optime" : {
                                "ts" : Timestamp(1705474733, 1),
                                "t" : NumberLong(7873)
                        },
                        "optimeDate" : ISODate("2024-01-17T06:58:53Z"),
                        "syncingTo" : "192.168.1.35:27019",
                        "syncSourceHost" : "192.168.1.35:27019",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 100459,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 1,
                        "name" : "192.168.1.35:27019",
                        "ip" : "192.168.1.35",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 19965,
                        "optime" : {
                                "ts" : Timestamp(1705474733, 1),
                                "t" : NumberLong(7873)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1705474733, 1),
                                "t" : NumberLong(7873)
                        },
                        "optimeDate" : ISODate("2024-01-17T06:58:53Z"),
                        "optimeDurableDate" : ISODate("2024-01-17T06:58:53Z"),
                        "lastHeartbeat" : ISODate("2024-01-17T06:58:58.811Z"),
                        "lastHeartbeatRecv" : ISODate("2024-01-17T06:58:58.809Z"),
                        "pingMs" : NumberLong(1),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1705454782, 1),
                        "electionDate" : ISODate("2024-01-17T01:26:22Z"),
                        "configVersion" : 100459
                },
                {
                        "_id" : 2,
                        "name" : "192.168.1.35:27020",
                        "ip" : "192.168.1.35",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 19965,
                        "optime" : {
                                "ts" : Timestamp(1705474733, 1),
                                "t" : NumberLong(7873)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1705474733, 1),
                                "t" : NumberLong(7873)
                        },
                        "optimeDate" : ISODate("2024-01-17T06:58:53Z"),
                        "optimeDurableDate" : ISODate("2024-01-17T06:58:53Z"),
                        "lastHeartbeat" : ISODate("2024-01-17T06:58:58.810Z"),
                        "lastHeartbeatRecv" : ISODate("2024-01-17T06:58:58.810Z"),
                        "pingMs" : NumberLong(1),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "192.168.1.35:27019",
                        "syncSourceHost" : "192.168.1.35:27019",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 100459
                }
        ],
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1705474733, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1705474733, 1)
}

配置成功后,我们的mongo命令行会显示当前实例是主节点(PRIMARY)or子节点(SECONDARY)
docker环境下mongo副本集的部署及异常修复,后端,docker,容器,运维

更新配置

当我的ip变化后,之前的配置就无效了,mongo的命令行也会显示当前的mongo节点为OTHER

	rs.initiate({
  		_id: "mongos",
  		members: [
	        { _id : 0, host : "192.168.1.35:27018" },
	        { _id : 1, host : "192.168.1.35:27019" },
	        { _id : 2, host : "192.168.1.35:27020" }
	    ]
	});
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
mongos:OTHER>

此时3个mongo实例都是宕机的OTHER状态,既非主节点也非子节点。需要我们更新members成员的IP信息。

	#进入任意mongo实例
	#获取配置信息
	mongos:OTHER>cfg = rs.conf()
	#更新配置信息
	mongos:OTHER>cfg.members[0].host="192.168.6.3:27018"
	mongos:OTHER>cfg.members[1].host="192.168.6.3:27019"
	mongos:OTHER>cfg.members[2].host="192.168.6.3:27020"
	
	# 使用rs.reconfig(cfg)重设配置,此时会抛错
	mongos:OTHER>rs.reconfig(cfg)
	{
	        "operationTime" : Timestamp(1705368470, 1),
	        "ok" : 0,
	        "errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is REMOVED; use the \"force\" argument to override",
	        "code" : 10107,
	        "codeName" : "NotMaster",
	        "$clusterTime" : {
	                "clusterTime" : Timestamp(1705368470, 1),
	                "signature" : {
	                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
	                        "keyId" : NumberLong(0)
	                }
	        }
	}
	#添加force,强制执行
	mongos:OTHER> rs.reconfig(cfg,{force:true})
	{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1705368470, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1705368470, 1)
	}

成功后,副本集就又可以正常使用了。文章来源地址https://www.toymoban.com/news/detail-802584.html

到了这里,关于docker环境下mongo副本集的部署及异常修复的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium+docker 环境部署(报错异常踩坑记)

    背景 团队里开始搞WEB的UI自动化测试相关内容,框架选型是JAVA+SELENIUM+CHROME+WEBDRIVER 本地编写代码,调试运行都OK,我们计划发布到CICD环境进行持续集成了 我们的CICD环境是搭建在云端docker中的一套Jenkins集群,包括了10个slave节点。 期间也遇到不少坑,记录下 坑1: 云端docker需要

    2024年02月15日
    浏览(32)
  • OLAP系列:三、clickhouse Docker集群部署指南(3分片1副本模式)

    一是为了学习容器,另外也是帮助一些同学解决机器资源紧缺,能够在一台是宿主机部署一套clickhouse集群服务。 本章内容适合开发测试环境使用,生产环境还需要更多细节的处理工作,只能作为参考。 二、部署准备 1、机器准备 172.25.16.108 2、创建容器网络 3、镜像准备 1、下

    2024年02月12日
    浏览(40)
  • docker 项目部署 后端/前端

    1.先打包前端项目为dist 文件 npm run build !!!!! 重点 现在vscode 跑一下 看dist能不能跑起来 !!!!! 2.先安装nginx ,能成功跑起来 docker pull nginx 拉取nginx镜像 docker images 查看已有镜像 docker run --name nginx-test -p 9091:80 -d nginx 启动nginx 3. Nginx服务的配置和部署 `创建 conf文件目

    2024年02月10日
    浏览(76)
  • 【漏洞修复】docker 环境下,AMQP Cleartext认证漏洞,rabbitmq明文漏洞修复,超详细

    目录 1、拷贝docker配置文件到本地 2、重新启动容器: 3、添加SSL插件: 4、查看启动结果 5、基于CMF-AMQP-Configuration来生成SSL自签名文件 6、使用JDK的Keytool工具,将服务器公钥转换为JKS格式 7、创建etc/rabbitmq/rabbitmq.conf(如果不存在) 8、添加证书登录用户 9、验证证书有效性 通过

    2024年02月05日
    浏览(29)
  • 【Linux】Linux环境配置以及部署项目后端

    接下来看看由辉辉所写的关于Linux的相关操作吧 目录 🥳🥳Welcome Huihui\\\'s Code World ! !🥳🥳 一.Linux环境配置 1.JDK ①上传安装包到服务器 ②解压相应安装包 ③配置环境变量 2.Tomcat ①启动tomcat ②防火墙设置 3.MySQL  ①删除默认数据库 ②将MySQL安装包解压到指定目录 ③安装MySQL ④

    2024年02月06日
    浏览(32)
  • NodeJs后端项目使用docker打包部署

    docker安装看之前的文章 默认已经安装好docker并且配置没有问题 拉取项目 https://gitee.com/coder-msc/docker-node 本地跑一个看看 pnpm install pnpm start 本地访问 项目整个上传服务器 查看dockerfile 使用docker打包 进入项目目录里面 docker build . 给镜像打tag: docker tag b86282a8ba4c node-demo:v1.0.1 启动

    2024年02月15日
    浏览(29)
  • Docker 部署后端项目自动化脚本

    这里的项目位置是target同级目录 1.在项目下面新建一个bin目录 新建一个package.txt 写入下方代码后 后缀改为.bat 2.项目下新建一个deploy文件夹里面新建一个deploy.ps1脚本文件 示例 这里使用ssh 可以自己编写不太一样 上传到服务器中后自己选择一个合适的文件夹 然后旁边新建一个

    2024年02月01日
    浏览(41)
  • Linux的开发环境安装配置与后端项目部署

    目录 一.安装开发环境 1.准备阶段 1.1 创建新目录 1.2 解压文件 2.JDK的安装与配置环境变量 2.1 解压jdk压缩包 2.2 配置环境变量 2.3 设置环境变量生效  2.4 验证是否安装成功 3.Tomcat的安装与使用 3.1 解压安装 3.2 开启服务 3.3 开放端口   3.4 访问成功 4.MySQL的安装 4.1 检查卸载原有

    2024年02月06日
    浏览(34)
  • 苍穹外卖后端部署/阿里云ECS/Docker

    1.阿里云ECS:我用的是下图这个,也可以白嫖试用(3个月,和我购买的性能一致)的,但是试用的不满足备案条件,如果之后想使用域名访问的话,建议还是花点钱 2.远程工具:自己配置好,连接到服务器。也可以使用ecs自带的,都行 3.以上两步做好后,安装Docker,有很多帖

    2024年02月03日
    浏览(58)
  • MacOS上用docker运行mongo及mongo-express

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 要求在你的MacOS上已安装docker服务 执行命令

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包