当前位置: 首页 > 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…...

如何快速实现Android Studio中文界面:终极完整汉化指南

如何快速实现Android Studio中文界面&#xff1a;终极完整汉化指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Android…...

Agent Runtime 九个关键设计:状态外化、上下文压缩与多智能体协同

把 Agent 从能跑到可靠&#xff0c;关键不在模型神准&#xff0c;而在状态、上下文和协作工程。 原文链接&#xff1a;AI 小老六 聊 Agent 时&#xff0c;很多讨论容易落到模型能力上&#xff1a;模型会不会推理&#xff0c;代码写得准不准&#xff0c;能不能理解复杂需求。这些…...

AI Agent到底是什么

AI Agent 到底是什么&#xff1f;看完我悟了 今天看了几个产品&#xff0c;跟 AI 聊了聊&#xff0c;突然对 AI Agent 有了个很朴素的理解。AI Agent 不神秘 很多人觉得 AI Agent 是什么高深的东西&#xff0c;只有大厂才能搞。 但我现在的理解就一句话&#xff1a;❝ 「AI Age…...

每天节省25分钟!淘宝淘金币全自动任务脚本终极指南

每天节省25分钟&#xff01;淘宝淘金币全自动任务脚本终极指南 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 你是否厌…...

Ubuntu 22.04 下 Nsight System/Compute 2023.3 保姆级安装与权限配置指南(解决libxcb/perf_event报错)

Ubuntu 22.04 下 Nsight System/Compute 2023.3 保姆级安装与权限配置指南 在深度学习与高性能计算领域&#xff0c;NVIDIA的Nsight工具套件是开发者不可或缺的性能分析利器。本文将手把手带你完成Ubuntu 22.04系统上最新版Nsight System 2023.3和Nsight Compute 2023.2的完整…...

Keil嵌入式开发中malloc返回NULL的解决方案

1. 问题现象与背景解析在嵌入式开发中使用Keil工具链时&#xff0c;不少开发者遇到过这样的困境&#xff1a;明明调用了标准的malloc函数申请内存&#xff0c;却总是收到NULL返回值。这个问题看似简单&#xff0c;却直接导致程序功能异常&#xff0c;特别是在动态内存管理场景下…...

给硬件工程师的芯片FT测试入门:从ATE、Handler到Socket,一次搞懂所有‘治具’

芯片FT测试全流程实战指南&#xff1a;从设备选型到治具配置 第一次走进芯片测试车间时&#xff0c;我被眼前那些闪烁着信号灯的庞大设备和精密治具震撼到了。作为硬件工程师&#xff0c;我们可能更熟悉PCB设计和电路仿真&#xff0c;但当芯片进入量产阶段&#xff0c;如何确保…...

告别模型水土不服:用TENT的熵最小化,5分钟搞定测试时域自适应(附PyTorch代码)

实战TENT&#xff1a;5行代码解决模型部署中的“水土不服”问题 想象一下这样的场景&#xff1a;你花费数月训练的自动驾驶视觉模型在实验室测试中准确率高达98%&#xff0c;但当它遇到真实世界的暴雨天气时&#xff0c;识别率瞬间暴跌至60%。这种"实验室王者&#xff0c;…...

npc_gzip异常处理与调试手册:解决压缩器错误的10个实用技巧

npc_gzip异常处理与调试手册&#xff1a;解决压缩器错误的10个实用技巧 【免费下载链接】npc_gzip Code for Paper: “Low-Resource” Text Classification: A Parameter-Free Classification Method with Compressors 项目地址: https://gitcode.com/gh_mirrors/np/npc_gzip…...

离谱!上海交大一学生私吞 5000 奖金,还用豆包 P 假收据骗队友。网友:学历虽高但人品太低

①5 月 18 日&#xff0c;上海交大一则学生违纪通报冲上热搜&#xff0c;实锤了前几天网上曝光的一名学生侵占团队竞赛奖金、造假欺骗队友的恶劣行为。②在 2025 下半年&#xff0c;樊同学&#xff08;上交大智慧能源学院女生&#xff09;与 K 同学&#xff08;电院男生&#x…...