Redis学习(10)之Redis主从集群(2)

news2024/11/23 17:30:34

文章目录

  • 零 主从集群上篇文章参看
  • 一 CAP理论
    • 1.1 CAP概念
    • 1.2 CAP定理
    • 1.3 BASE 理论
    • 1.4 CAP 的应用
  • 二 Raft 算法
    • 2.1 Raft算法简介
    • 2.2 角色、任期及角色转变
    • 2.3 leader 选举
      • 2.3.1 follower要参加选举
      • 2.3.2 follower被要求投票
      • 2.3.3 Candidate等待响应
      • 2.3.4 选举时机
    • 2.4 数据同步
      • 2.4.1 状态机
    • 2.5 处理流程
      • 2.5.1 AP 支持
    • 2.6 脑裂情况探究
      • 2.6.1 情况一——不确定是否形成脑裂情形
      • 2.6.2 情况二——形成脑裂情形
      • 2.6.3 情况三——不形成脑裂情形
      • 2.6.4 情况四——不形成脑裂情形
      • 2.6.5 情况五——不形成脑裂情形
    • 2.7 Leader 宕机处理
      • 2.7.1 请求到达前 Leader 挂掉
      • 2.7.2 未开始同步数据前 Leader 挂掉
      • 2.7.3 同步完部分后 Leader 挂掉
      • 2.7.4 commit 通知发出后 Leader 挂掉
      • 2.7.5 总结
      • 2.7.6 Raft算法动画演示

零 主从集群上篇文章参看

  • Redis学习【10】之Redis主从集群(1)

一 CAP理论

1.1 CAP概念

  • CAP 定理指的是在一个分布式系统中,一致性 Consistency、可用性 Availability、分区容错性 Partition tolerance,三者不可兼得。
    • **一致性(C):分布式系统中多个主机之间是否能够保持数据一致的特性。**即当系统数据发生更新操作后,各个主机中的数据仍然处于一致的状态。
    • 可用性(A):系统提供的服务必须一直处于可用的状态。即对于用户的每一个请求,系统总是可以在有限的时间内对用户做出响应。
    • 分区容错性(P):分布式系统在遇到任何网络分区故障时,仍能够保证对外提供满足一致性和可用性的服务。

1.2 CAP定理

  • CAP 定理:对于分布式系统,网络环境相对是不可控的,出现网络分区是不可避免的,因此系统必须具备分区容错性。但系统不能同时保证一致性与可用性。即要么 CP,要么 AP。

1.3 BASE 理论

  • BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的简写
    • 基本可用:指分布式系统在出现不可预知故障的时候,允许损失部分可用性。
    • 软状态:指允许系统数据存在的中间状态,并认为该中间状态的存在不会影响系统的整体可用性。 即允许系统主机间进行数据同步的过程存在一定延时。软状态,其实就是一种灰度状态,过渡状态。
    • 最终一致性:强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。 因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要保证系统数据的实时一致性
    • 实时一致性:要求数据内容一旦发生更新,客户端立刻可以访问到最新的数据。 所以,在集群环境下该特性是无法实现的,只存在于单机环境中。
    • 最终一致性:数据内容发生更新后,经过一小段时间后,客户端可以访问到最新的数据。 实时一致性与最终一致性两个概念是从客户端访问到一致性内容的时间角度来说的,单从客户端访问到的内容角度来说(不说时间问题),还有两个概念:
      • 强一致性(严格一致性):要求客户端访问到的一定是更新过的新数据
      • 弱一致性:允许客户端从集群不同节点访问到的数据是不一致的
  • BASE 是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于 CAP 定理逐步演化而来的。
  • BASE 理论的核心思想:即使无法做到强一致性,但每个系统都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

1.4 CAP 的应用

CAP的应用特点
ZookeeperZookeeper 遵循的是 CP 模式,即保证一致性,但牺牲可用性。
ConsulConsul 遵循的是 CP 模式,即保证了一致性,但牺牲了可用性。
RedisRedis 遵循的是 AP 模式,即保证了可用性,但牺牲了一致性。
EurekaEureka 遵循的是 AP 模式,即保证了可用性,但牺牲了一致性。
Nacos 与 CAPNacos 在做注册中心时,默认是 AP 的。但其也支持 CP 模式,但需要用户提交请求进行转换。
  • 以Zookeeper的CP模式进行简单解说
    • 当 Leader 节点中的数据发生了变化后,在 Follower 还没有同步完成之前,整个 Zookeeper集群是不对外提供服务的。如果此时有客户端来访问数据,则客户端会因访问超时而发生重试。由于 Leader 的选举非常快,所以这种重试对于用户来说几乎是感知不到的。所以说,Zookeeper 保证了一致性,但牺牲了可用性。

二 Raft 算法

2.1 Raft算法简介

  • Raft 算法是一种通过对日志复制管理来达到集群节点一致性的算法。 日志复制管理发生在集群节点中的 Leader 与 Followers 之间,Raft 通过选举出的 Leader 节点负责管理日志复制过程,以实现各个节点间数据的一致性。

2.2 角色、任期及角色转变

在这里插入图片描述

  • 在 Raft 中,节点有三种角色:
    • Leader:唯一负责处理客户端写请求的节点;也可以处理客户端读请求;同时负责日志复制工作
    • Candidate:Leader 选举的候选人,其可能会成为 Leader。是一个选举中的过程角色
    • Follower:可以处理客户端读请求;负责同步来自于 Leader 的日志;当接收到其它Cadidate 的投票请求后可以进行投票;当发现 Leader 挂了,其会转变为 Candidate 发起Leader 选举

2.3 leader 选举

2.3.1 follower要参加选举

  • 若 follower 在心跳超时范围内没有接收到来自于 leader 的心跳,则认为 leader 挂了。此时其首先会使其本地 term 增一。然后 follower 会完成以下步骤:
    • 此时若接收到了其它 candidate 的投票请求,则会将选票投给这个 candidate
    • 由 follower 转变为 candidate
    • 若之前尚未投票,则向自己投一票
    • 向其它节点发出投票请求,然后等待响应

2.3.2 follower被要求投票

  • follower 在接收到投票请求后,其会根据以下情况来判断是否投票:
    • 发来投票请求的 candidate 的 term 不能小于我的 term
    • 在我当前 term 内,我的选票还没有投出去
    • 若接收到多个 candidate 的请求,我将采取 first-come-first-served 方式投票

2.3.3 Candidate等待响应

  • 当一个 Candidate 发出投票请求后会等待其它节点的响应结果。这个响应结果可能有三种情况:
    • 收到过半选票,成为新的 leader。然后会将消息广播给所有其它节点,本服务器是新的 Leader
    • 接收到别的 candidate 发来的新 leader 通知,比较发现新 leader 的 term 并不比自己的 term小,则转变为 follower
    • 经过一段时间后,没有收到过半选票,也没有收到新 leader 通知,则重新发出选举

2.3.4 选举时机

  • 在很多时候,当 Leader 真的挂了,Follower 几乎同时会感知到,所以它们几乎同时会变为 candidate 发起新的选举。此时就可能会出现较多 candidate 票数相同的情况,即无法选举出 Leader。
  • 为了防止这种情况的发生,Raft 算法其采用了 randomized election timeouts 策略来解决这个问题。其会为这些 Follower 随机分配一个选举发起时间 election timeout,这个 timeout150-300ms 范围内。只有到达了 election timeout 时间的 Follower 才能转变为 candidate,否则等待。那么 election timeout 较小的 Follower 则会转变为 candidate 然后先发起选举,一般情况下其会优先获取到过半选票成为新的 leader。

2.4 数据同步

  • 在 Leader 选举出来的情况下,通过日志复制管理实现集群中各节点数据的同步。

2.4.1 状态机

在这里插入图片描述

  • Raft 算法一致性的实现,是基于日志复制状态机的。状态机的最大特征是,不同 Server中的状态机若当前状态相同,然后接受了相同的输入,则一定会得到相同的输出。

2.5 处理流程

在这里插入图片描述

2.5.1 AP 支持

在这里插入图片描述

  • Log 由 term index、log index 及 command 构成。为了保证可用性,各个节点中的日志可以不完全相同,但 leader 会不断给 follower 发送 box,以使各个节点的 log 最终达到相同。即 raft 算法不是强一致性的,而是最终一致的。

2.6 脑裂情况探究

  • Raft 集群存在脑裂问题。在多机房部署中,由于网络连接问题,很容易形成多个分区。而多分区的形成,很容易产生脑裂,从而导致数据不一致。
  • 由于三机房部署的容灾能力最强,所以生产环境下,三机房部署是最为常见的。下面以三机房部署为例进行分析,根据机房断网情况,可以分为五种情况:

2.6.1 情况一——不确定是否形成脑裂情形

在这里插入图片描述

  • 情形一出现脑裂:若新leader出现在B机房,则B与C可以正常对外提供服务。此时,A机房也存在Leader,但不能处理写操作请求,所以形成脑裂。
  • 情形二无脑裂:若新leader出现在C机房,A机房中的leader则会自动下线,所以不会形成脑裂。

  • 详细探究出现脑裂的情况:
    • 这种情况下,B 机房中的主机是感知不到 Leader 的存在的,所以 B 机房中的主机会发起新一轮的 Leader 选举。由于 B 机房与 C 机房是相连的,虽然 C 机房中的 Follower 能够感知到 A 机房中的 Leader,但由于其接收到了更大 term 的投票请求,所以 C 机房的 Follower也就放弃了 A 机房中的 Leader,参与了新 Leader 的选举。
    • 若新 Leader 出现在 B 机房,A 机房是感知不到新 Leader 的诞生的,其不会自动下线,所以会形成脑裂。但由于 A 机房 Leader 处理的写操作请求无法获取到过半响应,所以无法完成写操作。但 B 机房 Leader 的写操作处理是可以获取到过半响应的,所以可以完成写操作。故A 机房与 B、C 机房中出现脑裂,且形成了数据的不一致。

2.6.2 情况二——形成脑裂情形

在这里插入图片描述

  • 该情形下,无论新leader出现在B还是C机房,一定形成脑裂。
  • 形成脑裂详解:
    • 无论新leader出现在B还是C机房,他们都可以对外正常服务,但此时的A机房也存在Leader,故出现脑裂。A机房只能提供读操作请求服务。

2.6.3 情况三——不形成脑裂情形

在这里插入图片描述

  • A、C 可以正常对外提供服务,但 B 无法选举出新的 Leader。由于 B 中的主机全部变为了选举状态,所以无法提供任何服务,没有形成脑裂

2.6.4 情况四——不形成脑裂情形

在这里插入图片描述

  • A、B、C 均可以对外提供服务,不受影响

2.6.5 情况五——不形成脑裂情形

在这里插入图片描述

  • A 机房无法处理写操作请求,但可以对外提供读服务。
  • B、C 机房由于失去了 Leader,均会发起选举,但由于均无法获取过半支持,所以均无法选举出新的 Leader。故不会形成脑裂

2.7 Leader 宕机处理

2.7.1 请求到达前 Leader 挂掉

  • client 发送写操作请求到达 Leader 之前 Leader 就挂了,因为请求还没有到达集群,所以这个请求对于集群来说就没有存在过,对集群数据的一致性没有任何影响。Leader 挂了之后,会选举产生新的 Leader。
  • 由于 Stale Leader 并未向 client 发送成功处理响应,所以 client 会重新发送该写操作请求

2.7.2 未开始同步数据前 Leader 挂掉

  • client 发送写操作请求给 Leader,请求到达 Leader 后,Leader 还没有开始向 Followers发出数据 Leader 就挂了。这时集群会选举产生新的 Leader。Stale Leader 重启后会作为Follower 重新加入集群,并同步新 Leader 中的数据以保证数据一致性。之前接收到 client 的数据被丢弃。
  • 由于 Stale Leader 并未向 client 发送成功处理响应,所以 client 会重新发送该写操作请求。

2.7.3 同步完部分后 Leader 挂掉

  • client 发送写操作请求给 Leader,Leader 接收完数据后向所有 Follower 发送数据。在部分 Follower 接收到数据后 Leader 挂了。由于 Leader 挂了,就会发起新的 Leader 选举。
    • 若 Leader 产生于已完成数据接收的 Follower,其会继续将前面接收到的写操作请求转换为日志,并写入到本地状态机,并向所有 Flollower 发出询问。在获取过半同意响应后会向所有 Followers 发送 commit 指令,同时向 client 进行响应。
    • 若 Leader 产生于尚未完成数据接收的 Follower,那么原来已完成接收的 Follower 则会放弃曾接收到的数据。由于 client 没有接收到响应,所以 client 会重新发送该写操作请求。

2.7.4 commit 通知发出后 Leader 挂掉

  • client 发送写操作请求给 Leader,Leader 也成功向所有 Followers 发出的 commit 指令,并向 client 发出响应后,Leader 挂了。
  • 由于 Stale Leader 已经向 client 发送成功接收响应,且 commit 通知已经发出,说明这个写操作请求已经被 server 成功处理。

2.7.5 总结

情形影响
请求到达前 Leader 挂掉请求未被接收到,重新提交请求
未开始同步数据前 Leader 挂掉请求被丢弃,重新提交请求
同步完部分后 Leader 挂掉两种结果:一种写操作成功,一切正常运行。另一种写操作失败,重新提交请求
commit 通知发出后 Leader 挂掉操作已被成功执行,无影响

2.7.6 Raft算法动画演示

  • Raft 算法的动画,其非常清晰全面地演示了 Raft 算法的工作原理。
  • 该动画的地址为Raft算法中文动画演示
  • github源码源码下载地址
  • csdn下载传送

  • 提示:同志们一定要动手!!!很有益于理解Raft算法的各个过程!!!

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

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

相关文章

stm32f407探索者开发板(二十一)——窗口看门狗

文章目录一、窗口看门狗概述1.1 看门狗框图1.2 窗口看门狗工作过程总结1.3 超时时间1.4 为什么需要窗口看门狗1.5 其他注意事项二、常用寄存器和库函数2.1 控制寄存器WWDG_ CR2.2 配置寄存器WWDG_ CFR2.3 状态寄存器WWDG_SR三、手写窗口看门狗3.1 配置过程3.2 初始化窗口看门狗…

android kotlin 协程(五) suspend与continuation

android kotlin 协程(五) suspend与continuation 通过本篇你将学会: suspendCoroutine{} suspendCancellableCoroutine{} suspend 与 continuation suspendCoroutine 第一次看到这玩意的时候肯定有点身体不适, 先不用管这个东西是什么, 目前为止 只需要知道 suspendCoro…

谈一谈你对View的认识和View的工作流程

都2023年了,不会还有人不知道什么是View吧,不会吧,不会吧。按我以往的面试经验来看,View被问到的概率不比Activity低多少哦,个人感觉View在Android中的重要性也和Activity不相上下,所以这篇文章将介绍下Vie…

【Python工具】WiFi工具

文章目录前言一、介绍二、使用步骤1.完整代码2.简单使用总结免责声明:前言 注意:此工具为自己测试,不可用作恶意使用。 考虑在windows中的wifi破解工具五花八门很多的广告程序,就自己写一个,原理比较简单&#xff0c…

11技术太卷我学APEX-数据加载

11技术太卷我学APEX-数据加载 0 所谓的数据加载 就是导入数据到数据库表中,本示例就采用Excel导入数据到《技术太卷我学APEX》的apex_learn表。表结构大概是这样的 CREATE TABLE "APEX_LEARN" ( "P_ID" NUMBER(17,0) NOT NULL ENABLE, &quo…

PMP真的有那么厉害?你需要考PMP吗?

这个含金量是有的,是目前项目管理界含金量较高的证书,但也要分人, 因为这是职业证书,主要用于提高职场工作能力,不搞这一行的,PMP证书含金量再高也是一张废纸,可以看下下面这张图,这…

【Redis】Redis 的过期策略以及内存淘汰机制详解

Redis 的过期策略以及内存淘汰机制详解1. Redis 的过期策略1.1 如何设置 key 的过期时间?1.2 key 设置且到了过期时间后,该 key 保存的数据还占据内存么?1.3 Redis 如何删除过期的数据1.3.1 定期删除1.3.2 惰性删除2. Redis 的内存淘汰机制2.…

智能新冠疫苗接种助手管理系统

项目背景介绍 近几年来,网络事业,特别是Internet发展速度之快是任何人都始料不及的。目前,由于Internet表现出来的便捷,快速等诸多优势,已经使它成为社会各行各业,甚至是平民大众工作,生活不可缺少的一个重…

【UE4 制作自己的载具】2-导入UE

在上一篇博客中(【UE4 制作自己的载具】1-使用3dsmax制作载具)已经完成了载具模型的制作,本篇需要完成的是将模型导入UE中并进行一些调整。本篇制作步骤:新建一个UE工程,可以添加一个载具模板创建一个“Vehicle”文件夹…

windows服务器上传文件解决方案

1.说明 1.如果上传到linux系统,通常使用ftp相关技术,配合windows端的ftp客户端工具比如FileZilla等进行大文件的上传工作。 2.同理windows服务器也可以开启ftp服务用来传输大文件。 3.本文介绍偷懒方式(常规是开启windows的ftp服务&#xff0…

案例|山东省中医院基于ZABBIX构建网络设备监控预警平台

作者介绍:董晨,山东省中医院信息科机房运维管理 本文从背景、演进、成效来分享建设过程,最终得出结论,类似Zabbix的国产成熟产品市场价值动辄上百万,而我们以极小成本,为医院节省了大量资金,取…

Java多线程(一)--多线程基础知识

1. 为什么要使用并发编程提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论上讲操作系统可以将多个线程分配给不同的CPU去执行,每个CPU执行一个线程,这样就提高了CPU的使用效率&…

通过NPM生态系统中的依赖树揭开脆弱性传播及其演化的神秘面纱

通过NPM生态系统中的依赖树揭开脆弱性传播及其演化的神秘面纱 本文实现了一个依赖约束解析器来解决NPM依赖约束的多样性,并在此基础上构建了一个完整的依赖漏洞知识图(DVGraph),以捕获所有NPM包之间的依赖关系。 https://www.se…

关于thumb2指令下函数运行地址对齐问题及验证固件分析

近期,在分析Thumb2指令的一个固件文件时,发现Thumb2指令集下执行函数的运行地址不对齐? 于是,为了分析一下原因,找了手头上现有的一款基于Cortex3内核的一块板子来实际执行看一下,结合编译后的Hex文件&…

【性能测试】loadrunner(一)知识准备

【性能测试】loadrunner(一)知识准备 目录:导读 1.0. 前言 1.1 性能测试术语介绍 1.2 性能测试分类 1.3 HTTP我们需要知道的 1.4 Loadrunner 12.55安装 1.0. 前言 ​ 在性能测试中,牵扯到了许多比较杂的知识点,…

Java文件IO操作:File类的相关内容

Java文件IO操作一、File类1.相对路径和绝对路径2.路径分隔符(同一路径下、多个路径下)3.实例化4.常见方法一、File类 File类继承自Object类,实现了Serializable接口和Comparable接口; File类属于java.io包; File类是文…

高通平台开发系列讲解(WIFI篇)802.11 基本概念

文章目录 一、WLAN概述二、802.11发展历程三、802.11基本概念沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文将基于高通平台介绍802.11基本概念。 一、WLAN概述 WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来,构成可以互相通…

Python计算 -- 内附蓝桥题:相乘,三角回文数

计算 ~~不定时更新🎃,上次更新:2023/02/23 🗡常用函数(方法) 1. 求一个整数的最末位 举个栗子🌰 n int(input()) end n % 10蓝桥例题1 - 相乘✖️ 题目描述 本题为填空题,…

【python学习笔记】:输出与输入

01 输出方式 表达式语句、print()函数和使用文件对象的write()方法。 02 输出形式 格式化输出str.format()函数、转成字符串可以使用repr()或str()函数来实现。 (1)repr():产生一个解释器易读的表达形式,便于字符串的拼接。 例:输出平方与…

OpenGL超级宝典学习笔记:着色器存储区块、原子内存操作、内存屏障

前言 本篇在讲什么 本篇为蓝宝书学习笔记 着色器存储区块 原子内存操作 内存屏障 本篇适合什么 适合初学Open的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重…