当前位置: 首页 > news >正文

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: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)
在这里插入图片描述

更新配置

当我的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)}

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

相关文章:

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

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

【Java】Maven的安装与配置

初识Maven Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构 提供了一套标准化的构建流程(编译,测试,打包,发布……) 提供了一套依赖管理机制 标准化的…...

向量和向量如何相乘?

向量与向量相乘主要有两种方式:点积(内积)和叉积(外积)。这两种运算的结果和应用是不同的。 点积(内积): 点积是两个向量的对应元素相乘后再求和的结果,通常用于计算两个…...

计算机组成原理 指令流水线

文章目录 指令流水线指令流水线的概念流水线性能分析流水线的吞吐率流水线的加速比流水线的效率 影响流水线的因素结构相关 (资源冲突)数据相关 (数据冲突)控制相关 (控制冲突) 流水线分类超量流水线 指令流水线 #mermaid-svg-sWaRASMFAvh8sLJk {font-family:"trebuchet m…...

macOS - md5 | md5sum

文章目录 简单使用介绍文档Linux - md5summacOS - md5 大文件传输是否完整,你可以使用 md5 进行校验 linux 上使用 md5sum 命令,在macOS 上 md5 命令是和 md5sum 等效的 简单使用介绍 参考:https://blog.csdn.net/cnds123321/article/detail…...

Tomcat快速入门

1.Tomcat介绍 Apache Tomcat 是由 Apache Software Foundation(ASF)开发的一个开源 Java WEB 应用服务器,如apache处理静态HTML能力突出不同,tomcat处理动态HTML能力相当强大,因此一般项目都是部署apachetomcat&#…...

如何结合antd design pro 5 结合express 上传多个文件

在Ant Design Pro 5(基于React)的前端界面结合Express后端实现上传整个文件夹的文件,实际上是在前端进行多文件选择,并通过POST请求将文件列表发送到后端,然后由后端处理上传。由于浏览器API限制,直接上传整…...

Django随笔

关于Django的admin 1. 在url中把 from django.contrib import admin 重新解开 把path(admin/,admin.site.urls), 解开 2. 注册app,在配置文件中写 django.contrib.admin, 3.输入命令进行数据库迁移 Django国际化 配置文件中(改成中文) LA…...

线程和进程的区别(从JVM角度出发)

进程与线程的区别 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进…...

手把手教你如何快速定位bug,如何编写测试用例,快来观摩......

手把手教你如何快速定位bug,如何编写测试用例,快来观摩......手把手教你如何快速定位bug,如何编写测试用例,快来观摩......作为一名测试人员如果连常见的系统问题都不知道如何分析,频繁将前端人员问题指派给后端人员,后端人员问题指派给前端人员&#xf…...

计算矩阵边缘元素之和(c++)

题目描述 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入格式 第一行分别为矩阵的行数 和列数 &#xff08;m<100&#xff0c;n<100&#xff09;&#xff0c…...

java使用jsch处理软链接判断是否文件夹

前言 这一次主要是碰到一个问题。因为使用jsch去读取文件的时候&#xff0c;有一些文件它是使用软链接制作的一个映射。因为这里面有一个问题。如果它是软链接你就无法判断他到底是文件。还是文件夹&#xff1f;因为他没有提供可以直接读取的方法&#xff0c;用权限信息去判断…...

【2023】java使用WebClient实现chatGPT调用建立web socket连接

&#x1f4bb;目录 一、介绍1、使用技术2、效果 二、代码1、前端代码2、后端代码2.1、maven依赖2.2、model2.2.1、请求接口的格式2.2.2、响应数据对象 2.3、工具类2.3.1、&#x1f534;使用WebClient调用chatgpt方法2.3.2、&#x1f7e0; webSocket连接对话方法 2.4、Controlle…...

力扣【四数之和】

一、题目描述 18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#x…...

IMX6LL|linux设备驱动模型

linux设备驱动模型 为什么需要设备驱动模型 早期内核&#xff08;2.4之前&#xff09;没有统一的设备驱动模型&#xff0c;但照样可以用2.4~2.6期间使用devfs&#xff0c;挂载在/dev目录。 需要在内核驱动中创建设备文件(devfs_register)&#xff0c;命名死板 2.6以后使用sys…...

2023年的技术总结和工作反思

一、回顾2023年 回顾自己的2023年&#xff0c;还是发生了很多的变化。在大学毕业&#xff0c;就来到了芯翼参加工作&#xff0c;在这里也遇到了很多的前辈和小伙伴&#xff0c;收获工作的同时也收获了友情。但是&#xff0c;随着公司发展战略的变化&#xff0c;公司的人员架构…...

Stable Diffusion中的Embeddings

什么是Embeddings&#xff1f; Embeddings是一种数学技术&#xff0c;它允许我们将复杂的数据&#xff08;如文本或图像&#xff09;转换为数值向量。这些向量是高维空间中的点&#xff0c;可以捕捉数据的关键特征和属性。在文本处理中&#xff0c;例如&#xff0c;embeddings可…...

如何快速打开github

作为一个资深码农&#xff0c;怎么能不熟悉全球最大的同性交友社区——github呢&#xff0c;但头疼的是github有时能打开&#xff0c;有时打不开&#xff0c;这是怎么回事&#xff1f; 其实问题出在github.com解析DNS上&#xff0c;并不是需要FQ。下面提供一个方法&#xff0c;…...

【sql/python】表中某列值以列表聚合

需求背景&#xff1a; 有一个表含有两个字段 “ID”,“VALUE” 1,香蕉 1,苹果 2,橘子 3,香蕉 3,苹果 3,橘子 目标要求&#xff1a;将每个ID的VALUE列聚合成一个字符串列表 “ID”,“VALUE” 1,[香蕉,苹果] 2,[橘子] 3,[香蕉,苹果,橘子] 一、SQL使用 LISTAGG函数聚合方式 ---将…...

大模型实战营Day6 作业

基础作业 使用 OpenCompass 评测 InternLM2-Chat-7B 模型在 C-Eval 数据集上的性能 环境配置 conda create --name opencompass --clone/root/share/conda_envs/internlm-base source activate opencompass git clone https://github.com/open-compass/opencompass cd openco…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...