mongodb集群工作原理学习

news2024/9/22 4:11:44

mongodb集群

MongoDB集群有好几种方式:,主从模式,副本集模式和分片的模式
其中主从模式基本不再使用,大多是后面两种

副本集模式

副本集模式主要是用于实现服务的高可用性,类型Redis的哨兵模式.
它主要是的特点:
创建集群后会有主节点(primary)和从节点(secondary). 但从节点可以进行相应设置具有不同的功能.
主有有两方面功能:

  1. 主节点写入数据后从节点会进行数据同步/
  2. 在主节点故障时会发生新的选举进行替换.

同时实现了以下功能:
读写分离,主节点主要负责写操作,secondary负责读请求.
数据备份,在secondary上会有主节点对应的全量数据备份.

典型架构图:
在这里插入图片描述

其中有几种特殊的secondary节点类型:

  1. priority 0 将节点设置为这种类型,则是该节点不能升级为主节点也就是优先级最低/,用于多数据中心的情况.
  2. arbiter 该节点只参与投票,不能被选为主节点,且不会和主节点进行数据同步,主要是为了参与选举过程保证选票数是n/2+1
  3. Vote0 Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员(Vote0)的vote属性必须设置为0,即不参与投票。
  4. Hidden Hidden节点不能被选为主(Priority为0),并且对Driver不可见。
  5. Delayed 该节点必须是hidden节点,并且他的数据要落后于primary一段时间,时间可以设置,主要是作为数据恢复备用。

primary与Scondary之间的数据同步:
两个节点之间的数据同步采用的是通过oplog方式进行,当然在集群初始化或者新加入的结点时,采用的全量复制方式。
在全量复制成功之后,当再有新数据写入后。
primary会向特殊的local.oplog.rs集合中写入oplog,就是执行的操作记录.然后secondary就会从主节点上读取到oplog,然后执行更新.
因oplog的数据会不断增加,local.oplog.rs被设置成为一个capped集合,当容量达到配置上限时,会将最旧的数据删除掉。另外考虑到oplog在Secondary上可能重复应用,oplog必须具有幂等性,即重复应用也会得到相同的结果。
Secondary初次同步数据时,会先进行init sync,从Primary(或其他数据更新的Secondary)同步全量数据,然后不断通过tailable cursor从Primary的local.oplog.rs集合里查询最新的oplog并应用到自身。

t sync过程包含如下步骤

T1时间,从Primary同步所有数据库的数据(local除外),通过listDatabases + listCollections + cloneCollection敏命令组合完成,假设T2时间完成所有操作。
从Primary应用[T1-T2]时间段内的所有oplog,可能部分操作已经包含在步骤1,但由于oplog的幂等性,可重复应用。
根据Primary各集合的index设置,在Secondary上为相应集合创建index。(每个集合_id的index已在步骤1中完成)。
oplog集合的大小应根据DB规模及应用写入需求合理配置,配置得太大,会造成存储空间的浪费;配置得太小,可能造成Secondary的init sync一直无法成功。比如在步骤1里由于DB数据太多、并且oplog配置太小,导致oplog不足以存储[T1, T2]时间内的所有oplog,这就Secondary无法从Primary上同步完整的数据集。

Primary选举:
复制集被reconfig
Secondary节点检测到Primary宕机时,会触发新Primary的选举
当有Primary节点主动stepDown(主动降级为Secondary)时,也会触发新的Primary选举.
复制集成员间默认每2s会发送一次心跳信息,如果10s未收到某个节点的心跳,则认为该节点已宕机;如果宕机的节点为Primary,Secondary(前提是可被选为Primary)会发起新的Primary选举。
节点优先级:

  1. 每个节点都倾向于投票给优先级最高的节点
  2. 优先级为0的节点不会主动发起Primary选举
  3. 当Primary发现有优先级更高Secondary,并且该Secondary的数据落后在10s内,则Primary会主动降级,让优先级更高的Secondary有成为Primary的机会。
    只有更大多数投票节点间保持网络连通,才有机会被选Primary;如果Primary与大多数的节点断开连接,Primary会主动降级为Secondary。当发生网络分区时,可能在短时间内出现多个Primary,故Driver在写入时,最好设置『大多数成功』的策略,这样即使出现多个Primary,也只有一个Primary能成功写入大多数。

复制集的读写设置

默认情况下,复制集的所有请求都发到primary中,driver可以通过设置read perference来讲读请求路由到其他节点.

primary: 默认规则,所有读请求发到Primary
primaryPreferred: Primary优先,如果Primary不可达,请求Secondary
secondary: 所有的读请求都发到secondary
secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary
nearst: 所有读请求发送到最近的可达节点上,通过ping探测最近节点.

Write Concern:
默认情况下,Primary完成写操作即返回,Driver可通过设置[Write Concern(https://docs.mongodb.org/manual/core/write-concern/)来设置写成功的规则。

如下的write concern规则设置写必须在大多数节点上成功,超时时间为5s。

db.products.insert(
{ item: “envelopes”, qty : 100, type: “Clasp” },
{ writeConcern: { w: majority, wtimeout: 5000 } }
)
上面的设置方式是针对单个请求的,也可以修改副本集默认的write concern,这样就不用每个请求单独设置。

cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: “majority”, wtimeout: 5000 }
rs.reconfig(cfg)

异常处理:
当主节点宕机,如果有数据未同步到secondary上,当之前的primary重新加入集群中的时候,如果新的primary上已经发生了写操作,那么旧的primary就要发生回滚操作,以保证数据集与新的primary的一致.
旧Primary将回滚的数据写到单独的rollback目录下,数据库管理员可根据需要使用mongorestore进行恢复。

未完待续~

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

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

相关文章

1765_Perl实现fileread功能

全部学习汇总: GreyZhang/perl_basic: some perl basic learning notes. (github.com) fileread是MATLAB中的一个函数,可以实现对一个文本文件的全文读取。读取后的内容返回给一个字符串量。在Python中也有类似的功能,不过MATLAB中的这个更能…

快速创建ES集群

win10 中docker 设置 快速创建集群 访问 官网 elasticsearch/docs/reference/setup/install/docker at main elastic/elasticsearch GitHub 负责上面2个文件,并修改,修改如下 .env文件 # Password for the elastic user (at least 6 characters) …

【私有云】网络虚拟化

前言 大家好,我是秋意零。 之前一直对 OpenStack 网络很陌生与神奇啊,不知道它是如何实现的,网络结构是怎样的。不过,今天介绍的是网络虚拟化,它在 OpenStack 中及云计算中是非常重要的概念,是理解 OpenS…

springboot整合websocket遇到的小问题

今天尝试了通过springboot整合websocket来初步学习使用websocket,然后发现启动的时候报错了,发这篇文章分享一下。 springboot整合websocket的步骤很简单: 第一步:创建一个springboot项目,在这里命名为websocket 在I…

day16 移除元素

题目描述 解题思路: 1.快慢指针,移除数组元素只能是下标操作;fast往前,不等于value的时候,赋给slow; 2.slow;返回的长度直接返回slow; int removeElement(int* nums, int numsSize, …

Rethinking the Role of Pre-ranking in Large-scale E-Commerce Searching system

来源: KDD’2023Taobao Search 文章目录 ASHASMOL训练样本训练目标蒸馏精排 总结 反思粗排在大规模电商搜索系统中的角色。 由于巨大的数据量以及对系统实时反馈的要求,一个典型的工业排序系统通常由这些模块组成:召回(matching&…

VTR编译问题

机器环境 vmware 16.0; ubuntu22.04.02; 问题描述 一、在build过程中会出现一些警告,但没有停止; 二、访问 **raw.githubsercontent.com/…/…**相关网站被拒绝,如下图: 之前在 /etc/hosts 仅仅是添加了raw.github…

JS数组解构赋值变量存在依赖关系

题目随便起的, 在刷力扣 41.缺失的第一个正数 这个题的时候,出现了解构赋值的问题, 对于[a,b] [1,2]和[b,a][2,1]按理说都是行的通的,和位置没有关系,本质上都是进行交换 可是当我在题目中 使用[nums[nums[i]-1], nu…

SpringMVC的高频面试题

2023最新版(持续更新) 一、SpringMVC的高频面试题1. SpringMVC的执行流程2. SpringMVC常见的注解有哪些? 一、SpringMVC的高频面试题 1. SpringMVC的执行流程 前置知识 视图阶段(JSP): 涉及到的重要组件:…

KubeSphere 社区双周报 | KubeSphere 多项更新 | 2023.06.23-07.06

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.06.23-2023.…

管道设计专业版:Pipedata-Pro Crack

Pipedata-Pro 提高了管道设计的效率并减轻了查找管道信息的负担。它可以直观、轻松地检索最新的管道和设计数据。尺寸和重量单位可以设置为公制或美制单位。 Pipedata-Pro 于 1996 年由 Zeataline Projects 推出,现已遍布全球,Pipedata-Pro 管道表的映射…

怎么判断两个文档节点时候相同?判断两个DOM节点时候相等、相同的4种方法

方法1: document.querySelector(html) document.querySelector(html) //true 方法2:compareDocumentPosition document.querySelector(html).compareDocumentPosition(document.querySelector(html)) //0 返回0就代表相同 方法3:isEqualNode …

编译运行ContactDiscoveryService-Icelake

下载 git clone https://codeup.aliyun.com/6306306f95064d67d44656e5/lxr1907/ContactDiscoveryService-Icelake.git或github地址 git clone https://github.com/signalapp/ContactDiscoveryService-Icelake按照Readme安装 Building git submodule init git submodule update …

每次装完 homebrew,ohmyzsh 就会报错:Insecure completion-dependent directories detected:

参考:https://zhuanlan.zhihu.com/p/313037188 这是因为在big sur安装homebrew后,会在/usr/local/share/生成一个zsh文件夹,里面包含了 因此,zsh文件默认设置的权限是775,也就是group user有writer的权利,zsh认为这是…

python读写excel利器:xlwings从入门到精通

python读写excel利器:xlwings 从入门到精通 目录 安装和使用 基础操作 操作工作簿操作工作表读取单元格写入(单元格赋值)range的操作(range常用的api) 写入一行或一列Excel数据(函数式)使用range(\A1\).api.AddComment(\comments…

本质矩阵(Essential Matrix)E进行分解的过程

分解本质矩阵的过程遵循以下步骤: 使用奇异值分解(SVD)计算本质矩阵E的分解。SVD分解是一种将矩阵分解为三个矩阵的乘积的方法,它的形式为 E UΣV^T,其中U和V是正交矩阵,Σ是对角矩阵。此步骤的结果存储在…

Edge浏览器无法展示Stable Diffusion Control Net插件

Edge浏览器无法展示Stable Diffusion Control Net插件 最近在学习Stable Diffusion,需要使用到Control Net插件,结果通过各种方式安装成功插件后,浏览器页面没有展示ControlNet相关页面,最终换到Chorme浏览器后正常,猜…

【Python】绘图_pandas(1)

# -*- coding: utf-8 -*- #汉字处理 import matplotlib.pyplot as plt import numpy as np from numpy.random import randn import pandas as pd #import DataFrame from matplotlib.font_manager import FontPropertiesfont FontProperties(fnamer"c:\windows\fonts\si…

基于51单片机的电子密码锁设计

功能:本实例是基于51单片机的电子密码锁,主要硬件由51单片机最小系统,LCD1602液晶屏电路,继电器控制电路,AT24C02存储电路,LED指示灯电路,矩阵按键电路构成。 1.系统采用LCD1602液晶屏作为显示屏…

【软件设计原则】系统设计面试基础:CAP 与 PACELC

什么是 CAP 定理以及 PACELC 如何扩展它? 在分布式系统中,可能会发生不同类型的故障,例如,服务器可能会崩溃或永久故障,磁盘可能会损坏导致数据丢失,或者网络连接可能会丢失,导致系统的一部分无…