MongoDB~高可用集群介绍:复制集群(副本集)、分片集群

背景

MongoDB 的集群主要包括副本集(Replica Set)和分片集群(Sharded Cluster)两种类型。

    1. 副本集

组成:通常由一个主节点(Primary)和多个从节点(Secondary)构成。

功能:

  1. 主节点负责处理读写操作。
  2. 从节点从主节点复制数据以保持同步,和读操作。
  3. 当主节点故障时,会自动进行选举,从从节点中选出新的主节点,保障系统的高可用性。

优点:

  1. 提供数据冗余,防止数据丢失。
  2. 实现读写分离,减轻主节点的读压力。
    1. 分片集群

组成:

  1. 包含配置服务器(Config Server)、路由服务器(mongos)和多个分片(Shard)。
  2. 每个分片可以是一个副本集。

功能:

  1. 配置服务器存储集群的元数据,如分片的分布和配置信息。
  2. 路由服务器接收客户端的请求,并根据数据分布将请求路由到正确的分片。
  3. 分片负责存储实际的数据。

优点:

  1. 能够处理大规模的数据和高并发的读写请求。
  2. 通过将数据分布到多个分片上,实现水平扩展。
  3. 在实际应用中,根据数据量、读写负载、可用性要求等因素选择适合的集群类型,并进行合理的配置和优化,以确保 MongoDB 集群的性能和稳定性。

复制集群

MongoDB 的复制集群又称为副本集群,是一组维护相同数据集合的 mongod 进程。客户端连接到整个 Mongodb 复制集群,主节点机负责整个复制集群的写,从节点可以进行读操作,但默认还是主节点负责整个复制集群的读。主节点发生故障时,自动从从节点中选举出一个新的主节点,确保集群的正常使用,这对于客户端来说是无感知的。

通常来说,一个复制集群包含 1 个主节点(Primary),多个从节点(Secondary)以及1个或 N 个仲裁节点(Arbiter,建议是奇数个)。

  • 主节点:整个集群的写操作入口,接收所有的写操作,并将集合所有的变化记录到操作日志中,即 oplog。主节点挂掉之后会自动选出新的主节点。
  • 从节点:从主节点同步数据,在主节点挂掉之后选举新节点。不过,从节点可以配置成 0 优先级,阻止它在选举中成为主节点。
  • 仲裁节点:这个是为了节约资源或者多机房容灾用,只负责主节点选举时投票不存数据,保证能有节点获得多数赞成票。
    在这里插入图片描述

主节点与备节点之间是通过 oplog(操作日志) 来同步数据的。

oplog 是 local 库下的一个特殊的 上限集合(Capped Collection) ,用来保存写操作所产生的增量日志,类似于 MySQL 中 的 Binlog。上限集合类似于定长的循环队列,数据顺序追加到集合的尾部,当集合空间达到上限时,它会覆盖集合中最旧的文档。上限集合的数据将会被顺序写入到磁盘的固定空间内,所以,I/O 速度非常快。
在这里插入图片描述
当主节点上的一个写操作完成后,会向 oplog 集合写入一条对应的日志,而从节点则通过这个 oplog 不断拉取到新的日志,在本地进行回放以达到数据同步的目的。

副本集最多有一个主节点。 如果当前主节点不可用,一个选举会抉择出新的主节点。MongoDB 的节点选举规则能够保证在 Primary 挂掉之后选取的新节点一定是集群中数据最全的一个。

选举过程

MongoDB 副本集的选举过程大致如下:

  1. 触发选举:当副本集的主节点不可用时,会触发选举过程。这可能是由于主节点故障、网络问题或其他原因导致的。

可以通过以下几种方式发现主节点不可用:

  1. 监控副本集状态:仲裁节点可以定期执行rs.status()命令来获取副本集的状态信息。该命令会返回一个包含副本集成员状态的文档。通过检查主节点的状态,可以确定它是否可用。
  2. 观察心跳机制:副本集成员之间会通过心跳机制相互通信。如果主节点在一段时间内没有响应心跳,其他成员可能会认为它不可用,并触发选举过程。
  1. 收集信息:副本集中的每个节点,以及仲裁节点,都会收集其他节点的信息,包括节点的状态、最后操作时间戳等。
  2. 投票:仲裁节点会对候选主节点进行投票。
  3. 选择候选节点:进度快的仲裁节点可以根据预设的规则和策略,以及投票信息决定哪个从节点应该成为新的主节点。这些规则可能包括节点的优先级、数据的新旧程度等。
  4. 选举出新的主节点:等待仲裁节点广播选择节点将成为新的主节点。
  5. 同步数据:新的主节点会与其他从节点进行数据同步,以确保数据的一致性。

选举过程中,副本集的节点会通过心跳机制相互通信,以检测其他节点的状态。如果某个节点在一段时间内没有响应心跳,就会被认为是不可用的。

副本集的选举过程是自动进行的,对应用程序来说是透明的。在选举过程中,副本集可能会暂时处于只读状态,直到新的主节点选举出来。

为了确保副本集的高可用性和可靠性,建议在副本集中配置多个节点,并合理设置节点的优先级和其他参数。此外,监控副本集的状态和及时处理故障也是很重要的。

为什么要用复制集群?

  1. 实现 failover:提供自动故障恢复的功能,主节点发生故障时,自动从从节点中选举出一个新的主节点,确保集群的正常使用,这对于客户端来说是无感知的。
  2. 实现读写分离:我们可以设置从节点上可以读取数据,主节点负责写入数据,这样的话就实现了读写分离,减轻了主节点读写压力过大的问题。MongoDB 4.0 之前版本如果主库压力不大,不建议读写分离,因为写会阻塞读,除非业务对响应时间不是非常关注以及读取历史数据接受一定时间延迟。

分片集群

分片集群是 MongoDB 的分布式版本,相较副本集,分片集群数据被均衡的分布在不同分片中, 不仅大幅提升了整个集群的数据容量上限,也将读写的压力分散到不同分片,以解决副本集性能瓶颈的难题。

MongoDB 的分片集群由如下三个部分组成:
在这里插入图片描述

  • Config Servers:配置服务器,本质上是一个 MongoDB 的副本集,负责存储集群的各种元数据和配置,如分片地址、Chunks 等Mongos
  • 路由服务,不存具体数据,从 Config 获取集群配置讲请求转发到特定的分片,并且整合分片结果返回给客户端
  • Shard:每个分片是整体数据的一部分子集,从 MongoDB3.6 版本开始,每个 Shard 必须部署为副本集(replica set)架构

为什么要用分片集群?

随着系统数据量以及吞吐量的增长,常见的解决办法有两种:垂直扩展和水平扩展。

  • 垂直扩展通过增加单个服务器的能力来实现,比如磁盘空间、内存容量、CPU 数量等
  • 水平扩展则通过将数据存储到多个服务器上来实现,根据需要添加额外的服务器以增加容量。

类似于 Redis Cluster,MongoDB 也可以通过分片实现 水平扩展 。

水平扩展这种方式更灵活,可以满足更大数据量的存储需求,支持更高吞吐量。并且,水平扩展所需的整体成本更低,仅仅需要相对较低配置的单机服务器即可,代价是增加了部署的基础设施和维护的复杂性。

也就是说当你遇到如下问题时,可以使用分片集群解决:存储容量受单机限制,即磁盘资源遭遇瓶颈。读写能力受单机限制,可能是 CPU、内存或者网卡等资源遭遇瓶颈,导致读写能力无法扩展。

分片键(Shard Key)

分片建是数据分区的前提, 从而实现数据分发到不同服务器上,减轻服务器的负担。也就是说,分片键决定了集合内的文档如何在集群的多个分片间的分布状况。分片键就是文档里面的一个字段,但是这个字段不是普通的字段,有一定的要求:

  1. 它必须在所有文档中都出现。它必须是集合的一个索引,可以是单索引或复合索引的前缀索引,不能是多索引、文本索引或地理空间位置索引。
  2. MongoDB 4.2 之前的版本,文档的分片键字段值不可变。
  3. MongoDB 4.2 版本开始,除非分片键字段是不可变的 _id 字段,否则您可以更新文档的分片键值。
  4. MongoDB 5.0 版本开始,实现了实时重新分片(live resharding),可以实现分片键的完全重新选择。
  5. 它的大小不能超过 512 字节。

如何选择分片键

选择合适的片键对 sharding 效率影响很大,主要基于如下四个因素:

  1. 取值基数 取值基数建议尽可能大,如果用小基数的片键,因为备选值有限,那么块的总数量就有限,随着数据增多,块的大小会越来越大,导致水平扩展时移动块会非常困难。 例如:选择年龄做一个基数,范围最多只有 100 个,随着数据量增多,同一个值分布过多时,导致 chunck 的增长超出 chuncksize 的范围,引起 jumbo chunk,从而无法迁移,导致数据分布不均匀,性能瓶颈。
  2. 取值分布 取值分布建议尽量均匀,分布不均匀的片键会造成某些块的数据量非常大,同样有上面数据分布不均匀,性能瓶颈的问题。
  3. 查询带分片 查询时建议带上分片,使用分片键进行条件查询时,mongos 可以直接定位到具体分片,否则 mongos 需要将查询分发到所有分片,再等待响应返回。
  4. 避免单调递增或递减 单调递增的 sharding key,数据文件挪动小,但写入会集中,导致最后一篇的数据量持续增大,不断发生迁移,递减同理。

综上,在选择片键时要考虑以上 4 个条件,尽可能满足更多的条件,才能降低 MoveChunks 对性能的影响,从而获得最优的性能体验。

分片策略有哪些

MongoDB 支持三种分片算法来满足不同的查询需求。

基于范围分片

在这里插入图片描述

MongoDB 按照分片键(Shard Key)的值的范围将数据拆分为不同的块(Chunk),每个块包含了一段范围内的数据。

当分片键的基数大、频率低且值非单调变更时,范围分片更高效。

  • 优点:Mongos 可以快速定位请求需要的数据,并将请求转发到相应的 Shard 节点中。
  • 缺点:可能导致数据在 Shard 节点上分布不均衡,容易造成读写热点,且不具备写分散性。

适用场景:分片键的值不是单调递增或单调递减、分片键的值基数大且重复的频率低、需要范围查询等业务场景

基于 Hash 值的分片

在这里插入图片描述
MongoDB 计算单个字段的哈希值作为索引值,并以哈希值的范围将数据拆分为不同的块(Chunk)。

  • 优点:可以将数据更加均衡地分布在各 Shard 节点中,具备写分散性。
  • 缺点:不适合进行范围查询,进行范围查询时,需要将读请求分发到所有的 Shard 节点。

适用场景:分片键的值存在单调递增或递减、片键的值基数大且重复的频率低、需要写入的数据随机分发、数据读取随机性较大等业务场景。

基于地区或者标签 zone/tag

若数据具备一些天然的区分,如基于地域、时间等标签,数据可以基于标签来做区分。

  • 优点:数据分布较为合理。
  • 缺点:数据不分散。

除了上述三种分片策略,您还可以配置 复合片键(多个字段组成的分片键。它可以更加灵活地对数据进行分布式存储和查询,提高数据的读写性能和可扩展性) ,例如由一个低基数的键和一个单调递增的键组成。

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

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

相关文章

Linux 按键输入实验

Linux 按键输入实验 1、添加 pinctrl 节点 首先修改在设备树里面添加关于按键的节点。I.MX6U-ALPHA 开发板上的 KEY 使用了 UART1_CTS_B 这个 PIN,打开 imx6ull-alientekemmc.dts,在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_key”的子…

深度学习 --- stanford cs231 编程作业(assignment1,Q3: softmax classifier)

stanford cs231 编程作业(assignment1,Q3: softmax classifier softmax classifier和svm classifier的assignment绝大多部分都是重复的,这里只捡几个重点。 1,softmax_loss_naive函数,尤其是dW部分 1,1 正向传递 第i张…

力扣爆刷第151天之TOP100五连刷(回文子串、DFS、旋转数组二分查找)

力扣爆刷第151天之TOP100五连刷(回文子串、DFS、旋转数组二分查找) 文章目录 力扣爆刷第151天之TOP100五连刷(回文子串、DFS、旋转数组二分查找)一、5. 最长回文子串二、102. 二叉树的层序遍历三、33. 搜索旋转排序数组四、200. 岛…

JS 实现Date日期格式的本地化

为了更好的更新多语言日期的显示,所以希望实现日期的本地化格式显示要求,常规的特殊字符型格式化无法满足显示要求,这里整理了几种我思考实现的本地化实现功能。 通过多方查找,总结了实现的思路主要有如下三个方向: 官…

【鸿蒙 HarmonyOS】Swiper组件

一、背景 项目中通常会遇到图片轮播,内容轮播的场景;如:在一些应用首页显示推荐的内容时,需要用到轮播显示的能力。 二、源码地址 ✍Gitee开源项目地址👉:https://gitee.com/cheinlu/harmony-os-next-swi…

Nginx与Gateway

Nginx与Gateway Nginx 基本介绍 Nginx 是一款轻量级的高性能 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的 Igor Sysoev 所开发,最初供俄罗斯大型的门户网站及搜索引擎 Rambler 使用。 Nginx 的特点在于其占用…

gma 2.0.10 (2024.06.16) | GmaGIS V0.0.0a4 更新日志

安装 gma 2.0.10 pip install gma2.0.10网盘下载: 链接:https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码:1pc8 注意:此版本没有Linux版! 编译gma的Linux虚拟机没有时间修复,本期Linux版…

AtCoder Beginner Contest 358 A~E(F,G更新中...)

A.Welcome to AtCoder Land 题意 给出两个字符串 S , T S, T S,T&#xff0c;请你判断是否满足&#xff1a; 字符串 S S S为AtCoder 字符串 T T T为Land 分析 输入后判断即可 代码 #include<bits/stdc.h> using namespace std; void solve() {string s, t;cin &g…

学习记录:VS2019+OpenCV3.4.1实现SURF库函数的调用

最近在学习opencv的使用&#xff0c;在参照书籍《OpenCV3编程入门》实现SURF时遇到不少问题&#xff0c;下面做归纳总结。 错误 LNK2019 无法解析的外部符号 “public: static struct cv::Ptr __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)” (?createSUR…

51单片机实验05 -点阵

目录 一&#xff0c;熟悉矩阵led小灯 1&#xff0c;点亮矩阵的一只led 2&#xff0c;点亮矩阵的一排led 3&#xff0c;点亮矩阵的全部led static 关键字 unsigned 关键字 4&#xff0c;点阵的静态显示 2&#xff09;心形矩阵显示代码 3&#xff09;效果 二&#xff0c;课…

模仿qsort实现一个通用的冒泡排序

目录 前言 模仿 排序整型数组 排序结构体数组 排序字符数组 前言 qsort在前面我们讲到底层逻辑是快速排序的方式&#xff0c;是不是可以发现有了qsort来进行排序的话&#xff0c;就更加的方便快捷&#xff0c;我们在使用的时候 一方面&#xff0c;代码量会大大的减少 另一…

北京多商入驻app开发项目的主要优势及功能

多商入驻app开发项目的定义 随着电子支付技术的不断成熟&#xff0c;全国各地的消费者通过网络在线上购物的频率越来越高&#xff0c;为此&#xff0c;多商入驻app开发项目应用而生。各商家也纷纷开始申请入驻商城平台&#xff0c;开设自己的店铺。 图片来源&#xff1a;unspl…

【CT】LeetCode手撕—121. 买卖股票的最佳时机

目录 题目1- 思路2- 实现⭐121. 买卖股票的最佳时机——题解思路 2- ACM实现 题目 原题连接&#xff1a;121. 买卖股票的最佳时机 1- 思路 模式识别 模式1&#xff1a;只能某一天买入 ——> 买卖一次 ——> dp 一次的最大利润 动规五部曲 1.定义dp数组&#xff0c;确…

数据结构之线性表(2)

顺序表中的动态存储 上文我们了解到了顺序表中的静态顺序表的相关操作&#xff0c;今天我们来学习动态顺序表的知识。 为什么会存在动态顺序表呢&#xff1f;&#xff1f; 原因&#xff1a;静态顺序表给定的数据容量固定&#xff0c;多了浪费&#xff0c;少了不够用。 首先我…

【Python深度学习】——信息量|熵

【Python深度学习】——信息量|熵 假设1. 信息量1.1 含义1.2 信息量的公式: 2. 熵Entropy2. 含义2.2 熵的计算公式:2.3 熵的作用 假设 例子&#xff1a;掷硬币 假设我们有一个公平的硬币。这个硬币有两个面&#xff1a;正面&#xff08;H&#xff09;和反面&#xff08;T&…

一. 做一个前后端分离的电商项目(技术栈 : springboot+mybatis-plus+vue) 的前期准备

前期准备 ---- 项目创建和配置 一.创建springboot项目二.项目前期准备工作1. 修改springboot和jdk版本号2.Web请求处理(1) 添加web依赖(2) 测试是否能够成功访问(3) 修改端口号(4) 创建数据库 3. 连接数据库(1) 添加依赖(2)配置application.properties文件(3)添加包扫描 Mapper…

Validation校验

文章目录 Validation校验作用依赖坐标UserController接收客户端注册用户请求的方法请求参数封装实体User的结构校验分组 Validation校验 作用 服务端接收前端传递的请求从参数的时候&#xff0c;可以对请求参数进行自动校验。 场景&#xff1a;通过postman向服务端发送一个注…

《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大&#xff0c;比如数据无法全部加载进内存&#xff0c;无法支持索引的高效实时更新&…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…

修改yarn、npm、pnpm为国内镜像源

国内由于网络的原因&#xff0c;使用官方的npm、yarn、pnpm访问下载依赖库会很慢&#xff0c;有时候还会出现无法访问的情况&#xff0c;这时候就需要我们给npm、yarn、pnpm换一个国内的镜像源的&#xff0c;一般的我们可以将镜像换成淘宝的源&#xff0c;由于平时比较常用到的…