【Redis】Redis高可用之Redis Cluster集群模式详解(Redis专栏启动)

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文目录
本文导读
一、什么是集群模式
1、集群模式的必要性和基本概念
2、集群模式拓扑结构
二、集群中数据如何分区(Hash Solt)
三、Redis集群的原理
四、Master 节点故障处理方式
五、Redis集群的伸缩(扩容与缩容)
1、集群伸缩原理
2、Gossip协议
总结
本文导读
本文是继,Redis高可用之Cluster主从模式详解、Redis高可用之Sentinel哨兵模式详解 ,的Redis高可用与系列第三篇。
本文主要讲解什么是集群模式,集群模式的必要性、基本概念和拓扑结构,集群中数据Hash Solt分区的原理,节点故障处理方式与集群的伸缩。
一、什么是集群模式
1、集群模式的必要性和基本概念
Sentinel 模式的最大缺点是所有数据都放在一台服务器上,无法横向扩展,为了解决哨兵模式的问题,集群模式应运而生。
主从模式:Redis高可用之Cluster主从模式详解,哨兵模式:Redis高可用之Sentinel哨兵模式详解
如前所述,主从系统有高可用性和分布性问题,哨兵模式只解决了高可用性问题,集群模式可以解决高可用性和分布问题的终极解决方案。 哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高,但是它每个节点存储的数据是一样的,浪费内存,在Redis3.0后开始支持集群模式。
分片集群模式是将一部分数据存储到每个Redis服务器,所有Redis服务器的数据相加形成一个完整的数据(分片集群或者分布式)。它实现了Redis的分布式存储,对数据进行分片,也就是说每台Redis节点上存储不同的内容,来解决在线扩容的问题。所以要形成分片集群,需要路由不同的密钥。一般使用两种通用的路由方案客户端路由(SDK)和服务器路由(Proxy),客户端路由的代表(Redis Cluster),服务器端路由的代表(Codis)。
2、集群模式拓扑结构

Redis集群由多个Redis节点组成,节点组中是主节点(Master)和从节点(Slave),两者之间的数据是准实时一致的,这是由异步主备复制机制保证的。
如上图所示,一个节点组只有一个主节点,同时可以有0到多个从节点,在这个节点组中,只有主节点为用户提供一些服务,读服务可以由主节点或从节点提供。上图包含三个主节点和对应于主节点的三个从节点。
通常,一组集群至少需要六个节点才能确保完全的高可用性。三个主节点将被分配不同的 slot 插槽(表示数据分区间隔)。当主节点发生故障时,从节点将自动选择出新的主节点继续提供服务。
二、集群中数据如何分区(Hash Solt)
Redis集群模式使用 slots 插槽,一个集群有 16384 个哈希槽将分配给不同的Redis实例。此外,Redis集群模式没有中心节点,每个主节点将保持与其他主节点的连接,节点通过 gossip协议 相互交换信息,同时,每个主节点都具有一个或多个从节点。
当客户端连接到集群时,它直接连接到Redis集群的每个主节点,并根据哈希算法将密钥存储在不同的哈希槽中。例如上图,Redis集群按数据碎片划分的16384个哈希槽,分别存储在三个主节点中:Master1负责哈希槽0~5460、Master2负责哈希槽5461~10922、Master3负责哈希槽10922~16383。
三、Redis集群的原理

Redis集群通过数据分区实现数据的分布式存储(在创建集群时完成),并通过自动故障切换实现高可用性。
Redis集群通常由多个节点组成,设置节点时,节点数至少为6个以确保集群完整且高度可用,每个节点都需要启用和配置 cluster-enabled yes(启动集群),以在集群模式下运行Redis。
节点握手是指以集群模式运行的一组节点通过 Gossip协议 相互通信,以实现对彼此的感知的过程。节点握手是集群之间通信的第一步。客户端启动命令:cluster meet{ip}{port}。节点握手后,Redis节点形成一个多节点集群。
Redis集群将所有数据映射到16384个插槽,每个节点对应几个插槽(必须全部使用),只有当节点分配了时隙时,它才能响应与这些时隙相关联的密钥命令,通过 cluster addslots命令为节点分配插槽。
四、Master 节点故障处理方式
Redis集群中的主节点故障处理模式与哨兵模式类似,但是Redis集群中所有的节点都要承担状态维护的任务。
当一个节点无法成功完成与集群中另一个节点的ping消息通信时,该节点将被标记为主观离线状态,并且信息将被广播到整个集群。
如果节点接收到的节点丢失连接的数量达到集群的大多数,则该节点将被标记为目标脱机状态,并且脱机节点的故障消息将被广播到集群。然后,故障节点将立即从主节点切换到从节点。恢复原始主节点后,它将自动成为新主节点的从节点。如果主节点没有从节点,则集群在发生故障时将不可用。

在投票选举阶段,失败的主节点也计入投票数。假设集群中节点的大小为3个主节点和3个从节点,其中2个主节点部署在一台机器上,当此机器停机时,故障切换将失败,因为从节点无法收集3/2+1个主节点的投票(故障查找链路也会发生)。因此,在部署集群时,所有主节点都需要部署在至少三台物理机器上,以避免单点问题。

五、Redis集群的伸缩(扩容与缩容)
1、集群伸缩原理
扩容与缩容类似,都是先把插槽和数据迁移到其他节点,然后把相应的节点下线。
当新节点添加到集群时,它将与集群中的节点握手,该节点将通过gossip协议将集群中其他节点的信息发送到新节点,新节点将在与这些节点握手后加入集群,然后集群中的节点将加入哈希槽并将其分配给新节点。
2、Gossip协议
Gossip protocol(gossip协议),它的特点是,在节点数量有限的网络中,每个节点都会随机(不是真的随机,而是根据规则选择通信节点)与一些节点通信,在混乱的通信之后,每个节点的状态将在一定时间内达到相同。
Gossip 协议包含多种消息,包括ping(在节点故障发现的时候使用),pong(接收节点回复),meet(在节点握手的时候使用),fail(自动故障转移、下线、故障选举)等等。也有一些缺点,例如数据更新的延迟可能导致集群的某些操作滞后,消息延迟、消息冗余等等。
总结
本文是继,Redis高可用之Cluster主从模式详解、Redis高可用之Sentinel哨兵模式详解 ,的Redis高可用与系列第三篇。
本文主要讲解什么是集群模式,集群模式的必要性、基本概念和拓扑结构,集群中数据Hash Solt分区的原理,节点故障处理方式与集群的伸缩。
相关文章:
【Redis】Redis高可用之Redis Cluster集群模式详解(Redis专栏启动)
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公…...
1.8 正则表达式
正则表示式是用来匹配与查找字符串的,从网上爬取数据不可避免的会用到正则表达式。 Python 的表达式要先引入 re 模块,正则表达式以 r 引导。Re库主要功能函数函数说明re.search()在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象…...
Postgresql 根据单列或几列分组去重row_number() over() partition by
Postgresql 根据单列或几列分组去重row_number() over() partition by 一般用于单列或者几列需要去重后进行计算值的 count(distinct(eid)) 可以 比如有个例子,需要根据名称,城市去筛选覆盖的道路长度,以月因为建立了唯一索引是ok的&#…...
基于蒙特卡洛法的规模化电动车有序充放电及负荷预测(PythonMatlab实现)
💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅主要研究方向是电力系统和智能算法、机器学…...
Selenium常用API详解,从入门到进阶(全套)
目录 1、打开页面 2、查找页面元素 3、输入文本 4、点击操作 5、提交操作 6、清除文本 7、获取文本、属性 8、获取页面的标题和URL 9、窗口 9.1、设置窗口大小 9.2、窗口切换 9.2.1、为什么需要窗口切换? 9.2.2、获取句柄的方式 9.2.3、切换句柄 10、…...
自从学会了Python,我实现了壁纸自由(6)
小朋友们好,大朋友们好!我是猫妹!哈哈哈,又到周末啦!这周过得怎么样?马上就要开学了,寒假作业早已写好了吧?开学让人兴奋,上了很久网课都要吐啦!开学也让人有…...
Ruby 发送邮件 - SMTP
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 Ruby提供了 Net::SMTP 来发送邮件,并提供了两个方法 new 和 start: new 方法有两个参数&am…...
Python爱心代码
前言 Python漂浮爱心,具体源码见:Python动态爱心代码_爱心代码-Python文档类资源-CSDN下载 爱心类 class Heart(): #每个爱心(爱心类) def __init__(self): self.r ra.randint(10,15) #爱心的半径 …...
【二分查找法及其应用】
文章目录一. 前提二. 基本思路三. 代码实现四. 封装在STL中的二分查找算法五. 浮点数二分一. 前提 待查找的序列是有序的;待查找的 a 采取顺序存储结构。 二. 基本思路 设在升序序列 a [ low…high ] 查找的 k , 首先找中间值 mid a [ ( lowhigh )/2 …...
Android 进阶——Framework核心 之Binder Java成员类详解(三)
文章大纲引言一、Binder Java家族核心成员关系图二、Binder Java家族核心成员源码概述1、android.os.IBinder1.1、boolean transact(int code, Parcel data, Parcel reply, int flags) send a call to an IBinder object1.2、String getInterfaceDescriptor()1.3、boolean ping…...
Maven
Maven 1.什么是Maven 官方网站 https://maven.apache.org/ Maven是一款服务于Java平台的自动化构建工具,它可以帮助我们更方便的对项目进行构建、管理项目jar包 ,包括: bulid 项目,切换 jar 版本,添加 jar, 删除 jar 包等 1.…...
1947抓住那头牛(队列 广度优先搜索)
目录 题目描述 解析 解题思路 代码部分 代码部分 运行结果 看看len数组中各个位置的标记值 为什么这样做一定是最短路径: 题目描述 农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<N<100000)&…...
基于linux5.15.5的IMX 参考手册 ---21
基于linux5.15.5的IMX 参考手册 — 21 10.5.2高清多媒体接口(HDMI)和显示端口(DP)概述 10.5.2.1测试名称 •mxc_cec_test.out 10.5.2.1.1位置 /unit_tests/HDMI/ 10.5.2.1.2功能 验证HDMI CEC功能并向HDMI接收器发送断电命令。 1…...
Android Dalvik虚拟机 堆初始化流程
前言 上篇文章介绍了dalvik虚拟机启动流程,在dalvik虚拟机启动时调用了dvmGcStartup来启动堆。 本文介绍我们在日常开发使用Java时的堆创建流程。 Dalvik堆介绍 Dalvik虚拟机中,堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中ÿ…...
0讲(补)——开发前必备基本常识
前言 专栏内容持续补充更新,目前正在进行优惠活动 目录 前言 一、函数的声明和定义 二、预编译 三、串口打印中的printf函数的使用...
JS学习笔记
1.WebAPIs简介导读Web APIs 和JS 基础关联性JS 基础阶段以及 Web APIs 阶段JS基础学习 ECMAScript 基础语法为后面作铺垫,Web APIs 是JS 的应用,大量使用JS基础语法做交互效果①JS 基础阶段我们学习的是ECMAScript 标准规定的基本语法要求同学们掌握JS 基…...
linux005之用户、组管理
linux用户管理简介: 任何使用linux系统的用户,都必须使用一个合法的账号和密码,账号和密码一般都是超级管理员创建,当然普通用户也可以创建用户,前提是必须拥有创建用户权限。 root是linux系统中默认创建的超级用户 创…...
列线图工具_Nomogram
定义 列线图是一种相对传统的分析方法,用于展示自变量和因变量的线性关系,及其特征的重要程度。 现在用SHAP,和机器学习库中的 Feature importance 工具可以实现类似甚至更好效果。不过很多传统的研究领域比较认这种方法。 列线图工具建立在…...
【C++】类和对象(一)
目录一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1、访问限定符4.2、封装五、类的作用域六、类的实例化七、类对象的大小八、this指针8.1、this指针的引出8.2、this指针的特性8.3、C语言和C实现Stack的对比一、面向过程和面向对象初步认…...
Python获取搜索引擎结果
前言 想快速获取各个高校的博士招生网站,于是通过python先获取出有可能包含高校博士招生网站的URL,然后通过人为筛选得到了想要的招生网站(注意,并非直接爬取,是间接获取的)。 整理了一份网站名单&#x…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
