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

news2025/1/14 1:24:43

最近更换了办公地点。部署在本地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:27017" },
		        { _id : 1, host : "192.168.1.35:27018" },
		        { _id : 2, host : "192.168.1.35:27019" }
		    ]
		});
	# 因为我是本地环境的副本集,所以设置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)
在这里插入图片描述

更新配置

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

	rs.initiate({
  		_id: "mongos",
  		members: [
	        { _id : 0, host : "192.168.1.35:27017" },
	        { _id : 1, host : "192.168.1.35:27018" },
	        { _id : 2, host : "192.168.1.35:27019" }
	    ]
	});
---
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:27018"
	mongos:OTHER>cfg.members[2].host="192.168.6.3:27018"
	
	# 使用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)
	}

成功后,副本集就又可以正常使用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain新发布v0.1.0稳定版本有哪些新功能?

▼最近直播超级多,预约保你有收获 今晚直播:《LangChain 框架案例实战》 —1— 首个稳定版本 LangChain v0.1.0 LangChain v0.1.0 发布后,就不仅仅是一个开发框架了,而是一个开发者平台(LLMOps)&#xff0c…

css-盒子等样式学习

盒子居中,继承外层盒子的宽高 兼容性(border-box)将边框收到盒子内部 初始化div 不用管box-setting content-box 还原 创建为一个类 ,让所有需要还原的类 进行继承 padding 用法表示margin上下左右边距 body 外边距&…

Python ❀ 使用代码实现API接口调用详解

文章目录 1. 工具准备1.1. requests代码包1.2. BurpSuite抓包工具 2. 操作过程2.1. 一个简单的请求2.1.1. Burp获取响应2.1.2. 转发获取响应 2.2. 构造GET类型URL参数2.3. 构造请求头部2.4. 构造POST类型payload数据 本文主要讲解常用API接口如何使用python实现。 API&#xff…

【白话机器学习的数学】读书笔记(3)学习分类(感知机、逻辑回归)

三、学习分类 1.分类的目的 找到一条线把白点和黑点分开。这条直线是使权重向量成为法线向量的直线。(解释见下图) 直线的表达式为: ω ⋅ x ∑ i 1 n ω i ⋅ x i 0 \omegax \sum_{i1}^n\omega_i x_i 0 ω⋅xi1∑n​ωi​⋅xi​0 ω \omega ω是权重向量权…

IIS 缓存, 更新后前端资源不能更新问题

解决办法: 通常只需要index.html 不缓存即可, 其他文件都是根据index.html 中的引用去加载; 正确的做法是在 站点下增加 web.config 文件, 内容如下: 我这个是因为目录下有个config.js 配置文件, 也不能缓存, 所以加了两个 <?xml version"1.0" encoding&quo…

2018年认证杯SPSSPRO杯数学建模D题(第一阶段)投篮的最佳出手点全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 对于投篮最佳出手点的探究 D题 投篮的最佳出手点 原题再现&#xff1a; 影响投篮命中率的因素不仅仅有出手角度、球感、出手速度&#xff0c;还有出手点的选择。规范的投篮动作包含两膝微屈、重心落在两脚掌上、下肢蹬地发力、身体随之向前上…

迅为RK3588开发板编译 Buildroot单独编译图形化界面(打包镜像)

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后&#xff0c;将打包要用到的所有固件移动到 rockdev 目录下&#xff0c;然后打包为完整的 update.img 镜像。 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面&#xff0c;进入之后如下所示&#xff1a; ./buil…

nginx+lua配置,一个域名配置https,docker集群使用

没安装kua的先安装lua 没有resty.http模块的&#xff0c;许配置 nginxlua配置&#xff0c;一个域名配置https&#xff0c;docker集群使用&#xff0c;一个域名配置https管理整个集群 lua做转发&#xff08;方向代理&#xff09; 1、ad_load.lua文件 ngx.header.content_typ…

如何录制屏幕视频?让视频制作更简单!

随着数字化时代的来临&#xff0c;录制屏幕视频成为一种常见的传播和教学方式。无论是制作演示文稿、教学视频&#xff0c;还是记录游戏操作&#xff0c;屏幕录制为用户提供了强大而灵活的工具。可是您知道如何录制屏幕视频吗&#xff1f;本文将深入介绍两种常见的屏幕录制方法…

蓝桥杯备赛 day 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

web开发学习笔记(8.java web后端开发基础知识)

1.使用spring开发的优势&#xff0c;spring发展到今天已经形成了一种开发生态圈&#xff0c;提供了若干个子项目&#xff0c;每个项目用于完成特定的功能。使用spring全家桶&#xff0c;可以做到很多事情&#xff0c;可以很方便的套用很多的组件。 2.pom构成 指定父工程 <p…

jeecgboot 前端bug or 后端 看图

无法显示文本 只能显示value 很恶心 如果用 varchar 就可以 不知道有没有别的方式 用int 解决 ,可能是我没有发现好的方法

尚无忧【无人共享空间 saas 系统源码】无人共享棋牌室系统源码共享自习室系统源码,共享茶室系统源码

可saas多开&#xff0c;非常方便&#xff0c;大大降低了上线成本 UNIAPPthinkphpmysql 独立开源&#xff01; 1、定位功能&#xff1a;可定位附近是否有店 2、能通过关键字搜索现有的店铺 3、个性轮播图展示&#xff0c;系统公告消息提醒 4、个性化功能展示&#xff0c;智能…

驱动开发--阻塞与非阻塞

一、五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞&#xff1a;不能操作就返回错误 多路复用&#xff1a;委托中介监控 信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作 异步IO&#xff1a;向内核注册操作请求&#xff…

助力工业焊缝质量检测,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工业焊接场景下钢材管道焊缝质量检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

5-微信小程序语法参考

1. 数据绑定 官网传送门 WXML 中的动态数据均来自对应 Page 的 data。 数据绑定使用 Mustache 语法&#xff08;双大括号&#xff09;将变量包起来 ts Page({data: {info: hello wechart!,msgList: [{ msg: hello }, { msg: wechart }]}, })WXML <view class"vie…

分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解

学习链接:分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解 资料链接:链接:https://pan.baidu.com/s/1ijvMQmwtRgLO4KDSsNODMw 提取码:vyok 神经网络的应用非常的广,它核心思想非常简单,就是人是如何认知感知并且处理这个世界中的现实问题的。…

【React】Redux的使用详解

文章目录 Redux的三大原则Redux官方图react-redux使用 1、创建store管理全局状态​ 2、在项目index.js根节点引用 3、 在需要使用redux的页面或者组件中&#xff0c;通过connect高阶组件映射到该组件的props中 redux中异步操作如何使用redux-thunkcombineReducers函数 Re…

[C#]winform部署官方yolov8-rtdetr目标检测的onnx模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 RTDETR&#xff0c;全称“Real-Time Detection with Transformer for Object Tracking and Detection”&#xff0c;是一种基于Transformer结构的实时目标检测和跟踪算法。它在目标检测和跟踪领域…

保证Kafka消息有序性

一、Kafka特性 写入同一个partion分区中的数据是一定有顺序的kafka中一个消费者消费一个partion的数据&#xff0c;消费者取出数据时&#xff0c;也是有顺序的 二、保证消息Kafka消息有序性 在生产者端&#xff0c;应保证消息被写入同一分区。可以在构造消息时指定消息的key…