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: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)
	}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟化网络

vm1和vm2通过虚拟交换机与主机进行交换, 虚拟交换机:(通过软件虚拟出来的交换机) 1、LinuxBridge虚拟交换机 2、OVS(Open Virtual Switch)虚拟交换机 虚拟机的传输是通过虚拟交换机,然后连到…

Servlet 预览pdf

一、背景 上篇文章介绍了图片的预览,这篇我们介绍下 pdf 文件的预览,pdf 预览在实际开发中用的还是比较多的,比如很多文件协议、合同都是用pdf 格式,协议预览就需要我们做 pdf 预览了。 二、实操 其实在上篇文章最后已经说了常用…

在Android原生项目中 创建 Flutter模块

前言 应用场景:在已有的Android原生项目中,引入Flutter模块,摸索了两天,终于给整出来了; 如果是新项目,最好直接创建Flutter项目,然后在Fluter的 android / ios目录中,写原生代码&…

常见的设计模式(模板与方法,观察者模式,策略模式)

前言 随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数…

Spark SQL函数定义

目录 窗口函数 SQL函数分类 Spark原生自定义UDF函数 Pandas的UDF函数 Apache Arrow框架基本介绍 基于Arrow完成Pandas DataFrame和Spark DataFrame互转 基于Pandas完成UDF函数 自定义UDF函数 自定义UDAF函数 窗口函数 分析函数 over(partition by xxx order by xxx [as…

MathType2024下载安装系统要求及新版本功能介绍

MathType 7应用介绍 MathType可适用于800软件应用程序和网站,支持在任何文字处理软件、演示程序、页面程序、HTML编辑工具及其它类型的软件,用来建立公式。 应用范围:期刊杂志、科研机构、教育教学、工程学、统计学、论文、报告写作、word文…

新数智空间:阿里云边缘云持续保持中国公有云市场第一

全球领先的 IT 市场研究和咨询公司 IDC 发布 《中国边缘云市场解读(2023H1)》报告 中国边缘公有云服务市场 阿里云持续第一 稳居市场第一,“边缘”逆势生长 近日,全球领先的 IT 市场研究和咨询公司 IDC 最新发布《中国边缘云市…

20240117-【UNITY 学习】增加墙跑功能和跳墙功能

替换脚本PlayerCam_01.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening;public class PlayerCam_02 : MonoBehaviour {// 视觉灵敏度参数public float sensX 400;public float sensY 400;// 视角垂直旋转角度限制publ…

IDEA怎么用Devtools热部署

IDEA怎么用Devtools热部署 大家知道在项目开发过程中,有时候会改动代码逻辑或者修改数据结构,为了能使改动的代码生效,往往需要重启应用查看改变效果,这样会相当耗费时间。 重启应用其实就是重新编译生成新的Class文件&#xff0…

axios的原理及源码解析

面试官:你了解axios的原理吗?有看过它的源码吗? 一、axios的使用 关于axios的基本使用,上篇文章已经有所涉及,这里再稍微回顾下: 发送请求 import axios from axios;axios(config) // 直接传入配置 axio…

C语言数据结构之线性表-顺序表篇

星光不负赶路人 江河眷顾奋楫者 🎥烟雨长虹,孤鹜齐飞的个人主页 🔥个人专栏 期待小伙伴们的支持与关注!!! 线性表的简介# 线性表(linearlist):是n个具有相同特性的数据元…

Vue3前端开发,computed计算属性的基础练习

Vue3前端开发,computed计算属性的基础练习! 在新版里面,和传统的vue2一样,计算属性,都是对一些数据运算进行了封装操作。返回结果是一个实时监控的效果。区别在于,写法不同。效果是一样。 下面给大家展示…

【萤火虫系列教程】3/5-Adobe Firefly 创意填充

003-Adobe Firefly 创意填充 创意填充 登录账号后,在主页点击创意填充的【生成】按钮,进入到创意填充页面 我们可以上传自己的图像 一键抠图 点击【背景】就可以把主图抠出来 点击【反转】就可以把背景抠出来 点击【清除】就可以恢复到图片原来…

一文详解Linux文本处理三剑客

1.正则表达式 目录 1.正则表达式 1.什么是正则表达式 ? 2.正则表达式的使用场景 3.正则表达式字符表示 4.它们之间的区别 2.grep命令 作用: 语法: 说明: 选项:options 重点 实例 3.后面的下次再更新。 …

【征服redis7】谈谈Redis的RDB持久化方式

从现在开始,我们来探讨redis的一个非常重要的问题——集群,要讨论集群,我们需要先理解redis持久化数据的方法,因为集群本质上就是将一个集群的数据同步到其他机器上。 Redis 6的持久化机制主要有两种:RDB(…

【CUDA】GPU 算力与 CUDA 版本对应关系

1. 查询 GPU 算力(Compute Capability) 官方算力表:https://developer.nvidia.com/cuda-gpus#compute 2. GPU 算力与 CUDA 版本对应关系 2.1. 信息来源 1 https://docs.nvidia.com/datacenter/tesla/drivers/index.html#cuda-arch-matri…

Kafka-消费者-KafkaConsumer分析-SubscriptionState

KafkaConsumer从Kafka拉取消息时发送的请求是FetchRequest(具体格式后面介绍),在其中需要指定消费者希望拉取的起始消息的offset。 为了消费者快速获取这个值,KafkaConsumer使用SubscriptionState来追踪TopicPartition与offset对应关系。 图展示了SubscriptionSta…

el-dialog嵌套使用,只显示遮罩层的问题

直接上解决方法 <!-- 错误写法 --><el-dialog><el-dialog></el-dialog></el-dialog><!-- 正确写法 --><el-dialog></el-dialog><el-dialog></el-dialog>我是不建议嵌套使用的&#xff0c;平级也能调用&#xff0c…

LaWGPT安装和使用教程的复现版本【细节满满】

文章目录 前言一、下载和部署1.1 下载1.2 环境安装1.3 模型推理 总结 前言 LaWGPT 是一系列基于中文法律知识的开源大语言模型。该系列模型在通用中文基座模型&#xff08;如 Chinese-LLaMA、ChatGLM等&#xff09;的基础上扩充法律领域专有词表、大规模中文法律语料预训练&am…

Qt 状态机框架:The State Machine Framework (二)

传送门: Qt 状态机框架:The State Machine Framework (一) Qt 状态机框架:The State Machine Framework (二) 1、利用并行态避免态的组合爆炸 假设您想在单个状态机中对汽车的一组互斥属性进行建模。假设我们感兴趣的属性是干净与肮脏&#xff0c;以及移动与不移动。需要四个…