作者 | 张小盼

头图 | 下载于东方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 稳定性保障手册(极简版)
点分享点收藏点点赞点在看

干货!Redis集群工作原理解析相关推荐

  1. 天天用着Redis集群,主从同步该知道吧?集群工作原理是否需要了解下?

    作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 前言 插播一个小插曲,本来文章已经写好准备发布了,手贱清理了缓存导致文本内容全部 ...

  2. 升腾威讯怎么恢复集群_Redis系列(四):天天用着Redis集群,主从同步该知道吧?集群工作原理是否需要了解下?...

    作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 前言 插播一个小插曲,本来文章已经写好准备发布了,手贱清理了缓存导致文本内容全部 ...

  3. 第12 课:HA下的Spark集群工作原理解密

    第12 课:HA下的Spark集群工作原理解密 本期内容: 1.Spark高可用HA实战 2. Spark集群工作原理详解 1,Spark高可用HA实战 Spark本身是Master/Slaves结构 ...

  4. Redis集群的原理和搭建

    Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Re ...

  5. Redis集群选举原理与脑裂问题

    系列文章目录 第一节 Redis的安装 第二节 Redis的五种数据结构(String.Hash.List.Set.ZSet) 第三节 Redis的持久化方式 第四节 Redis主从架构 第五节 Re ...

  6. Redis哨兵 详解 原理解析

    Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复. 1.1.哨兵原理 1.1.1.集群结构和作用 哨兵的结构如图: 哨兵的作用如下: 监控:Sentinel 会不断检查您的ma ...

  7. redis 集群模式原理

    一.Redis分布式扩展之Redis Cluster方案 主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题.而且每个节点都保存了所有数据,一个是内存的占用率较高 ...

  8. Redis 集群搭建原理

    一.设计的主要特性和基本原理 1.集群目标 Redis 集群是 Redis 的分布式实现,在设计中按重要性顺序具有以下目标: 高性能和线性可扩展性,多达 1000 个节点.没有代理,使用异步复制,并且 ...

  9. Redis集群分片原理

    转载:http://blog.csdn.net/shmnh/article/details/72868328 Redis集群的目的是实现数据的横向伸缩,把一块数据分片保存到多个机器,可以横向扩展数据库 ...

最新文章

  1. 洛谷 P2415 集合求和【数学公式/模拟】
  2. 测试 Zoundry Raven
  3. cors漏洞 复现_Jsonp跨域漏洞浅析
  4. HADOOP2.5.0_64安装日志
  5. 信息学奥赛一本通 1135:配对碱基链 | OpenJudge NOI 1.7 07
  6. Spring Cloud微服务系列-Eureka Client源码解析(二)
  7. 知识图谱入门 , 知识抽取
  8. CentOS 5.11下Oracle 11G R2 Dataguard搭建
  9. Excel VBA 巧用自定义函数进行数组去重
  10. 修改系统UISearchBar搜索框的样式-搜索图片、背景颜色
  11. 使用笔记:AWTK中文键盘按键字体加大
  12. php高仿网络硬盘,高仿永硕网盘E盘源码
  13. MATLAB实现雅可比与高斯塞德尔迭代
  14. MOOC《Python网络爬虫和信息提取》(第11次)网络爬虫之框架(第4周)
  15. HUAWEI电脑管家非华为机型安装教程,内有百度网盘链接,内容完全免费,自取。
  16. 什么是 SourceMap?
  17. 电工知识 电气图形符号和电气文字符号大全
  18. 怎样量化评价搜索引擎的结果质量
  19. 优思学院:六西格玛证书究竟怎么获得?
  20. mysql判断为0或空_0和空的判断

热门文章

  1. mpython 直接访问_如何从python代码中直接访问Android的Service
  2. ipv6+ssh+java_IPv6的本地联网地址计算方法详解
  3. php基础教学笔记,php学习笔记:基础知识
  4. java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序
  5. java右移位_java 、移位操作方法
  6. mysql登录root 1130_通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
  7. python调用matlab函数_从python调用MATLAB函数
  8. 基金本子提交在即!这11个问题现在改还来得及
  9. 平时的鸿星尔克VS开挂后的鸿星尔克
  10. 北大学霸:高考有漏洞可钻,学会套路,立马提分,屡试不爽!