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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】标准库IO查漏补缺
  • CORS漏洞及其防御措施:保护Web应用免受攻击
  • 看Threejs好玩示例,学习创新与技术(三)
  • `character_set_server` 和 `collation_server`
  • Nuxt Kit 组件管理:注册与自动导入
  • 一. Unity实现虚拟摇杆及屏幕自适应功能
  • GPS/LBS/Wi-Fi定位,全安排!—合宙Air201资产定位模组LuatOS快速入门04
  • Rust Web开发框架对比:Warp与Actix-web
  • 升级Ubuntu内核的几种方法
  • Table列表复现框实现【勾选-搜索-再勾选】
  • Python | Leetcode Python题解之第406题根据身高重建队列
  • C语言补习课番外篇——采样sin(x)
  • CustomerbasicController
  • 如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用
  • c语言快递小项目
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • angular组件开发
  • bootstrap创建登录注册页面
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • golang中接口赋值与方法集
  • HomeBrew常规使用教程
  • JavaScript的使用你知道几种?(上)
  • JavaScript函数式编程(一)
  • Java面向对象及其三大特征
  • PHP的类修饰符与访问修饰符
  • 读懂package.json -- 依赖管理
  • 复杂数据处理
  • 关于Flux,Vuex,Redux的思考
  • 关于List、List?、ListObject的区别
  • 后端_MYSQL
  • 回顾2016
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 老板让我十分钟上手nx-admin
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 一个项目push到多个远程Git仓库
  • 7行Python代码的人脸识别
  • hi-nginx-1.3.4编译安装
  • Nginx实现动静分离
  • 如何用纯 CSS 创作一个货车 loader
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # C++之functional库用法整理
  • # Kafka_深入探秘者(2):kafka 生产者
  • #etcd#安装时出错
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • %check_box% in rails :coditions={:has_many , :through}
  • (13)DroneCAN 适配器节点(一)
  • (C语言)fread与fwrite详解
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (力扣)1314.矩阵区域和
  • (学习日记)2024.01.19
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .JPG图片,各种压缩率下的文件尺寸