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.1volumes:- ./data/mongo1:/data/db- ./MongoDB/copy:/copyuser: rootcontainer_name: mongodb1ports:- 27018:27017command: mongod --replSet mongosrestart: alwaysmongodb2:image: mongo:4.2.1volumes:- ./data/mongo2:/data/db- ./MongoDB/copy2:/copyuser: rootcontainer_name: mongodb2ports:- 27019:27017command: mongod --replSet mongosrestart: alwaysmongodb3:image: mongo:4.2.1volumes:- ./data/mongo3:/data/db- ./MongoDB/copy3:/copyuser: rootcontainer_name: mongodb3ports:- 27020:27017command: mongod --replSet mongosrestart: always
    1. 进入任意mongo实例中,初始化副本集,使副本集生效。
	1. docker exec -it mongodb1 /bin/sh2. 进入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.mzph.cn/news/631198.shtml

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

相关文章

nestjs之定义provider的几种方式

在NestJS中可以以多种方式自定义Providers。以下是一些常见的方法: 1. 值提供者(Value Providers) 值提供者用于提供一些硬编码的值,例如配置对象或常量。这类提供者通过 useValue 关键字来指定要注入的值。 使用过程&#xff…

RK356x基于Ubuntu20.04搭建ROS开发环境

RK356x基于Ubuntu20.04搭建ROS开发环境 1、开发环境2、Ubuntu下安装步骤3、验证成果1、开发环境 CPU:RK356x 操作系统:arm64 Ubuntu20.04 2、Ubuntu下安装步骤 1、首先确保开发板是可以联网的。 root@hyb-RK356x:~# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,M…

selenium-java中切换iframe

1、当iframe中有固定的name或者id时可以通过name和id进行切换,代码如下 driver.switchTo().frame("name"); 2、当iframe中没有固定的name或者id时可以通过iframe角标进行切换&#xff0c;在浏览器通过ctrlf快捷键&#xff0c;搜索标签框输入//iframe;来查看当前ifr…

VsCode 常见的配置

转载&#xff1a;Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】 - 知乎 (zhihu.com) 一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8&#xff1a;默认就是了&#xff0c;不用设置了 3、设置常用的…

Chrome 开发者工具

Chrome 开发者工具 介绍控制面板时间线下载信息概要请求列表单个请求时间线优化时间线上耗时项 lighthouse 插件Performance&#xff08;性能指标&#xff09;Accessibility&#xff08;可访问性&#xff09;Best Practices&#xff08;最佳实践&#xff09;SEO&#xff08;搜索…

Luckysheet类似excel的在线表格(vue)

参考文档&#xff1a;快速上手 | Luckysheet文档 一、引入 在vue项目的public文件夹下的index.html的<head>标签里面引入 <link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/luckysheetlatest/dist/plugins/css/pluginsCss.css /><link relstylesheet hre…

2024,会更好嘛?

2023转眼过去&#xff0c;从1月的前端&#xff0c;2月的java&#xff0c;3月的数据库&#xff0c;4月的运维&#xff0c;我尝试了许多技术方向&#xff0c;终究在2023年5月&#xff0c;凭着背的Java面试题&#xff0c;拿到了三四个offer。2023年6月&#xff0c;边玩边整自己的毕…

okcc呼叫中心怎样提高客户服务水平

作为一个企业&#xff0c;以客户为中心一直是最重要的经营理念之一。提供高效、便捷和优质的客户服务&#xff0c;已成为创造满意客户和推动业务增长的关键因素&#xff0c;而呼叫中心系统作为一种全新的客户服务解决方案&#xff0c;正在成为越来越多企业的选择。 什么是呼叫…

springboot(ssm旅游信息管理系统 在线旅游系统 Java系统

springboot(ssm旅游信息管理系统 在线旅游系统 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…

Dockerfile镜像实战

目录 一 构建SSH镜像 1.开启ip转发功能 2. 准备工作目录 3.修改配置文件 5.启动容器并修改root密码 二 构建Systemctl镜像 1. 准备工作目录 ​编辑2.修改配置文件 3.生成镜像 4.启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;进行初始化 5.进入容器 三…

【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版

背景&#xff1a; 原本是为了学习qml&#xff0c;需要下载一个design studio&#xff0c;而这个需要比较新版的安装程序&#xff0c;但新版的安装程序官方都是online安装。于是从官网找下载链接。毕竟是英文的&#xff0c;又心急&#xff0c;误打误撞中我选择了商业版试用。 其…

大屏数据可视化的设计流程及原则

随着数字经济的快速发展和信息化在各行业各领域的深入推进&#xff0c;可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再只是电影里奇幻的画面&#xff0c;而是被实实在在地应用在政府、商业、金融、制造、交通、城市等各个行业的业务场景中&#xff0c;切切实实地实…

大模型日报-20240118

这里写目录标题 微软TaskWeaver开源框架&#xff1a;携手数据分析与行业定制&#xff0c;打造顶级Agent解决方案在24项场景中优于人类医生&#xff0c;Google团队开发基于自博弈的诊断对话大模型上海人工智能实验室团队开发具有多核光纤单元旋转功能的AI驱动投影断层扫描微软Co…

学累了怎么休息???

高效休息 9030 规律学习休息公式&#xff1a;每工作90分钟&#xff0c;强制休息30分钟。以拆开&#xff1a;比如4515&#xff1b;3010等等。 最强休息法 首先避免无效休息:玩游戏、刷抖音、玩微博、看朋友圈或者打开淘宝&#xff0c;等等。 1、无敌休息法 亲近自然独处听音…

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

3DGS 其一&#xff1a;3D Gaussian Splatting for Real-Time Radiance Field Rendering 1. 预备知识1.1 球谐函数1.2 Splatting1.3 α \alpha α blending1.4 多维高斯的协方差矩阵1.4.1 高斯与椭球体的关系1.4.2 世界坐标系下的三维高斯到二维像素平面投影过程 2. 3D Gaussia…

如何绘制出图像的色素分布直方图

效果 如图&#xff0c;可以展示出我们的图像的颜色分布直方图,表明的图像的亮和暗 实现可视化色素分布直方图方法 这里我们对我们的灰色图片和彩色图片进行了直方图显示 import cv2 import matplotlib.pyplot as plt image cv2.imread("test.jpg") # 彩色图片->…

k8s的对外服务---ingress

service的作用体现在两个方面&#xff1a; 集群内部&#xff1a;不断追踪pod的变化。他会更新endpoint中的pod对象&#xff0c;基于pod的IP地址不断变化的一种服务发现机制。 集群外部&#xff1a;类似负载均衡器&#xff0c;把流量IP端口&#xff0c;不涉及转发url(http、htt…

CNAS中兴新支点——软件测试7条原则

软件测试报告 最需要注意的就是测试思考&#xff0c;而非测试执行。而对软件测试菜鸟来说&#xff0c;初入行&#xff0c;首先要知道软件测试的7条原则&#xff0c;了解这些可以让你事倍功半。 软件测试的7条原则 1&#xff09;测试的不可穷尽原则 是的&#xff01;任何产品…

线性代数的学习和整理23:用EXCEL计算 向量/向量组的点乘 (内积) (建设ing)

目录 前言&#xff1a;EXCEL里的的向量相关计算公式 0.1 EXCEL里相关公式 0.2 先说结论&#xff1a;向量组的点乘公式和 向量组的点乘公式不一样 1 向量的点乘 (内积) 1.1 向量的点乘公式 1.2 EXCEL里向量点乘的计算 ​编辑 1.3 向量点乘的性质 1.3.1 内积的公式…

CentOS运维之根目录扩容

方案一&#xff1a;将home空间扩容给根目录 若home分区有足够的空间且从来不使用&#xff0c;则可以将home分区空间扩容给/根目录 1.解除挂载并删除/home卷 [rootlocalhost ~]# umount /home 若提示分区正在被使用&#xff0c;则通过名称查询占用进程并将进程杀死 [rootloca…