MongoDB入门与实战-第五章-MongoDB副本集

news2024/11/15 9:44:58

目录

  • 参考
  • 一、副本集概念
    • 1、**主要功能**
    • 2、主从复制和副本集区别
    • 3、复制结构图
  • 二、副本集成员角色
    • 1.主节点
    • 2.副本节点
    • 3.仲裁节点
  • 三、副本集架构(一主一副本一仲裁)
    • 1、**设置读操作权限:**
    • 2、取消作为奴隶节点的读权限
  • 四、选举原则
    • 1、触发条件
    • 2、选举规则
  • 五、故障测试
    • 1、副本节点故障测试
    • 2、主节点故障测试
    • 3、仲裁节点和主节点故障
    • 4、仲裁节点和从节点故障
  • 六、部署副本集

参考

MongoDB副本集
MongoDB的副本集
MongoDB 教程

一、副本集概念

MongoDB复制是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。

1、主要功能

  • (1)数据冗余:副本集可以确保副本节点与主节点数据的更新,以防止单个数据库的服务宕机造成数据丢失的问题。这些副本节点可以和主节点位于同一个数据中心或处于安全考虑分布于其他数据中心

  • (2)自动故障转移:副本集没有固定的主节点,整个集群会选举出一个主节点,当这个主节点不会正常工作时,会选举一个副本节点切换为主节点,客户端会连接到这个新的主节点,并且数据和应用程序都将保持可用。MongoDB副本集实现这样的主/副本切换是自动的,因此副本集是保证MongoDB高可用的基础。

  • (3)读写分离:副本集可以将读取请求分流到所有副本集上,以减轻主节点的读写压力。

2、主从复制和副本集区别

主从集群和副本集最大的区别就是副本集没有固定的“主节点”;整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为“主节点”,副本集总有一个活跃点(主、primary)和一个或多个备份节点(从、secondary)。

3、复制结构图

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从一主多从

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图如下所示:
在这里插入图片描述
从以上结构图可知,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

二、副本集成员角色

在这里插入图片描述

1.主节点

主节点是副本集中负责处理客户端请求和读写数据的主要成员。主节点通过iplog(操作日志)记录所有操作。副本集中有且只有一个主节点,如果当主节点不可用时,则会从副本节点中选举出新的主节点。

2.副本节点

副本节点定期轮询主节点来获取oplog记录的操作内容,然后对自己的数据副本执行这些操作,从而保证副本节点的数据副本与主节点保持一致。副本集中可以有一个或者多个副本节点。当主节点宕机时,副本集会根据副本节点的优先级进行选举,确定哪个副本节点成为新的主节点。

3.仲裁节点

仲裁节点不会同步主节点的数据副本,也不会被选举为主节点,它主要时参与选举投票。由于仲裁节点没有访问压力,比较空闲,因此仲裁节点需要的资源很小。
当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。

您可以将额外的mongod实例添加到副本集作为仲裁者。 仲裁者不维护数据集。 仲裁者的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁。 因为它们不存储数据集,所以仲裁器可以是提供副本集仲裁功能的好方法,其资源成本比具有数据集的全功能副本集成员更便宜。

  • 如果您的副本集具有偶数个成员,请添加仲裁者以获得主要选举中的“大多数”投票。 仲裁者不需要专用硬件。
    仲裁者将永远是仲裁者,而主要人员可能会退出并成为次要人员,而次要人员可能成为选举期间的主要
    人员。
  • 如果你的副本+主节点的个数是偶数,建议加一个仲裁者,形成奇数,容易满足大多数的投票。
  • 如果你的副本+主节点的个数是奇数,可以不加仲裁者。

三、副本集架构(一主一副本一仲裁)

默认情况下,从节点只是一个备份,是没有读写权限的,可以增加读的权限,但需要进行设置。

1、设置读操作权限:

说明:设置为奴隶节点,允许在从成员上运行读的操作

语法:rs.slaveOk() 或rs.slaveOk(true)

提示
该命令是 db.getMongo().setSlaveOk() 的简化命令。
现在可实现了读写分离,让主插入数据,让从来读取数据。

2、取消作为奴隶节点的读权限

rs.slaveOk(false)

四、选举原则

1、触发条件

MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:

  • 1) 主节点故障
  • 2) 主节点网络不可达(默认心跳信息为10秒)
  • 3) 人工干预(rs.stepDown(600))

2、选举规则

选举规则是根据票数来决定谁获胜:票数最高,且获得了“大多数”成员的投票支持的节点获胜。
“大多数”的定义为:假设复制集内投票成员数量为N,则大多数为 N/2 + 1。即半数以上。

例如:3个投票成员,则大多数的值是2。当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。
若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。

数据的新旧是通过操作日志oplog来对比的。
在获得票数的时候,优先级(priority)参数影响重大。
可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加
0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员
更有资格成为主要成员,更低的值可使成员更不符合条件。
默认情况下,优先级的值是1
可以看出,主节点和副本节点的优先级各为1,即,默认可以认为都已经有了一票。但选举节点,优先
级是0,(要注意是,官方说了,选举节点的优先级必须是0,不能是别的值。即不具备选举权,但具有
投票权)

五、故障测试

在这里插入图片描述

1、副本节点故障测试

关闭27018副本节点:
发现,主节点和仲裁节点对27018的心跳失败。因为主节点还在,因此,没有触发投票选举。
如果此时,在主节点写入数据。

2、主节点故障测试

发现,从节点和仲裁节点对27017的心跳失败,当失败超过10秒,此时因为没有主节点了,会自动发起
投票。
而副本节点只有27018,因此,候选人只有一个就是27018,开始投票。
27019向27018投了一票,27018本身自带一票,因此共两票,超过了“大多数”
27019是仲裁节点,没有选举权,27018不向其投票,其票数是0.
最终结果,27018成为主节点。具备读写功能。
再启动27017节点,发现27017变成了从节点,27018仍保持主节点。
登录27017节点,发现是从节点了,数据自动从27018同步。
从而实现了高可用。

3、仲裁节点和主节点故障

先关掉仲裁节点27019,
关掉现在的主节点27018
登录27017后,发现,27017仍然是从节点,副本集中没有主节点了,导致此时,副本集是只读状态,
无法写入。
为啥不选举了?因为27017的票数,没有获得大多数,即没有大于等于2,它只有默认的一票(优先级
是1)
如果要触发选举,随便加入一个成员即可。
如果只加入27019仲裁节点成员,则主节点一定是27017,因为没得选了,仲裁节点不参与选举,
但参与投票。(不演示)
如果只加入27018节点,会发起选举。因为27017和27018都是两票,则按照谁数据新,谁当主节
点。

4、仲裁节点和从节点故障

先关掉仲裁节点27019,
关掉现在的副本节点27018
10秒后,27017主节点自动降级为副本节点。(服务降级)
副本集不可写数据了,已经故障了。

三节点的副本集,任何一台故障,集群都会进行自动的切换,不影响的服务
三节点的副本集,故障任何两个节点,集群会变的不可用,需要手动处理

六、部署副本集

参考:https://blog.csdn.net/m0_57979544/article/details/124640287

开展副本集之前首先规划各服务器的基本信息以及角色分配

服务器基本信息及角色分配

虚拟机名称IP地址成员角色主机名(hostname)
nosql01192.168.47.130主结点nosql01
nosql02192.168.47.131副本结点nosql02
nosql03192.168.47.133副本结点nosql03

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

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

相关文章

时序逻辑电路

数字电路分为两大类,组合逻辑电路和时序逻辑电路 今天我们要开始学习的是时序逻辑电路,要求大家掌握 同步逻辑电路的分析方法 常用的时序逻辑电路的使用方法 当然由于时序逻辑电路的特点,使得时序逻辑电路难度远远大于组合逻辑电路 电路任…

一文详解Redis键过期策略,最全文档

文章目录1 设置带过期时间的 key1.1 刷新过期时间1.2 Redis 之前的 2.1.3 的差异1.3 返回值1.4 示例1.5 带过期时间的 key1.6 过期精度1.7 过期和持久化2 Redis的key过期策略2.1 惰性删除2.1.1 优点2.1.2 缺点定时删除优点缺点2.2 定期删除优点缺点难点定期删除流程Redis采用的…

SpringMVC异常处理器

1.异常 1.1 异常结构层次 异常主要分为:错误、一般性异常(检查异常)、运行期异常(非受控异常) 错误:如果应用程序出现了 Error,那么将无法恢复,只能重新启动应用程序,最…

VUE3-工作笔记-06

本节:总结11月份学习的内容 1.如果有很多个功能是一样的,那就先写一个测试很多次,确定没有bug再全部改,不然辛辛苦苦全部改了之后,发现还是有bug又要重新改,最好是写成组件的形式,写成hook。 …

ACM第三周---周训---题目合集.

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石.CSDN 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​ 📣系列专栏:ACM周训练题目合集.CSDN 💬总结&#xff1a…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.7 数据卷命令

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.7 数据卷命令10.7.1 数据卷10.7.2 操作数据卷10.7.3 直接…

度量方法总结

本文目录0 引言1 度量差异性1.1 闵可夫斯基距离(Minkowski distance)1.1.1 欧氏距离(Euclidean distance)1.1.2 曼哈顿距离(Manhattan distance)1.1.3 切比雪夫距离(Chebyshev distance&#xf…

[附源码]JAVA毕业设计课程网站设计(系统+LW)

[附源码]JAVA毕业设计课程网站设计(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

Spring Boot 框架整合 MyBatis 连接数据库,详细说明

在我们日常的开发过程中,肯定不可避免的会使用到数据库以及 SQL 语句。比如,刚开始学习 Java 的时候可能会遇到 JDBC,它是连接 Java 和数据库的桥梁,我们可以使用 JDBC 来建立与数据库之间的连接并且执行相应的 SQL 语句。虽然 JD…

数据结构—List集合

文章目录一、ArrayList集合1,ArrayList集合的特点2,ArrayList集合的一些方法添加元素个数获取指定位置元素指定位置插入元素替换元素移除元素判断是否为空判断是否包含元素移除指定元素迭代器遍历集合二、LinkedList集合1,LinkedList集合的特…

Ra-01SC/Ra-01SCH模组驱动

目录简介硬件准备设备清单接线说明重要函数说明调试联系我们简介 本文档主要介绍Ra-01SC/Ra-01SCH模组驱动例程使用方法; 硬件准备 设备清单 硬件数量Ra-001SC/Ra-01SCH 模组2个杜邦线若干USB转TTL模块2个STM32F103C8T6开发板2个安卓线2根 接线说明 STM32F103C…

[论文阅读] 颜色迁移-直方图渐进式颜色迁移

[论文阅读] 颜色迁移-直方图渐进式颜色迁移 文章: 有2篇相关的文章, 都为同一作者 [Progressive histogram reshaping for creative color transfer and tone reproduction], [code未公开][Progressive color transfer for images of arbitrary dynamic range], [code未公开]…

qt模块feature QT_FEATURE_* qt_lib_*.pri QT_CONFG qtConfig

qt为方便对代码进行删减,将代码拆分成很多模块,对每个模块梳理出feature,为了简化程序的使用和其他目的,qt还对每个模块分成public模块和private模块(比如core分为core和core-privare模块,但两者公用同一个…

迭代器失效问题

目录 一、vector迭代器失效问题 1、resize,reserve,insert,assign,push_back可能引起底层空间改变 2、指定位置元素的删除操作erase 3、Linux下,g编译器对迭代器失效的检测不是非常严格,处理也没有vs下极端 4、与vector类似,string在插入…

java swing(GUI) MySQL实现的飞机票预定系统源码带视频运行教程

大家好,今天给大家演示一下由Java swing实现的飞机票预定系统,系统数据库原本采用的是Oracle,我又改了一个mysql版本的,所以这套系统有两个版本,一个是mysql数据库版的,一个是Oracle数据库版,演…

TypeScript是强类型,静态类型的Java Script

1. 编程语言的分类 As we all know, JavaScript 是弱类型,动态类型的编程语言。 首先我们来解释一下这几个名词: 动态类型语言:在 运行期间(Runtime) 才去做数据类型检查的语言。静态类型语言:在 编译其间(Compile) 就进行数据…

【Redis】事务秒杀案例

一、背景 在日常购物时,经常会有商家开展限时秒杀活动,我们如何使用redis来实现这种场景呢 二、业务代码 首先我们可以想到的是,我们可以把商品剩余数量和成功秒杀商品的用户id放在redis中 下面是我们的业务代码 package com.decade.con…

2022物联卡平台排名前十的公司

2022年物联网行业开始爆发,针对于企业设备联网的物联卡就显得格外重要了,而共享单车,移动支付,智慧城市,自动售卖机等企业采购物联卡会面临着各种问题,低价陷阱,流量虚假,管理混乱&a…

【Spring框架】经典的 9 种设计模式,面试工程师必学知识

文章目录1.简单工厂(非23种设计模式中的一种)实现方式:实质:实现原理:设计意义:2.工厂方法实现方式:实现原理:例子:3.单例模式4.适配器模式实现方式:实现原理:实现过程&a…

[Swift]国际化

一、添加本地化语言 比如这里,我们添加了联合国六种工作语言(汉语,英语,法语,俄语,阿拉伯语和西班牙语)。 二、纯代码本地化 1. 创建本地化文件 默认文件名为“Localizable”,不要…