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

MongoDB高可用和分片集群知识

一、MongoDB实现高可用

1. MongoDB复制集(Replication Set)

  在实际生产中,MongoDB要实现高可用,以免MongoDB单实例挂了,服务不可用。MongoDB实现高可用是以MongoDB复制集的形式实现,和集群部署概念相同,MongoDB复制集有多个MongDB实例,其中包含一个主节点和多个从节点组成。所有对MongoDB的写操作都写入到主节点,从节点通过数据同步从主节点中复制数据(备节点不只是从主节点上同步数据,还可以选择一个离自己最近(心跳延时最小)的节点来复制数据),以保证数据的高可用。

   复制集高可用依赖于两个功能实现: 1.数据被写入后,数据迅速的同步到另一个节点上。2.主节点发生故障后其他节点实例能自动的选取出一个新的替代节点。

在实现MongoDB复制集的同时,也实现了以下几个功能:

  1. 读写分离: 不同类型的压力分别在不同的节点上执行
  2. 异步容灾: 在数据中心故障时候快速切换到异地
  3. 数据分发: 将数据从一个区域复制到另一个区域,减少另一个区域的读延迟

2.复制集模式

  通常复制集由三个节点组成,来保障数据的高可用,其中复制集模式可以分为PSS模型、PSA模式。

2.1 PSS模型(官方推荐)

  PSS为一个primary节点和两个secondary节点,既一主两从。
在这里插入图片描述

  一旦主节点出现故障,从节点会自动选举出一个新的主节点。

2.2 PSA模型

  PSA为一个primary节点和一个secondary节点以及一Arbiter(仲裁)节点,既一主一从一仲裁。

在这里插入图片描述

Arbiter节点不存储数据副本,也不提供业务的读写操作。Arbiter节点发生故障不影响业务,仅影响选举投票

3.复制集高可用依据

3.1 复制集选举方面

  选举的过程中会进行投票选举,选举中为避免平票的情况,MongoDB的实例节点数要为奇数,主要措施有两个:

  1. 为选举定时器增加少量的随机时间偏差,这样避免各个节点在同一时刻发起选举,提高成功率。
    2 .使用仲裁者角色,该角色不做数据复制,也不承担读写业务,仅仅用来投票。
3.2 自动故障转移

  MongoDB节点之间会通过心跳机制进行通信,复制集建立好之后,就开启定时器,实现心跳检测功能,选举心跳检测失败后,不会立即触发重新选举,直到electionTimeout被触发。
  electionTimeout触发选举需要满足的条件有: (1)当前节点是备节点 (2)当前节点具备选举条件 (3)在心跳检测期间主节点还没能进行通信

3.3复制集同步数据
3.3.1 同步数据原理

  主节点和备节点之间是通过opLog进行同步数据的,opLog是一个固定集合的结构,其中主节点向opLog写入数据,备节点在opLog中读取数据,以达到同步。
在这里插入图片描述
其中opLog保证节点有序,备节点通过轮询的方式进行拉取数据。每个备节点都维护了一个offset,也就是从主节点拉取的最后一条日志的optime,在执行同步时就通过这个optime向主节点的oplog集合发起查询。

每一条oplog记录都描述了一次数据的原子性变更,对于oplog来说,必须保证是幂等性的。

3.3.2 复制延迟以及解决办法

 &esmp;复制延迟情况的产生,是因为主节点的写入速度太快了,备节点从opLog上拉取不过来,从而导致复制延迟。 复制延迟的解决方案有以下措施:

  1. 降低主节点的写入速度
  2. 提高opLog的容量大小,并保持监视
  3. 避免字段使用太大的数组

二、MongoDB分片集群

1.分片

  在大数据发展的时代,数据存储会在多个不同的机器上,要进行分布式的存储,进行分片是一个好的措施,将数据按某种方式进行切分存储在不同的机器上。

2.分片集群架构

  对MongoDB进行分片集群部署,有利于数据存放的横向拓展。分片集群架构除分片节点外,还有配置节点、路由节点等。

在这里插入图片描述

数据分片: 分片用于存储真正的数据,并提供最终的数据读写访问,通常是复制集的形式存在。

配置节点: 配置节点不用于存储数据,而是保存了整个分片集群中的元数据,其中包含各个集合的分片策略,以及分片的路由表等

查询路由(mongos):mongos是分片集群的访问入口,其本身并不持久化数据。

3.分片策略

  分片策略指的是将一个大的数据集合通过何种策略进行分配到多个分片节点上。
在这里插入图片描述
集群分片涉及到chunk,chunk指的是一个范围区间的数据,集合在操作分片集合时,会根据分片键找到对应的chunk,并向chunk所在分片发起请求。
在这里插入图片描述

4.分片算法

  分片算法有范围分片和哈希分片两种。

  1. 范围分片: 按照一定的范围进行分片
    在这里插入图片描述
  2. hash分片:会生成一个哈希值,然后根据哈希值对范围分片的chunk进行切分。
    在这里插入图片描述
    hash算法使得数据分布更加均匀,保证了随机性,但在范围查询时,哈希分片需要对所有的chuck进行检索,效率低。

5. 数据均衡

5.1 实现均衡的措施

  想要实现数据在不同的分片中数量是均衡的,实现的方式有两种。

  1. 手动均衡(通过干预的方式进行均衡)

  2. 自动均衡: 以后台的方式监控chunk,chunk不均衡时进行搬迁以达到平衡。

5.2 chunk分裂

一个chunk的大小固定,一旦数据量超过chunk大小,chunk就会自动分裂,分类两个大小相同的chunk。

在这里插入图片描述

chunk分裂是基于分片键进行的,如果分片键的基数太小,则可能因为无法分裂而会出现jumbo chunk(超大块)的问题。jumbo chunk对水平扩展有负面作用,该情况不利于数据的均衡,业务上应尽可能避免。

相关文章:

MongoDB高可用和分片集群知识

一、MongoDB实现高可用 1. MongoDB复制集(Replication Set) 在实际生产中,MongoDB要实现高可用,以免MongoDB单实例挂了,服务不可用。MongoDB实现高可用是以MongoDB复制集的形式实现,和集群部署概念相同,MongoDB复制集…...

【Python日志功能】一.日志基础与基本配置

文章目录 相关链接第一篇:日志基础与基本配置1 日志的概念与用途2 Python logging 模块介绍3 日志级别4 配置日志格式和输出位置4.1 配置日志格式4.2 配置输出位置 5 实验:基本日志配置和输出实验1:基本日志配置实验2:使用配置文件…...

深圳铨顺宏科技展邀您体验前沿人工智能技术

我们诚挚地邀请您参加即将举行的展会,探索RFID技术在资产与人员管理中的广泛应用。这些展会将为您提供一个深入了解前沿技术和创新解决方案的机会。 东莞台湾名品博览会(东莞台博会)展会时间:9月5日至8日。此次展会展示了来自台湾…...

Lombok:Java开发者的代码简化神器【后端 17】

Lombok:Java开发者的代码简化神器 在Java开发中,我们经常需要编写大量的样板代码,如getter、setter、equals、hashCode、toString等方法。这些代码虽然基础且必要,但往往占据了大量开发时间,且容易在属性变更时引发错误…...

[linux]GCC G++官方源码国内下载地址汇总

【GCC介绍】 GCC(GNU Compiler Collection,GNU编译器套件)是由GNU项目开发的一套编程语言编译器,也是GNU计划的关键部分。它最初作为GNU C Compiler(GNU C语言编译器)出现,但随着时间的推移&…...

部署opengauss5.0.3,细节满满

部署opengauss5.0.3 1.关闭安全服务 修改/etc/selinux/config文件中的“SELINUX”值为“disabled”。临时关闭selinux setenforce 0 查看selinux状态 getenforce2.host配置 [rootcentos79 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 local…...

面试题总结(四) -- STL与算法篇

面试题总结(四) – STL与算法篇 文章目录 面试题总结(四) -- STL与算法篇<1> 请列举 C STL 中常用的容器&#xff08;如 vector、list、map 等&#xff09;及其特点。<2> 如何在 C 中使用 STL 算法&#xff08;如排序、查找等&#xff09;&#xff1f;<3> 解…...

HashSet及其实现原理

目录 一、Set二、HashSet三、HashSet的实现原理四、HashSet的线程安全与顺序1、线程安全2、有序性 一、Set Set 接口是 java.util 包下的一个集合接口&#xff0c;它继承自 Collection 接口。Set 接口定义了一个不允许包含重复元素的集合。Set 接口的实现类主要有 HashSet、Lin…...

反序列化漏洞练习1

根据代码可以看出来sis类只是接收了参数cmd&#xff0c;下边是通过get获得cmd的值&#xff0c;所以可以在序列化过程中直接为cmd赋值。 根据源码编写序列化代码 <?php class sis{public $cmdsystem("whoami");?>;public function __wakeup(){eval($this-&g…...

树莓派Pico2(RP2350)开发环境搭建

树莓派Pico2(RP2350)开发环境搭建 文章目录 树莓派Pico2(RP2350)开发环境搭建1、RP2350介绍2、开发环境搭建3、工程编译4、固件下载Raspberry Pi再次通过推出RP2350 MCU突破了微控制器设计的界限。这款微控制器是之前RP2040的重大升级,带来了更强大的性能、高级安全功能,…...

vue 路由中使用keepAlive在这个组件中使用onActivated

onMounted: 在组件挂载时触发一次。onActivated: 当 keep-alive 组件从缓存中被激活时触发。如果你将当前组件包裹在 keep-alive 中&#xff0c;激活时会调用此钩子。onDeactivated: 当 keep-alive 组件被缓存时触发。 注意事项 onActivated 只在组件从 keep-alive 缓存中恢复…...

医学数据分析实训 项目一 医学数据采集

项目一 医学数据采集 一、实践目的 了解医学数据的特点&#xff1b;熟悉常见的医学公共数据库的使用方法&#xff1b;掌握获取医学数据的方法&#xff1b; 二、实践平台 操作系统&#xff1a;Windows10 及以上Python 版本&#xff1a;3.8.x 及以上PyCharm 或 Anoconda 集成…...

《Oracle(一)- 基础》

文章目录 一、Oracle简介&#xff08;一&#xff09;什么是ORACLE&#xff08;二&#xff09;ORACLE 体系结构1.数据库2.实例3.数据文件&#xff08;dbf&#xff09;4.表空间5.用户 二、ORACLE 安装与配置&#xff08;一&#xff09;VMware 挂载 windows server 2003&#xff0…...

Unity Resource System 优化笔记

Unity Resources System 定义 Resources System允许开发者在项目中的Resources文件夹下存放一个或多个资源文件夹&#xff0c;并且可以在Unity运行时通过Unity提供的API对资源和对象进行加载和卸载。 如果Resources中的文件结构复杂&#xff0c;内容多&#xff0c;会给应用常…...

Flutter之SystemChrome全局设置

一、简介 SystemChrome作为一个全局属性&#xff0c;很像 Android 的 Application&#xff0c;功能很强大。 二、使用详解 2.1 setPreferredOrientations 设置屏幕方向 在我们日常应用中可能会需要设置横竖屏或锁定单方向屏幕等不同要求&#xff0c;通过 setPreferredOrien…...

Windows11 WSL2的ubuntu 22.04中拉取镜像报错

问题描述 在windows11 WSL2的ubuntu 22.04中拉取镜像报错。错误为&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting header…...

【Linux】多线程:线程同步、条件变量

目录 一、同步的概念 为什么需要同步呢&#xff1f; 二、条件变量 条件变量的相关概念 1、条件变量的初始化&#xff1a;静态初始化、动态初始化 2、条件变量的等待&#xff1a;pthread_cond_wait函数 工作原理及流程【重要&#xff01;】 关键点总结 3、条件变量的激…...

【Android Studio】使用雷电模拟器调试

文章目录 进入开发者模式使雷电模拟器adb连接PC测试 进入开发者模式 多次点击版本号 -开区USB调试 使雷电模拟器adb连接PC 写cmd脚本 雷电模拟器端口为5555 &#xff0c;脚本内容如下&#xff1a; adb.exe connect 127.0.0.1:5555双击bat脚本文件 测试...

你必须知道的C语言问题(9)

问&#xff1a;如下代码&#xff0c;两个结构体类型成员变量相同&#xff0c;只是成员顺序不同&#xff0c;为什么大小不同&#xff1f; #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h>typedef struct _test1{uint…...

如何通过网络找到自己想要的LabVIEW知识?

学习LabVIEW或其他编程技术时&#xff0c;无法依赖某一篇文章解决所有问题。重要的是通过多种途径获取灵感&#xff0c;并学会归纳总结&#xff0c;从而逐渐形成系统性的理解。这种持续学习和总结的过程是技术提升的基础。通过网络找到所需的LabVIEW知识可以通过以下几个步骤进…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...