面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本文介绍Redis集群的方式和Leader选举的原理。

一、前言



作为一名Java程序员,Redis底层的一些原理是我们不必学会就可以搬砖工作的一种技能点,但是小编为什么还要讲一下呢?难道就是为了浪费大家1分钟的宝贵时间,一个人1分钟,50万人就是1年,5000万人就是100年,赚了,小编以一己之力成功搞挂一个人(血赚)。


当然不是,并且小编的文章也没有那么多人看,最多也就浪费个肾吧。


学习Redis底层原理是因为面试官要问啊!,所以我们就要学,什么?不实用的你不学?那邻居小编可要使劲学啦,到时候面试官只要小编不要你。


至于你问为什么面试官要问Redis底层原理呢,这个。。。我把这次机会留给你,下次你面试的时候面试官问:“讲一下Redis底层原理”。你:“面试官你好,请问为什么你要问Redis底层原理呢,你给我台电脑,我五分钟给你搭建好图书管理系统他不香吗,咱们键盘上见真章”。这时面试官就会告诉你答案,你就可以把答案打在评论区,让小奇以及众多小伙伴一起知道一下到底为什么要问?


二、面试



在一个晴朗的周日,我来到了一个陌生的园区(别问为什么是周日,问就是997,不过为了填饱肚子的打工人,只能明知山有虎、偏向虎山行),坐在陌生的会议室,等待HR小姐姐去叫面试官,此时我的心情和各位小伙伴一样五味杂陈,担心面试官问的会不会很难?问到我的知识盲区我该怎么办?一会自我介绍的时候要不要吹一下我和小奇的关系?


一位英俊潇洒,眼神犀利的面试官走了进来,看到他那犀利、仿佛能看穿一切的眼神 ,我在想要不然一会就不要20k了,要8k得了,这个面试官一看就不好糊弄啊,但是我想起来我来之前刚看了小奇的趣学编程系列,我已经完全学会了小奇的精髓,我顿时就来了底气,决定一会要30k,不给就学小奇赖着不走(哈哈)


面试官:小奇是吧,带简历了吗?


我:没带,现在彩印两块一张,我简历五张,每次面试都要花费十块,我朋友说了还没工作就先让你掏钱的工作不要去。


面试官:。。。那你靠什么来征服我,让我录用你


我:气质?


我只好从我的双肩包中拿出了我上午从其他公司面试官手中要回的简历,上午的情形是这样的。


上午的面试官:今天的面试就到这吧,回去等通知吧!


我:面试官你好,如果贵公司不打算录取我的话,能不能把我的纸质简历还给我,我下午还有一家面试。


上午的面试官:我说你的简历怎么皱皱巴巴,原来你一直在循环利用啊!这个症状出现多久了?


我:半拉月了。。。


(当我把皱皱巴巴的简历交给面试官后,这场面试才得以继续进行。。。)


三、Redis哨兵集群



面试官:我看你简历上写的精通Redis?(哼,面试官轻蔑的一笑)


(看着面试官轻蔑的笑容,我忍不住拿出了我的Redis书籍推给了他)


我:这本书我倒背如流,你随便提问,答不上来算我输,答上来你就要为你的轻蔑向我道歉。


1.jpg


(此时面试官看着书若有所思,我怀疑他肯定在想他对这本书的了解程度吧)


面试官:好吧,那你先说一下Redis有哪些集群方式呢


我:Redis主要有两种持集群方式,哨兵集群和Cluster(高可用)集群。


面试官:可以说一说两者的区别和如何配置使用吗


我:上次面试我已经简单说了一下哨兵模式,现在再来简单看一下


2.png


这里我们可以看到客户端只能连接一个哨兵集群,也就是说客户端在写入数据的时候只能通过哨兵集群告诉的地址来进行写入


假如主节点挂了,那么哨兵选举一个从节点成为主节点,在这期间客户端来访问是被阻塞的,因为主节点正在被选举,还不知道谁是主节点呢,怎么插入数据。


那么为了解决这个问题,我们可以使用高可用集群模式Cluster模式,也可以称之为多个主从节点(主从节点上一章讲过)模式集群


四、Redis高可用集群Cluster模式



面试官:能说一下高可用集群模式具体是怎么一个流程吗,为什么可以解决选举等待问题?


我:(能不说吗。。。)


3.png


通过图中可以看出我们客户端通过访问入口可以访问多个主节点,如果其中一个主节点挂了,那么其他的主节点还可以正常工作不受影响。


面试官:这么多主节点,我哪知道我set一个数据应该放入到哪个主从结构里面呢?


我:(你随机放一个不就行了吗。。。不对,随机放一个取的时候就不知道去哪个主从结构里去取了,总不能每一个主节点里面都去查找一遍吧)


我:他会根据要set进去的key进行一个hash计算,计算完后就知道要往哪个主节点里面存放值了,取得时候也根据key进行一个hash计算,就知道去哪个主节点里拿取了。


4.png


面试官:那这个时候来一个age计算hash是150要插入哪个主节点


我:肯定是第二个主节点啊,redis集群采用分片模式,将所有数据分片放入多个主节点中,方便与水平扩展。


面试官:如果主节点挂了,哨兵模式下哨兵集群会选举出一个主节点,那你这种高可用模式,如果一个主节点挂了,怎么选举呢?


我:(应该是按照大小个吧。。。)


面试官:你特么找打是吧,数据那特么有大小个。。。


五、Leader选举原理



我:这个时候就需要其他主节点来支持选举了,我来用一张图描述一下。


6.png


我:我们可以把这三个主从节点看做是三个国家,如果一个国家的头目挂掉了,那么他底下其中一股势力就会找其他的国家头目来支持自己成为头目。


我:当然其他国家的头目不会看你国家这两股势力哪个好哪个坏,而是哪个先找我我就支持你。


我:而且图中有三个国家,支持自己的票数必须超过总国家的一半以上,也就是最少要有两票支持,所以redis集群节点最少要三个主从结构,不然的话两个没办法选举,票数最多一票不够两个国家的半数以上。


面试官:还别说你小子使用这个图讲的是有声有色


我:你这不废话吗,趣学编程不趣学那还学个屌。。。


面试官:那塔利班和正规军他们两个怎么确定谁先发出请求呢,肯定是谁先发出消息谁赢呗?


我:他们两个小势力并不是头目挂了就立马发出请求支持消息,而是有一定的延迟时间,这个延迟时间根据一个公式计算,公式中包含随机数,和根据SLAVE_RANK的大小来计算,SLAVE_RANK的大小表示从节点从主节点同步的数据总量的Rank。Rank越小代表一复制的数据越新,可以做主节点。


延迟公式:DELAY = 500ms +random(0 ~ 500ms) + SLAVE_RANK * 1000ms


面试官:假如现在网络抖动,从节点一瞬间连接不上主节点了,他就开始发送消息,网络好了以后不就有两个主节(俗称脑裂,主节点相当于一个主从结构的大脑,只能有一个)点了吗?


我:那我们可以配置连接不上的时间让他长一点,通过cluster-node-timeout来配置,假如配置5秒钟,那么5秒钟之内从节点连接不上主节点是不会发起请求支持的信息的。


面试官:万一5秒不够呢,万一我网络抖动的厉害呢?


我:你是食堂阿姨吗,手抖的这么厉害。。。


我:你说的这种情况属于一瞬间有两个主节点都在写入新的数据,那么等网络恢复以后只会将一个节点作为主节点,其他节点变为从节点过来同步,那么就会丢失一部分数据。


7.png


8.png


我:这里我们会发现age 20数据丢失了,那这个怎么办呢,我们可以通过一个配置min‐replicas‐to‐write [数量],这个配置是写的数据最少同步的从节点数量。


假如我这里配置的是1,那么就是我写入一个值最少有一个从节点同步到了这个值才算写入成功,不然就是写入失败。


这样的话就可以解决上述问题,当网络抖动主节点无法给从节点同步数据的时候就写入失败,不会造成丢失数据,但是这种配置非常影响性能,不建议使用。


面试官:如果redis集群中一个主从结构全部挂了,这个redis集群还可以使用吗?


我:我们可以配置cluster-require-full-coverage 为no,这样只是一个主从结构全部挂了不影响其他主从结构的使用,如果为yes,一个主从结构挂了整个redis集群就不能用了。


面试官:Redis集群为什么至少需要三个主节点,并且推荐节点数为奇数?


我:上面我们说过如果是两个主节点,那么其中一个主节点挂了,剩下活着的主节点只有一个了,没有达到总数的一半以上,投票也不好使啊,挂了的主节点那里还是选举不出来新的主节点。


另外假如是4台主节点,那么他跟三台主节点一样都是最多只能挂一个主节点,如果同时挂两个主节点,那么剩下活着的主节点也无法超过总数的一半,所以按照性价比来说,奇数主节点性价比更高,不过贵公司要是土豪,愿意弄几个主节点就弄几个吧。。。


面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)


我:额。。。面试官这个我的纸质简历可以给我吗,可以不往我的简历上写写画画吗,我明天的面试还要用。


面试官:还面啥别的公司啊,就来我这吧,条件随便开


我:那就100k吧(此时面试官又拿起了他准备好的棍子)


面试官:你要是不来就给我推荐一下,让别人来我这面试一下


我:你先好好学习一下Redis吧,今天幸亏只是我来了,如果是小奇的忠实读者来了,你将会被虐的很惨的。(我将我的《Redis设计与实现》留给了面试官,转身留下了帅气的背影,而面试官落寞无神的呆呆的坐在那里,仿佛一个亿离他而去。。。)


六、总结



这里关于Redis还没有整理完毕,文章后面持续更新,建议收藏。


文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
20天前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
20天前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
12天前
|
存储 NoSQL 定位技术
Redis geo原理
Redis的GEO功能基于Earth Mapper(http://earth-api.org/)库,它允许存储地理位置信息并执行一些基于该信息的操作。
22 3
|
19天前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
19天前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
19天前
|
消息中间件 Java Linux
得物面试:什么是零复制?说说 零复制 底层原理?(吊打面试官)
尼恩,40岁老架构师,专注于技术分享与面试辅导。近期,尼恩的读者群中有小伙伴在面试一线互联网企业如得物、阿里、滴滴等时,遇到了关于零复制技术的重要问题。为此,尼恩系统化地整理了零复制的底层原理,包括RocketMQ和Kafka的零复制实现,以及DMA、mmap、sendfile等技术的应用。尼恩还计划推出一系列文章,深入探讨Netty、Kafka、RocketMQ等框架的零复制技术,帮助大家在面试中脱颖而出,顺利拿到高薪Offer。此外,尼恩还提供了《尼恩Java面试宝典》PDF等资源,助力大家提升技术水平。更多内容请关注尼恩的公众号【技术自由圈】。
得物面试:什么是零复制?说说 零复制 底层原理?(吊打面试官)
|
19天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
26天前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
33 5
|
7天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
25天前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!