Redis追本溯源(四)集群:主从模式、哨兵模式、cluster模式

文章目录

  • 一、主从模式
    • 1.主从复制——全量复制
    • 2.主从复制——增量复制
  • 二、哨兵模式
    • 1.实时监控与故障转移
    • 2.Sentinel选举领导者
  • 三、cluster模式
    • 1.三种分片方案
    • 2.cluster模式

Redis 有多种集群搭建方式,比如,主从模式、哨兵模式、Cluster 模式。

一、主从模式

Redis 主从模式还解决了单点的问题。Redis 主库在进行修改操作的时候,会把相应的写入命令近乎实时地同步给从库,从库回放这些命令,就可以保证自己的数据与主库保持一致。那么,当主库发生宕机的时候,我们就可以将一个从库升级为主库继续提供服务;当一个从库宕机的时候,主库依旧可以处理写请求,其他从库依旧可以支持读请求,所以并不会影响整个 Redis 服务的读写。所以说,Redis 主从模式解决了 Redis 单点的问题。

在这里插入图片描述

1.主从复制——全量复制

在这里插入图片描述

2.主从复制——增量复制

主从复制的增量复制底层实现原理如下:

主节点的命令传播: 当主节点接收到客户端的写入命令(如SET、DEL等)时,会将这些命令先记录在自己的AOF文件和内存中,然后将这些命令逐个发送给所有连接的从节点。

命令传输到从节点: 主节点通过网络将写入命令发送给从节点,从节点收到命令后先保存在自己的缓冲区中。

从节点的执行: 从节点在空闲时,会从缓冲区中取出保存的命令,并按照主节点发送的顺序逐个执行这些命令。这样,从节点的数据状态会逐步与主节点保持一致。

初始复制和部分复制: 当从节点刚刚与主节点建立连接时,会进行初始复制,主节点会将自己的整个数据集发送给从节点。在初始复制完成后,从节点会继续接收主节点的增量命令,进行部分复制。

心跳检测: 主节点会周期性地向从节点发送心跳消息,以检测从节点的状态。如果从节点在一定时间内没有回应心跳消息,主节点会认为从节点下线,并将其标记为断线状态。

断线重连: 当从节点重新连接主节点时,主节点会根据从节点断线前的复制偏移量,发送增量命令给从节点,以确保数据的连续性。

通过增量复制,主节点只需要传输写入命令而不是整个数据集,大大减少了复制过程中的网络传输开销。从节点通过执行主节点的写入命令来更新自己的数据,实现了数据的同步和一致性。主从复制的增量复制是一种异步复制方式,所以主节点和从节点之间可能会存在一定的数据延迟,但它提供了高可用性和横向扩展的能力。

二、哨兵模式

一个 Sentinel 服务进程其实本身就是 Redis 实例,只不过这个 Redis 服务实例是以 Sentinel 模式运行的,它不对外提供读写键值对的服务,而是监控其他 Redis 服务实例是否运行正常,有点类似现实生活中监工的感觉。

为了防止 Sentinel 本身出现单点问题,一般会将多个 Sentinel 实例组成一个 Sentinel 集群。Sentinel 核心功能是监控线上 Redis 实例的状态,当发现某个主库故障的时候,Sentinel 会自动将故障的主库下线,然后从剩余的从库中选出一个合适的从库,提升为新一任主库,继续对外提供服务。

在这里插入图片描述

Sentinel 有选举的操作,所以一般推荐 Sentinel 集群的实例个数为奇数。
一个 Sentinel 集群可以监控多个 Redis 主从集群。

1.实时监控与故障转移

Redis Sentinel实现实时监控与故障转移的底层原理如下:

  • 1. 实时监控:

    • 定期检查:每个Redis Sentinel节点定期向被监控的Redis主从节点发送PING命令,以检查节点是否在线。同时,Sentinel还会使用INFO命令获取节点的运行状态信息,包括主节点的复制偏移量、从节点复制状态等。
    • 主观下线:如果一个Sentinel节点在多次检查中无法连接到主节点或从节点,它会将该节点标记为“主观下线”。这表示该Sentinel认为节点可能出现了故障,但并不是确定性的。
    • 共识达成:Sentinel集群中的多个Sentinel会进行共识达成,即判断节点是否真正宕机。当超过半数Sentinel认为某个节点处于主观下线状态时,该节点会被标记为“客观下线”。
  • 2. 故障转移:

    • 客观下线:一旦一个主节点被标记为“客观下线”,说明多数Sentinel都认为该主节点处于故障状态,故障转移过程会开始。
    • 领导者选举:在Sentinel集群中,会通过选举机制选出一个Sentinel领导者。领导者负责协调整个Sentinel集群的监控工作和故障转移过程。
    • 选举新的主节点:当主节点被标记为“客观下线”时,Sentinel集群会重新选举一个从节点作为新的主节点。这个过程是通过选举机制和投票来实现的,最终选出一个从节点作为新的主节点。
    • 切换从节点:一旦新的主节点选出,其他从节点会切换到新的主节点上,使得整个Redis集群恢复到正常的主从复制状态。

通过实时监控和故障转移,Redis Sentinel实现了高可用性,即使主节点出现故障,也能够快速选举新的主节点并恢复服务,保证了Redis集群的可用性和稳定性。这种机制允许Redis Sentinel对节点的状态进行实时监控,并自动进行故障转移,无需人工干预,提高了系统的自动化和可靠性。

2.Sentinel选举领导者

Redis Sentinel中领导者的选举是通过Raft算法实现的。Raft是一种一致性算法,用于在分布式系统中选举领导者,并确保所有节点达成一致的共识。在Redis Sentinel中,通过Raft算法选举领导者来实现Sentinel集群的协调和故障转移。

Redis Sentinel的领导者选举过程如下:

  1. 候选者(Candidate)状态:在Sentinel集群中,所有Sentinel节点都可以成为候选者。当一个节点启动时,它会进入候选者状态,并向其他节点发送选举请求。

  2. 提名和投票:候选者向其他节点发送选举请求,并提名自己作为领导者。收到选举请求的节点可以投票赞成候选者,也可以拒绝投票。每个节点只能投一票,并在收到多数节点的赞成票后成为领导者。

  3. 选举过程:当一个节点成为候选者后,它会等待其他节点的投票响应。如果候选者收到多数节点的赞成票,它就会成为领导者。否则,如果候选者在一定时间内没有收到足够的赞成票,它会放弃选举,重新进入候选者状态。

  4. 防止分裂:为了防止在网络分区等情况下出现多个领导者,Redis Sentinel使用了Raft算法的领导者选举机制。在选举过程中,如果出现多个候选者同时成为领导者,它们会通过心跳机制来进行竞争,最终只有一个领导者能够稳定下来。

    心跳机制是Raft算法中用于维持领导者与跟随者之间联系和状态同步的机制。一旦某个候选者成为领导者后,它会周期性地发送心跳消息给其他节点,其他节点会收到心跳消息后回复确认消息,表示它们承认该候选者为领导者。如果其他候选者没有得到多数节点的赞成票或在选举过程中没有成为领导者,它们会继续参与领导者的心跳竞争,但由于没有得到多数节点的确认,它们最终不会稳定地成为领导者。

  5. 领导者维持:一旦选举产生领导者,该领导者负责协调整个Sentinel集群的监控和故障转移工作。如果领导者节点宕机或离线,其他节点会重新进行领导者选举,选出新的领导者来代替。

通过Raft算法的领导者选举机制,Redis Sentinel确保了在分布式环境中选举出稳定的领导者,从而保证了Sentinel集群的协调和故障转移的可靠性和一致性。

三、cluster模式

Redis 主从复制可以实现读写分离,Redis Sentinel 模式可以实现自动故障转移,解决了 Redis 主从复制模式的高可用问题,看起来是个非常美好的方案。但 Sentinel 还是存在一个问题,那就是横向扩展问题。

在这里插入图片描述

在面对海量数据的时候,我们无法使用一个 Redis Master 存储全部数据,此时就需要一套分布式存储方案将数据进行切分,每个 Redis 主从复制组只存储一部分数据,这样就可以通过增加机器的方式增加 Redis 服务的整体存储能力。

1.三种分片方案

客户端分片、代理层分片以及 Redis Cluster 都是用于实现 Redis 数据分片(Sharding)的方法。

  1. 客户端分片:

    • 原理:在客户端分片中,应用程序自行实现数据分片逻辑。客户端根据某种规则(如哈希函数、范围等)将数据分散到不同的 Redis 节点。客户端需要维护一张分片映射表,来决定每个键应该存储在哪个 Redis 节点上。
    • 优点:实现简单,应用程序可以根据业务需求定制化分片逻辑。
    • 缺点:增加了客户端的开发和维护复杂性,对于节点动态增减等情况需要手动处理数据迁移。
  2. 代理层分片:

    • 原理:在代理层分片中,应用程序通过使用分片代理作为中间层,将数据的读写请求转发给不同的 Redis 节点。代理层维护了分片映射表,根据键的哈希值或范围来路由请求到相应的 Redis 节点。
    • 优点:客户端无需关心分片逻辑,简化了应用程序的实现,代理层处理了数据路由和节点动态增减的问题。
    • 缺点:引入了额外的网络开销和代理层的维护成本。
  3. Redis Cluster:

    • 原理:Redis Cluster 是 Redis 官方提供的分布式解决方案,基于一致性哈希算法进行数据分片。Redis Cluster 使用一致性哈希分片的方式将数据分布到不同的 Redis 节点上,并通过 Gossip 协议实现节点之间的信息交换和故障检测。
    • 优点:实现简单,自动处理数据迁移和节点动态增减,支持高可用性,可以容忍部分节点的故障。
    • 缺点:某些特殊场景下可能存在数据热点问题,对于大规模的集群可能需要引入虚拟节点技术。

Redis Cluster 是推荐的 Redis 分片解决方案,它提供了较好的性能、可靠性和扩展性,同时简化了开发和维护工作。客户端分片和代理层分片则更适用于一些特殊场景或自定义需求。

2.cluster模式

Redis Cluster 是 Redis 官方提供的分布式解决方案,用于将数据分布在多个节点上,实现数据的高可用性和横向扩展。其底层原理主要包括以下几个方面:

  1. 一致性哈希分片:

    • Redis Cluster 使用一致性哈希算法将键(Key)映射到一个固定大小的哈希槽(slot)上。Redis Cluster 中一共有 16384 个哈希槽,每个节点负责一部分槽的数据。根据键的哈希值,集群中的每个节点都能确定应该接管哪些槽的数据。
  2. 节点通信与故障检测:

    • Redis Cluster 中的每个节点都与其他节点保持持续的通信,使用 Gossip 协议进行信息交换。节点之间通过发送 PING、PONG 消息来检测对方是否在线,从而实现故障检测。
    • 当一个节点发现另一个节点不可用(无法收到 PING 回复),它会将该节点标记为下线,然后通过集群中其他节点来确认故障。一旦多个节点都确认某个节点下线,Redis Cluster 就会进行故障转移,选举一个新的主节点来接管失效节点的哈希槽。
  3. 主从复制:

    • Redis Cluster 中的每个主节点都可以有多个从节点。主从复制机制用于保障数据的冗余和高可用性。
    • 当一个主节点下线时,它的一个从节点会被晋升为新的主节点,继续处理客户端请求。这样可以确保数据的持久性和高可用性。
  4. 数据迁移:

    • Redis Cluster 允许节点动态增减。当新增节点加入集群时,其他节点会将一部分哈希槽的数据迁移到新节点上,以平衡负载。
    • 数据迁移通过异步传输(开启一个子线程),源节点将数据发送给目标节点,并在数据迁移完成后,确认数据同步成功。在数据迁移过程中,不会停止处理客户端请求。
  5. 客户端路由:

    • 客户端通过连接到任意一个节点来访问整个 Redis Cluster。当客户端发送请求时,节点会根据键的哈希值来路由请求到相应的节点,从而保证数据的一致性。

Redis Cluster 的底层原理主要依赖于一致性哈希分片和节点之间的通信与协作。它通过集群中多个节点的协作来实现数据的高可用性和分布式存储。在集群中节点的动态增减、数据迁移和故障转移等过程都是自动化的,使得 Redis Cluster 成为一个高性能、高可用性的分布式数据库解决方案。

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

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

相关文章

15.4 【Linux】可唤醒停机期间的工作任务

15.4.1 什么是 anacron anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。 其实 anacron 也是…

DERT:End-to-End Object Detection with Transformers

文章目录 摘要1、简介2、相关工作2.1、集合预测2.2、Transformer与并行解码2.3、目标检测 3、DETR模型3.1、目标检测集合预测损失3.2、DETR架构 4、实验4.1、与Faster R-CNN的对比4.2、消融4.3、分析4.4、用于全景分割的DETR 5、结论附录 AA.1、初步:多头注意层A.2、损失A.3、详…

Attacks in NLP

一、 Introduction NLP对抗攻击是人工智能对抗攻击的一个重要的组成部分,但是最近几年才逐渐开始兴起,究其原因在于NLP对抗攻击与传统computer vision或者audio对抗攻击有很大的不同,主要在于值空间的连续性(CV、audio&#xff0…

SpringCloud整体架构概览

什么是SpringCloud 目标 协调任何服务,简化分布式系统开发。 简介 构建分布式系统不应该是复杂的,SpringCloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的应用程序。SpringCloud是在SpringBoot的基…

【Wamp】安装 | 局域网内设备访问

安装教程: https://wampserver.site/article/1.html 下载 https://www.wampserver.com/en/ 安装路径上不能有中文 安装好之后图标呈绿色 放入网页文件 将网页文件放置于wamp文件夹的www子文件夹 例如:\Wamp\program\www 修改http端口 WAMP服务器…

C# 使用FFmpeg.Autogen对byte[]进行编解码

C# 使用FFmpeg.Autogen对byte[]进行编解码,参考:https://github.com/vanjoge/CSharpVideoDemo 入口调用类: using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using FFmpeg.AutoGen;namespace F…

虚拟世界探索:科技之下的未来可能性

随着科技的飞速发展,人们对于虚拟世界的憧憬和探索也日益加深。虚拟世界,那是一个超越现实的概念,一个充满想象力和创造力的领域。然而,虚拟世界究竟有可能实现吗?这是一个引人深思的问题。 虚拟世界,首先让…

激光切割机的操作中蛙跳技术是什么意思

其实,蛙跳技术就是指在激光切割机运行的过程中,机器换位置的方式。打个比方,你刚刚在这儿把孔1切好了,接下来就得跑到那儿把孔2切了。 在这个过程中,激光切割机就像是一只青蛙,要从一个位置跳到另一个位置。…

机器学习笔记值优化算法(十四)梯度下降法在凸函数上的收敛性

机器学习笔记之优化算法——梯度下降法在凸函数上的收敛性 引言回顾:收敛速度:次线性收敛二次上界引理 梯度下降法在凸函数上的收敛性收敛性定理介绍证明过程 引言 本节将介绍梯度下降法在凸函数上的收敛性。 回顾: 收敛速度:次…

数据结构 | 二叉树的应用

目录 一、解析树 二、树的遍历 一、解析树 我们可以用解析树来表示现实世界中像句子或数学表达式这样的构造。 我们可以将((73)*(5-2))这样的数学表达式表示成解析树。这是完全括号表达式,乘法的优先级高于加法和减法,但因为有括号,所以在…

【Linux进阶之路】进程(上)

文章目录 前言一、操作系统加载过程二、进程1.基本概念2.基本信息①运行并观察进程②创建子进程③僵尸与孤儿进程(父子进程衍生出来的问题)1. 僵尸进程(Zombie状态)2. 孤儿进程 3.基本状态①操作系统的状态(统一&#…

5.利用matlab完成 符号矩阵的转置和 符号方阵的幂运算(matlab程序)

1.简述 Matlab符号运算中的矩阵转置 转置向量或矩阵 B A. B transpose(A) 说明 B A. 返回 A 的非共轭转置,即每个元素的行和列索引都会互换。如果 A 包含复数元素,则 A. 不会影响虚部符号。例如,如果 A(3,2) 是 12i 且 B A.&#xff0…

【C++】红黑树模拟实现插入功能(包含旋转和变色)

红黑树模拟实现并封装为map和set 前言正式开始红黑树概念红黑树基本要求大致框架树节点树 调整红黑树使其平衡第一种:cur红,p红,g黑,u存在且为红第二种:cur红,p红,g黑,u不存在或为黑…

CentOS7安装Maven详细教程

😊 作者: Eric 💖 主页: https://blog.csdn.net/weixin_47316183?typeblog 🎉 主题:CentOS7安装Maven详细教程 ⏱️ 创作时间: 2023年08月06日 第一步:上传或下载安装包&#x…

2021年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;输出整数部分 输入一个双精度浮点数f&#xff0c; 输出其整数部分。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 一个双精度浮点数f(0 < f < 100000000)。 输出 一个整数&#xff0c;表示浮点数的整数部分。 样例输入 3.8889 样例输出 3…

opencv实战项目 手势识别-手势控制鼠标

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&…

设计模式--策略模式

目录 一.场景 1.1场景 2.2 何时使用 2.3个人理解 二. 业务场景练习 2.1业务: 2.2具体实现 2.3思路 三.总结 3.1策略模式的特点&#xff1a; 3.2策略模式优点 3.3策略模式缺点 一.场景 1.1场景 许多相关的类仅仅是行为有异&#xff0c;也就是说业务代码需要根据场景不…

Linux 创建子进程

文章目录 前言一、进程&#xff0c;线程&#xff0c;程序 区分二、创建子进程三、创建多个进程1. 获取进程号2. 循环创建多个进程 四、进程工具。1. ps 查看当前进程.2. kill 进程终止. 总结 前言 在计算机科学中&#xff0c;进程&#xff08;Process&#xff09;、线程&#…

Leetcode-每日一题【剑指 Offer 19. 正则表达式匹配】

题目 请实现一个函数用来匹配包含. 和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而*表示它前面的字符可以出现任意次&#xff08;含0次&#xff09;。在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。例如&#xff0c;字符串"aaa"与模式…

uniapp-----封装接口

系列文章目录 uniapp-----封装接口 uniapp-----分包 文章目录 系列文章目录 uniapp-----封装接口 uniapp-----分包 文章目录 前言 一、技术 二、封装步骤 1.准备 ​编辑 2.代码填充 request.js&#xff1a; api.js&#xff1a; min.js 页面使用 总结 前言 uniapp的主包要求大…