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

news2024/11/28 0:38:30

文章目录

  • 一、主从模式
    • 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.coloradmin.cn/o/843987.html

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

相关文章

一些不错的VSCode设置和插件

设置 同步设置 我们做的各项设置,不希望再到其他机器的时候还得再重新配置一次。VSCode中我们可以登陆微软账号或者GitHub账号,登陆后我们可以开启同步设置。开启设置同步,根据提示登陆即可。 允许侧边栏水平滑动 在目录层次较深或者文件…

Leetcode-每日一题【剑指 Offer 07. 重建二叉树】

题目 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7]Output: [3,9,20,null,null,15,7] 示例 2: Input: preo…

【Python小demo】JOJO替身面板生成

文章目录 1 前言2 代码实现3 总结 1 前言 最近暑假在数模研赛备赛,情理之中地接触了一些图表。也是第一次才知道雷达图这么个图表形式,用于直观地评价多个变量或指标。看到雷达图,我不禁联想到了JOJO中的替身面板,于是兴起想用Py…

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用,与任何其他平台的部署相同,可以2种方式: 依赖于框…

Zebec Protocol ,不止于 Web3 世界的 “Paypal”

Paypal 是传统支付领域的巨头企业,在北美支付市场占有率约为 77% 以上。从具体的业务数据看,在8月初,Paypal 公布的 2023 年第二季度财报显示,PayPal 第二季度净营收为 73 亿美元,净利润为 10.29 亿美元。虽然 Paypal …

【C# 基础精讲】运算符和表达式

在C#编程中,运算符和表达式是构建复杂逻辑的关键元素。运算符用于执行各种数学、逻辑和其他操作,而表达式则由运算符、变量、常量和函数组成,用于生成计算结果。本文将详细介绍C#中常见的运算符和表达式的概念,以及它们在程序中的…

全面讲解最小二乘法

常见的最小二乘法我们就不多说了,下面主要介绍一下最小二乘法的一些先进方法。 正则化的最小二乘法 在使用常见的最小二乘法进行回归分析时,常常会遇到过拟合的问题,也就是在训练数据集上表现的很好,但是在测试数据集上表现的很…

Flutter 让软键盘不再自动弹起

1、问题说明: 在开发中,经常遇到这种事,一个页面有输入框,点击输入框后,会弹起软键盘,同时输入框会聚焦,手动收起软键盘后,点击另一个按钮前往下一个页面或者显示一个弹窗&#xff0…

heima头条项目学习--Day1: 环境搭建、SpringCloud微服务(注册发现、网关)

Nacos注册发现、网关 a. 项目介绍b. app登录1) 需求分析2) 表结构分析3) 手动加密(md5随机字符串)4) 用户端微服务搭建5) 功能实现6) app网关7) 网关校验jwt8) 前端集成, 配置nginx a. 项目介绍 业务说明 技术栈说明 [外链图片转存失败,源站可能有防盗…

Nginx的优化和防盗链(面试高频!!!)

Nginx的优化和防盗链 全篇高能!!!!干货较多!!!!本篇含面试高频题: 修改配置文件时,先备份!!!以便回滚!&…

API接口:企业信息核验

企业信息核验是现代企业管理中必不可少的一项业务,它可以帮助企业做出正确的决策。在这篇文章里,我们将会介绍如何使用API接口来对企业信息进行核验,并实现快捷、准确的查询。 一、API接口 在这里我们使用的是挖数据提供的企业信息核验API接…

医学影像PACS临床信息系统源码

医学影像临床信息系统(Picture Archiving and Communication Systems)PACS是指从医疗影像设备中获得数字影像,利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统,能实现影像数字化、无胶片化管理。 登记系统 …

MyCat水平分表

1.水平拆分案例场景 2.MyCat配置 这个表只是在 schema.xml配置的逻辑表,在具体的数据库里面是没有的 根据id的模确定数据存在哪个节点上!!

8.7 作业 c高级

1.写一个函数,获取用户的uid和gid并使用变量接收: #!/bin/bash function fun() {uidid -u ubuntugidid -g ubuntu }funecho "UID: $uid" echo "GID: $gid"思维导图:

(树) 剑指 Offer 54. 二叉搜索树的第k大节点 ——【Leetcode每日一题】

❓剑指 Offer 54. 二叉搜索树的第k大节点 难度:简单 给定一棵二叉搜索树,请找出其中第 k 大的节点的值。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出…

【多音音频测试信号】具有指定采样率和样本数的多音信号,生成多音信号的相位降低波峰因数研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Jmeter响应中的乱码问题

文章目录 问题描述解决办法 问题描述 Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码 响应页面没有做编码处理,JMeter默认按照ISO-8859-1编码格式进行解析 解决办法 在线程组中添加BeanShell PostProcessor后置处理器 prev.setDataEnco…

爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028

然后再来看字符串的高级操作 取长度 查找字符串下标位置 判断是否以某个字符,开头结尾 计算字符出现次数 替换

STM32调试过程中的使用技巧及解决办法

文章目录 技巧 1.定时器使用过程中,分频系数越大,定时误差越大,越不准确。问题 2.编译时出现下述警告:解决办法: keil5 编译提示 single-precision operand implicity converted to double-precesion,意思是…

生成小程序二维码、小程序码

微信自定义生成二维码 使用微信云开发生成自定义二维码、小程序码话不多说,我们先来看最终的展示效果生成码有三种方式操作步骤1. 云环境的初始化2. 在页面上开辟一个容器来展示二维码(包括预览和保存到相册的按钮)3. 创建云函数4. 生成二维码…