MongoDB高可用和分片集群知识

news2024/9/23 11:22:05

一、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对水平扩展有负面作用,该情况不利于数据的均衡,业务上应尽可能避免。

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

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

相关文章

火柴人跑酷

运行图片: 这里面有三个boss,和各种元素属性列举一下: 元素作用 火 运用火元素将攻击抵消 水 和火元素一致 磁 自动吸取经验…

vscode设置vue标签不换行

1、打开 文件 --> 首选项 --> 设置 2、在设置里搜索 vetur.format,项较多,向下滑动找到 在 setting.json 中编辑 按钮 点进去 3、修改配置文件vetur.format.defaultFormatterOptions {"files.autoSave": "afterDelay","…

全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback 摘要: 回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法。这种模式在 Python 中广泛应用于事件处理、异步编程、函数式编程等场景…

cadence SPB17.4 - ORCAD - ERROR(ORCAP-1616): Reference is invalid for this part

文章目录 cadence SPB17.4 - ORCAD - ERROR(ORCAP-1616): Reference is invalid for this part概述笔记END cadence SPB17.4 - ORCAD - ERROR(ORCAP-1616): Reference is invalid for this part 概述 在抄GDLink on Board的原理图。 抄完之后进行原理图DRC, 有个元件报错。 …

C语言代码练习(第十八天)

今日练习: 48、猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时&…

digits Social Login插件 google OAuth 2.0登录 400 redirect_uri_mismatch错误解决

以下是Social Login插件google登录配置: 直接使用这个URI 会在登录时提示错误:400 redirect_uri_mismatch,此时需要点击错误详情把这个重定向URI设置到google中即可

Java:类和对象(2)

一 对象的构建和初始化 1.对象构建 (Object Construction) Student student1new Student("zhangsan",12,"123456"); Student student2new Student("lisi",10,"15236"); 2. 构造函数(Constructor) 构造函数的…

Android binder 机制驱动核心源码详解_binder_thread_read

binder 驱动中做的工作可以总结为以下几步: 准备数据,根据命令分发给具体的方法去处理找到目标进程的相关信息将数据一次拷贝到目标进程所映射的物理内存块记录待处理的任务,唤醒目标线程调用线程进入休眠目标进程直接拿到数据进行处理&…

maven安装依赖

这里以安装tomcat依赖为例 1, 访问maven公共仓库 2,搜索tomcat 3, 右侧点击Plugin 选择&#xff1a;Apache Tomcat Maven Plugin :: Tomcat 7.x 选择版本&#xff0c;这里我选择2.2 选择maven&#xff0c;将<dependency>中的内容copy到pom.xml中的<build>里面 …

webctf

熟悉robots.txt协议&#xff0c;可能存在一些敏感信息(sql在登录时候的万能密码a’ or true#)熟悉phps文件&#xff0c;phps文件就是 php 的源代码文件&#xff0c;通常用于提供给用户&#xff08;访问者&#xff09;查看 php 代码&#xff0c;因为用户无法直接通过 Web 浏览器…

力扣279-完全平方数(Java详细题解)

题目链接&#xff1a;279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完背包&#xff0c;所以现在的题解都是以背包问题为基础再来写的。 如果大家不懂背包问题的话&…

测试阶段例题

答案&#xff1a;D 测试阶段划分 单元测试 模块测试&#xff0c;模块功能&#xff0c;性能&#xff0c;接口等 集成测试 模块间的接口 系统测试 真实环境下&#xff0c;验证完整的软件配置能否和系统正确连接 确认测试 验证软件与需求的一致性。内部确认测试&#xff0…

k8s独立组件ingress,七层转发

一、K8S的Service 1、Service的作用 Service的作用体现在两个方面&#xff1a; 1、集群内部&#xff1a;不断跟踪pod的变化&#xff0c;更新endpoints中的pod对象&#xff0c;基于pod的IP地址不断变化的一种服务发现机制&#xff0c;也可以实现负载均衡&#xff0c;四层代理…

vue element时间选择不能超过今天 时间选中长度不能超过7天

背景&#xff1a; 使用elenmet plus 组件实现时间选择&#xff1b;且日期时间选择不能超过今天&#xff1b;连续选中时间的长度范围不能超过7天 效果展示&#xff1a; 实现思路&#xff1a; 一、使用element组件自带的属性和方法&#xff1b; :disabled-date"disabledDate…

misc音频隐写

一、MP3隐写 &#xff08;1&#xff09;题解&#xff1a;下载附件之后是一个mp3的音频文件&#xff1b;并且题目提示keysyclovergeek;所以直接使用MP3stego对音频文件进行解密&#xff1b;mp3stego工具是音频数据分析与隐写工具 &#xff08;2)mp3stego工具的使用&#xff1a;…

QT 绘制简易时钟

原文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->startTimer(1000); }Widget::~Widget() {delete ui; }//时钟底座 void Widget::paintEvent(Q…

景联文科技:专业扫地机器人数据采集标注服务

景联文科技作为一家专业AI数据采集标注公司&#xff0c;提供高质量数据支持&#xff0c;致力于帮助扫地机器人制造商和研发机构提升产品的智能水平和用户体验。 扫地机器人需要通过大量的环境数据来训练其导航和清洁算法。高质量标注数据是确保机器人在各种环境下高效工作的关键…

二百六十三、Java——IDEA项目打成jar包,然后在Linux中运行

一、目的 在用Java对原Kafka的JSON字段解析成一条条数据&#xff0c;然后写入另一个Kafka中&#xff0c;代码写完后打成jar包&#xff0c;放在Linux中&#xff0c;直接用海豚调度运行 二、Java利用fastjson解析复杂嵌套json字符串 这一块主要是参考了这个文档&#xff0c;然…

vite+vue3快速构建项目+router、vuex、scss安装

安装 Vite npm install -g create-vite-app创建vue3项目 npm init vitelatestnpm i安装依赖 安装veux、router npm install vue-router vuex新建router/index.js&#xff08;自己创建home、login对应页面文件&#xff09; import { createRouter, createWebHistory } from…

针对SVM算法初步研究

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;心态决定高度&#xff0c;细节决定成败…