【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…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
