干货!Redis集群工作原理解析

作者 | 张小盼

头图 | 下载于东方IC

出品 | CSDN云计算(ID:CSDNcloud)

Redis 缓存因其访问性能高、可靠性更高,作为缓存工具在各大互联网公司中广泛使用。今天我们就来看看Redis Cluster 的实现原理。

 

集群建立

Redis集群是由多个Redis节点组成,每个Redis节点都是相互独立的,为了组建一个redis集群,我们需要使用CLUSTER MEET命令把他们连接起来。

节点A通过接收客户端发来的LUSTER MEET命令将另一个节点B加入到集群中,接收到命令的节点A将与节点B进行握手来来确认彼此的存在。下图显示了它们握手的过程。

握手完成后,节点A会将节点B的信息通过Gossip协议传播给集群中的其他节点,让其他节点与节点B完成握手,之后节点B就会被集群中的所有节点认识了。

 

槽指派

集群建立之后,那么接下来要解决的就是数据分布问题了。Redis缓存信息是使用 Key-Value 的形式来存储数据,Redis集群又将整个数据分布16384个槽中。在存储信息的时候,集群会对每个要存储的Key计算CRC16 校验值并对 16384 取模(slot = CRC16(key)%16384)。由于集群中的槽会被指派到不同的节点,从而实现了数据的分布式存储。

每个节点都保存着一个clusterNode结构,该结构里有一个slots属性记录了节点负责处理哪些槽。

1struct clusterNode{
2     //...... 
3     unsigned char slots[16384/8]; 
4     //...... 
5}

这个slots属性是个二进制位的数组,数组长度为16384/8=2048个字节,共包含16384个二进制位。每个二进制位代表一个槽,节点会根据二进制位上的值进行判断该节点是否负责处理这个槽,1代表处理,0代表不处理。

表格中代表的是该节点负责集群中的槽1、3、5、7,这种处理方式可以很快的得出节点是否负责处理某个槽的数据。

 

指令执行

在集群中的16384个槽都进行了指派之后,集群就进入了上线状态,这时客户端就可以向集群发送数据命令了。

当客户端向节点发送GET/SET指令时,收到指令的节点会先对指令操作的key进行计算,得出该key值应该存储在哪个槽中,并检查这个槽是否指派给了自己。

 

故障转移与恢复

Redis集群中的节点分为主节点(master)和从节点(slave),主节点主要负责处理槽,从节点则用于复制某个主节点数据,并在被复制的主节点下线时,代替主节点处理后续的命令请求。

针对节点下线有两种状态:

1.主观下线:当节点A想节点B发送了一条PING消息时,节点B没有在规定的时间内(设置的cluster-node-timeout参数)返回PONG消息,那么节点A会将节点B标记为主观下线状态。

这里的主观下线只是节点A主观的认为节点B下线了,有可能是因为节点A和节点B之间的网络断了,但是其他节点依然可以和节点B通讯,所以主观下线并不一定是节点B真的就下线了。

2.客观下线:由于节点A与集群内的其他节点仍然保持通讯,因此节点B的下线消息也通过Gossip协议传遍了集群内的其他节点。

当集群内半数以上的节点都认为节点B主观下线了,那么节点B就会被认为客观下线了,同时将节点B标记为客观下线的节点会向集群中发送一条FAIL消息,所有收到这条消息的节点会立即将节点B标记为客观下线。

如果一个节点被认为客观下线了,那么就需要从它的从节点当中选出一个节点来代替它成为主节点。选举过程如下:

a.当从节点发现自己正在复制的主节点被标记为客观下线时,从节点会向集群中发送一条CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST消息,要求所有收到这条消息的具有投票权的主节点向这个从节点投票

b.如果一个主节点具有投票权,并且未投票给其他从节点,那么这个主节点会向要求投票的从节点返回一条CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,表示这个主节点支持该从节点成为新的主节点

c.每个从节点都会接收返回的CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,并会进行统计自己得到了多少主节点的支持

d.每个具有投票权的主节点只能投一次票,当一个从节点获得了一半以上的主节点的支持票时,那么这个节点就会成为新的主节点,

e.如果没有任何一个从节点获取大于半数的投票,那么将进行新的选举,直到选出新的主节点为止。

f.新的主节点产生后,它会撤销所有对已下线的主节点的槽指派,并将这些槽指派给自己。

g.新的主节点会向集群中广播一条PONG消息,让集群中的其他节点直到这个从节点已经成为了新的主节点,并且接管了原先主节点的所有槽。

h.新的主节点负责接收和自己处理的槽相关的指令,至此故障转移结束。

 

结束语

本文通过对集群建立、槽指派、指令执行、故障转移与恢复的实现原理进行分析,一步一步的带大家认识Redis集群。希望对大家认识和了解Redis集群有所帮助。

作者简介:张小盼 中国农业银行研发中心,全栈运维研发工程师。

直播间地址:

https://live.csdn.net/room/csdnnews/B3423dYF

更多精彩推荐
☞三个月前被 K8S 弃用,Docker 火了!获 2300 万美元融资☞一招上手!这样设计扛住亿级流量活动系统☞Kubernetes 稳定性保障手册(极简版)
点分享点收藏点点赞点在看

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

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

相关文章

让小程序在自有App中启动的技术来了:mPaaS小程序架构深度解析

本文将围绕支付宝在移动端架构的演进逐步展开,分享我们在“App 动态性”“提升研发效率”等方面所做的思考和具体实践。同时,针对 mPaaS 小程序能力的开放,也将展开介绍我们如何实现“小程序代码只写一次,多端投放”,而…

抖音实战~分布式文件存储~SpringBoot集成MinIO

文章目录1. 引入依赖2. yml配置3. 客户端配置4. 工具类5. 需求实战6. 效果图1. 引入依赖 <!-- MinIO --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version></dependency>…

笑联 x mPaaS | 12 个模块,全面小程序化,如何打造真正的一次开发复用多端?

这篇故事围绕着一款 App 基于 mPaaS 小程序进行改造娓娓展开。 作为国内校园服务场景最丰富的平台&#xff0c;笑联 App 已覆盖国内 130 所高校&#xff0c;服务近百万高校学生。 截止目前&#xff0c;笑联 App 内的 12 个业务模块目前已顺利实现小程序化。不仅获得媲美原生应用…

万字长文梳理:从0开始,步入Service Mesh微服务架构的世界

来源 | 无敌码农责编 |贾凯强头图 | 下载于视觉中国新一代微服务架构——Service Mesh已经引发了诸多关注。在微服务架构盛行的今天&#xff0c;像Spring Cloud这样的微服务框架大家已然耳熟能详 &#xff0c;因为大部分互联网公司都在此基础上构建过第一代微服务体系&#xff…

开放下载!《大促背后的前端核心业务实践》

《大促背后的前端核心业务实践》电子书重磅发布! 2020年618大促已经过去&#xff0c;作为淘系每年重要的大促活动&#xff0c;淘系前端在其中扮演着什么样的角色&#xff0c;如何保证大促的平稳进行&#xff1f;又在其中应用了哪些新技术&#xff1f;淘系技术联合阿里云开发者…

33个常见问题!超全Windows排查手册

无论你是新手还是老手&#xff0c;你的Windows系统都会遇到不容易诊断的问题。而当发生这种情况时&#xff0c;你会怎么做&#xff1f;希望本书可以在系统出现问题但是又不知道到底发生了什么以及问题出现在哪里时&#xff0c;为大家提供解决思路和方法&#xff0c;高效的解决问…

上市之后,青云存储平台QingStor也要“进军”云原生

作者 | 陈利鑫头图 | 下载于东方IC出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;3 月 16 日&#xff0c;北京青云科技股份有限公司&#xff08;以下简称“青云科技”&#xff09;登录科创板&#xff0c;昔日里频频出现在公众视野的云计算企业&#xff0c;…

抖音实战~发布短视频流程梳理

文章目录一、传统文件上传1. 上传流程2. 上传时序图二、CDN文件上传2.1. 上传流程2.2. 上传时序图2.3. 方案评估一、传统文件上传 1. 上传流程 2. 上传时序图 二、CDN文件上传 2.1. 上传流程 2.2. 上传时序图 2.3. 方案评估 第一种文件上传&#xff0c;消耗带宽2次&#xff…

Docker中级篇|深入探究Docker

简介&#xff1a; 深入探究Docker Docker镜像理解 Docker镜像是什么 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;包括代码、运行时库、环境变量和配置文件 D…

掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地中篇

联席作者&#xff1a;吴毅挺 任浩军 童子龙 郑重鸣谢&#xff1a;Nacos - 彦林&#xff0c;Spring Cloud Alibaba - 小马哥、洛夜&#xff0c;Nacos 社区 - 张龙&#xff08;pader&#xff09;、春少&#xff08;chuntaojun&#xff09; 掌门教育自 2014 年正式转型在线教育以…

经典永不过时!重温设计模式

导语&#xff1a;在软工程中&#xff0c;设计模式&#xff08;design pattern&#xff09;是对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;所提出的解决方案。这个术语是由埃里希伽玛&#xff08;Erich Gamma&#xff09;等人在1990年代从建筑设…

抖音实战~项目关联UniCloud

文章目录一、云存储1. 登录UniCloud2. 创建服务空间3. 详情查看二、项目关联UniCloud2.1. 创建云开发环境2.2. 关联云服务空间2.3. 效果验证一、云存储 1. 登录UniCloud 链接&#xff1a;https://unicloud.dcloud.net.cn/login 云存储空间&#xff1a;https://unicloud.dcl…

Flutter+FaaS一体化任务编排的思考与设计

作者&#xff1a;闲鱼技术-古风 FlutterServerless三端一体研发架构&#xff0c;客户端不仅仅是编写双端的代码&#xff0c;而是扩展了客户端的工作边界&#xff0c;形成完整的业务闭环。在新的研发模式落地与实践的过程中&#xff0c;一直在思考如何提高FaaS端研发体验与研发…

抖音实战~实现App端视频上传、发布、落库

文章目录一、API阅读1. 选择或拍摄视频2. 云函数API~文件上传3. 视频截帧二、App端视频上传流程2.1. 上传流程图2.2. 流程简述三、前端源码实战3.1. 选择/拍摄短视频3.2. 短视频上传3.3. 进度条页面3.4. 补充短视频内容3.5. 视频发布3.6. 视频预览四、后端源码实战4.1. 短视频发…

从微服务到 Serverless | 开源只是开始,终态远没有到来

开源只是开始&#xff0c;终态远没有到来。 从微服务开源&#xff0c;到 Serverless 开源&#xff0c;我们正持续将阿里沉淀的技术能力进行开放。 只是这一次不同的地方在于&#xff0c;借助 Serverless 能力的释放&#xff0c;将帮助前端进入一个崭新的时代&#xff0c;只需…

从Python到AI,这条路好走吗?

大家都在学Python的时候&#xff0c;怎么才能让自己更有竞争力&#xff1f;Python 的应用方向有很多&#xff0c;基本每个方向都是大热门&#xff0c;但至今为止&#xff0c;人工智能行业仍处于人才稀缺的情况。正因这样&#xff0c;近几年来&#xff0c;AI 成为了广大 Python …

Flutter瀑布流及通用列表解决方案

作者&#xff1a;闲鱼技术-夜澜 背景 目前闲鱼业务中无论是首页还是搜索页都有大量可以落地瀑布流的场景&#xff0c;而在Flutter原生中只提供了ListView, GridView&#xff0c;无法提供自定义布局的能力。 而在社区中&#xff0c;一般瀑布流的解决方案都是基于SliverMultiB…

闲鱼的商品结构化是如何演进的(超详细)

作者&#xff1a;闲鱼技术-吴白 引言 商品的信息结构化程度在某种意义上来说决定导购效率的天花板。闲鱼商品结构化和淘宝/天猫最大的区别在于闲鱼卖家都是个人用户&#xff0c;无论是专业程度还是行动力远不及淘宝卖家。为了不阻碍商品发布&#xff0c;闲鱼一直倡导轻发布&a…

一文看懂5G射频的“黑科技”

作者 | 小枣君来源 | 鲜枣课堂&#xff08;ID&#xff1a;xzclasscom&#xff09;手机&#xff0c;作为移动互联网时代的标配&#xff0c;已经走进了我们每个人的生活。有了它&#xff0c;我们可以随心所欲地聊天、购物、追剧&#xff0c;享受美好的人生。正因为手机如此重要&a…

抖音实战~首页视频~下拉刷新

文章目录1. 配置下拉刷新2. 下拉刷新监听3. tab监听索引4. 控制台监控5. 父子组件调用6. 效果图1. 配置下拉刷新 在pages.json配置文件中添加如下配置&#xff1a; "enablePullDownRefresh":true //开启下拉刷新2. 下拉刷新监听 // 当前页下拉刷新onPullDownRefre…