MongoDB高可用和分片集群知识
一、MongoDB实现高可用
1. MongoDB复制集(Replication Set)
在实际生产中,MongoDB要实现高可用,以免MongoDB单实例挂了,服务不可用。MongoDB实现高可用是以MongoDB复制集的形式实现,和集群部署概念相同,MongoDB复制集有多个MongDB实例,其中包含一个主节点和多个从节点组成。所有对MongoDB的写操作都写入到主节点,从节点通过数据同步从主节点中复制数据(备节点不只是从主节点上同步数据,还可以选择一个离自己最近(心跳延时最小)的节点来复制数据),以保证数据的高可用。
复制集高可用依赖于两个功能实现: 1.数据被写入后,数据迅速的同步到另一个节点上。2.主节点发生故障后其他节点实例能自动的选取出一个新的替代节点。
在实现MongoDB复制集的同时,也实现了以下几个功能:
- 读写分离: 不同类型的压力分别在不同的节点上执行
- 异步容灾: 在数据中心故障时候快速切换到异地
- 数据分发: 将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
2.复制集模式
通常复制集由三个节点组成,来保障数据的高可用,其中复制集模式可以分为PSS模型、PSA模式。
2.1 PSS模型(官方推荐)
PSS为一个primary节点和两个secondary节点,既一主两从。

一旦主节点出现故障,从节点会自动选举出一个新的主节点。
2.2 PSA模型
PSA为一个primary节点和一个secondary节点以及一Arbiter(仲裁)节点,既一主一从一仲裁。

Arbiter节点不存储数据副本,也不提供业务的读写操作。Arbiter节点发生故障不影响业务,仅影响选举投票
3.复制集高可用依据
3.1 复制集选举方面
选举的过程中会进行投票选举,选举中为避免平票的情况,MongoDB的实例节点数要为奇数,主要措施有两个:
- 为选举定时器增加少量的随机时间偏差,这样避免各个节点在同一时刻发起选举,提高成功率。
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上拉取不过来,从而导致复制延迟。 复制延迟的解决方案有以下措施:
- 降低主节点的写入速度
- 提高opLog的容量大小,并保持监视
- 避免字段使用太大的数组
二、MongoDB分片集群
1.分片
在大数据发展的时代,数据存储会在多个不同的机器上,要进行分布式的存储,进行分片是一个好的措施,将数据按某种方式进行切分存储在不同的机器上。
2.分片集群架构
对MongoDB进行分片集群部署,有利于数据存放的横向拓展。分片集群架构除分片节点外,还有配置节点、路由节点等。

数据分片: 分片用于存储真正的数据,并提供最终的数据读写访问,通常是复制集的形式存在。
配置节点: 配置节点不用于存储数据,而是保存了整个分片集群中的元数据,其中包含各个集合的分片策略,以及分片的路由表等
查询路由(mongos):mongos是分片集群的访问入口,其本身并不持久化数据。
3.分片策略
分片策略指的是将一个大的数据集合通过何种策略进行分配到多个分片节点上。

集群分片涉及到chunk,chunk指的是一个范围区间的数据,集合在操作分片集合时,会根据分片键找到对应的chunk,并向chunk所在分片发起请求。

4.分片算法
分片算法有范围分片和哈希分片两种。
- 范围分片: 按照一定的范围进行分片

- hash分片:会生成一个哈希值,然后根据哈希值对范围分片的chunk进行切分。

hash算法使得数据分布更加均匀,保证了随机性,但在范围查询时,哈希分片需要对所有的chuck进行检索,效率低。
5. 数据均衡
5.1 实现均衡的措施
想要实现数据在不同的分片中数量是均衡的,实现的方式有两种。
-
手动均衡(通过干预的方式进行均衡)
-
自动均衡: 以后台的方式监控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 中常用的容器(如 vector、list、map 等)及其特点。<2> 如何在 C 中使用 STL 算法(如排序、查找等)?<3> 解…...
HashSet及其实现原理
目录 一、Set二、HashSet三、HashSet的实现原理四、HashSet的线程安全与顺序1、线程安全2、有序性 一、Set Set 接口是 java.util 包下的一个集合接口,它继承自 Collection 接口。Set 接口定义了一个不允许包含重复元素的集合。Set 接口的实现类主要有 HashSet、Lin…...
反序列化漏洞练习1
根据代码可以看出来sis类只是接收了参数cmd,下边是通过get获得cmd的值,所以可以在序列化过程中直接为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 中,激活时会调用此钩子。onDeactivated: 当 keep-alive 组件被缓存时触发。 注意事项 onActivated 只在组件从 keep-alive 缓存中恢复…...
医学数据分析实训 项目一 医学数据采集
项目一 医学数据采集 一、实践目的 了解医学数据的特点;熟悉常见的医学公共数据库的使用方法;掌握获取医学数据的方法; 二、实践平台 操作系统:Windows10 及以上Python 版本:3.8.x 及以上PyCharm 或 Anoconda 集成…...
《Oracle(一)- 基础》
文章目录 一、Oracle简介(一)什么是ORACLE(二)ORACLE 体系结构1.数据库2.实例3.数据文件(dbf)4.表空间5.用户 二、ORACLE 安装与配置(一)VMware 挂载 windows server 2003࿰…...
Unity Resource System 优化笔记
Unity Resources System 定义 Resources System允许开发者在项目中的Resources文件夹下存放一个或多个资源文件夹,并且可以在Unity运行时通过Unity提供的API对资源和对象进行加载和卸载。 如果Resources中的文件结构复杂,内容多,会给应用常…...
Flutter之SystemChrome全局设置
一、简介 SystemChrome作为一个全局属性,很像 Android 的 Application,功能很强大。 二、使用详解 2.1 setPreferredOrientations 设置屏幕方向 在我们日常应用中可能会需要设置横竖屏或锁定单方向屏幕等不同要求,通过 setPreferredOrien…...
Windows11 WSL2的ubuntu 22.04中拉取镜像报错
问题描述 在windows11 WSL2的ubuntu 22.04中拉取镜像报错。错误为: 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】多线程:线程同步、条件变量
目录 一、同步的概念 为什么需要同步呢? 二、条件变量 条件变量的相关概念 1、条件变量的初始化:静态初始化、动态初始化 2、条件变量的等待:pthread_cond_wait函数 工作原理及流程【重要!】 关键点总结 3、条件变量的激…...
【Android Studio】使用雷电模拟器调试
文章目录 进入开发者模式使雷电模拟器adb连接PC测试 进入开发者模式 多次点击版本号 -开区USB调试 使雷电模拟器adb连接PC 写cmd脚本 雷电模拟器端口为5555 ,脚本内容如下: adb.exe connect 127.0.0.1:5555双击bat脚本文件 测试...
你必须知道的C语言问题(9)
问:如下代码,两个结构体类型成员变量相同,只是成员顺序不同,为什么大小不同? #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h>typedef struct _test1{uint…...
如何通过网络找到自己想要的LabVIEW知识?
学习LabVIEW或其他编程技术时,无法依赖某一篇文章解决所有问题。重要的是通过多种途径获取灵感,并学会归纳总结,从而逐渐形成系统性的理解。这种持续学习和总结的过程是技术提升的基础。通过网络找到所需的LabVIEW知识可以通过以下几个步骤进…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...
iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)
崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题,不一定会立刻崩,但一旦积累,就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能,而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...
02-性能方案设计
需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…...
