面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?
哈喽!大家好,我是小奇,一位不靠谱的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新
一、前言
作为一名Java程序员,Redis底层的一些原理是我们不必学会就可以搬砖工作的一种技能点,但是小奇为什么还要讲一下呢?难道就是为了浪费大家1分钟的宝贵时间,一个人1分钟,50万人就是1年,5000万人就是100年,赚了,小奇以一己之力成功搞挂一个人(血赚)。
当然不是,并且小奇的文章也没有那么多人看,最多也就浪费个肾吧。
学习Redis底层原理是因为面试官要问啊!,所以我们就要学,什么?不实用的你不学?那邻居小奇可要使劲学啦,到时候面试官只要小奇不要你。
至于你问为什么面试官要问Redis底层原理呢,这个。。。我把这次机会留给你,下次你面试的时候面试官问:“讲一下Redis底层原理”。你:“面试官你好,请问为什么你要问Redis底层原理呢,你给我台电脑,我五分钟给你搭建好图书管理系统他不香吗,咱们键盘上见真章”。这时面试官就会告诉你答案,你就可以把答案打在评论区,让小奇以及众多小伙伴一起知道一下到底为什么要问?
二、面试
在一个晴朗的周日,我来到了一个陌生的园区(别问为什么是周日,问就是997,不过为了填饱肚子的打工人,只能明知山有虎、偏向虎山行),坐在陌生的会议室,等待HR小姐姐去叫面试官,此时我的心情和各位小伙伴一样五味杂陈,担心面试官问的会不会很难?问到我的知识盲区我该怎么办?一会自我介绍的时候要不要吹一下我和小奇的关系?
一位英俊潇洒,眼神犀利的面试官走了进来,看到他那犀利、仿佛能看穿一切的眼神 ,我在想要不然一会就不要20k了,要8k得了,这个面试官一看就不好糊弄啊,但是我想起来我来之前刚看了小奇的趣学编程系列,我已经完全学会了小奇的精髓,我顿时就来了底气,决定一会要30k,不给就学小奇赖着不走(哈哈)
面试官:小奇是吧,带简历了吗?
我:没带,现在彩印两块一张,我简历五张,每次面试都要花费十块,我朋友说了还没工作就先让你掏钱的工作不要去。
面试官:。。。那你靠什么来征服我,让我录用你
我:气质?
(此时面试官并没有叫保安,而是从门后拿出了恭候我多时的棍子,我瞬间怂了)
我只好从我的双肩包中拿出了我上午从其他公司面试官手中要回的简历,上午的情形是这样的。
上午的面试官:今天的面试就到这吧,回去等通知吧!
我:面试官你好,如果贵公司不打算录取我的话,能不能把我的纸质简历还给我,我下午还有一家面试。
上午的面试官:我说你的简历怎么皱皱巴巴,原来你一直在循环利用啊!这个症状出现多久了?
我:半拉月了。。。
(当我把皱皱巴巴的简历交给面试官后,这场面试才得以继续进行。。。)
三、Redis哨兵集群
面试官:我看你简历上写的精通Redis?(哼,面试官轻蔑的一笑)
(看着面试官轻蔑的笑容,我忍不住拿出了我的Redis书籍推给了他)
我:这本书我倒背如流,你随便提问,答不上来算我输,答上来你就要为你的轻蔑向我道歉。
(我的笑容逐渐自信。。。)
(此时面试官看着书若有所思,我怀疑他肯定在想他对这本书的了解程度吧)
面试官:好吧,那你先说一下Redis有哪些集群方式呢
我:Redis主要有两种持集群方式,哨兵集群和Cluster(高可用)集群。
面试官:可以说一说两者的区别和如何配置使用吗
我:上次面试我已经简单说了一下哨兵模式,现在再来简单看一下
这里我们可以看到客户端只能连接一个哨兵集群,也就是说客户端在写入数据的时候只能通过哨兵集群告诉的地址来进行写入
假如主节点挂了,那么哨兵选举一个从节点成为主节点,在这期间客户端来访问是被阻塞的,因为主节点正在被选举,还不知道谁是主节点呢,怎么插入数据。
那么为了解决这个问题,我们可以使用高可用集群模式Cluster模式,也可以称之为多个主从节点(主从节点上一章讲过)模式集群
四、Redis高可用集群Cluster模式
面试官:能说一下高可用集群模式具体是怎么一个流程吗,为什么可以解决选举等待问题?
我:(能不说吗。。。)
通过图中可以看出我们客户端通过访问入口可以访问多个主节点,如果其中一个主节点挂了,那么其他的主节点还可以正常工作不受影响。
面试官:这么多主节点,我哪知道我set一个数据应该放入到哪个主从结构里面呢?
我:(你随机放一个不就行了吗。。。不对,随机放一个取的时候就不知道去哪个主从结构里去取了,总不能每一个主节点里面都去查找一遍吧)
我:他会根据要set进去的key进行一个hash计算,计算完后就知道要往哪个主节点里面存放值了,取得时候也根据key进行一个hash计算,就知道去哪个主节点里拿取了。
面试官:那这个时候来一个age计算hash是150要插入哪个主节点
我:肯定是第二个主节点啊,redis集群采用分片模式,将所有数据分片放入多个主节点中,方便与水平扩展。
面试官:如果主节点挂了,哨兵模式下哨兵集群会选举出一个主节点,那你这种高可用模式,如果一个主节点挂了,怎么选举呢?
我:(应该是按照大小个吧。。。)
面试官:你特么找打是吧,数据那特么有大小个。。。
五、Leader选举原理
我:这个时候就需要其他主节点来支持选举了,我来用一张图描述一下。
我:我们可以把这三个主从节点看做是三个国家,如果一个国家的头目挂掉了,那么他底下其中一股势力就会找其他的国家头目来支持自己成为头目。
我:当然其他国家的头目不会看你国家这两股势力哪个好哪个坏,而是哪个先找我我就支持你。
我:而且图中有三个国家,支持自己的票数必须超过总国家的一半以上,也就是最少要有两票支持,所以redis集群节点最少要三个主从结构,不然的话两个没办法选举,票数最多一票不够两个国家的半数以上。
面试官:还别说你小子使用这个图讲的是有声有色
我:你这不废话吗,趣学编程不趣学那还学个屌。。。
面试官:那塔利班和正规军他们两个怎么确定谁先发出请求呢,肯定是谁先发出消息谁赢呗?
我:他们两个小势力并不是头目挂了就立马发出请求支持消息,而是有一定的延迟时间,这个延迟时间根据一个公式计算,公式中包含随机数,和根据SLAVE_RANK的大小来计算,SLAVE_RANK的大小表示从节点从主节点同步的数据总量的Rank。Rank越小代表一复制的数据越新,可以做主节点。
延迟公式:DELAY = 500ms +random(0 ~ 500ms) + SLAVE_RANK * 1000ms
面试官:假如现在网络抖动,从节点一瞬间连接不上主节点了,他就开始发送消息,网络好了以后不就有两个主节(俗称脑裂,主节点相当于一个主从结构的大脑,只能有一个)点了吗?
我:那我们可以配置连接不上的时间让他长一点,通过cluster-node-timeout来配置,假如配置5秒钟,那么5秒钟之内从节点连接不上主节点是不会发起请求支持的信息的。
面试官:万一5秒不够呢,万一我网络抖动的厉害呢?
我:你是食堂阿姨吗,手抖的这么厉害。。。
我:你说的这种情况属于一瞬间有两个主节点都在写入新的数据,那么等网络恢复以后只会将一个节点作为主节点,其他节点变为从节点过来同步,那么就会丢失一部分数据。
我:这里我们会发现age 20数据丢失了,那这个怎么办呢,我们可以通过一个配置min‐replicas‐to‐write [数量],这个配置是写的数据最少同步的从节点数量。
假如我这里配置的是1,那么就是我写入一个值最少有一个从节点同步到了这个值才算写入成功,不然就是写入失败。
这样的话就可以解决上述问题,当网络抖动主节点无法给从节点同步数据的时候就写入失败,不会造成丢失数据,但是这种配置非常影响性能,不建议使用。
面试官:如果redis集群中一个主从结构全部挂了,这个redis集群还可以使用吗?
我:我们可以配置cluster-require-full-coverage 为no,这样只是一个主从结构全部挂了不影响其他主从结构的使用,如果为yes,一个主从结构挂了整个redis集群就不能用了。
面试官:Redis集群为什么至少需要三个主节点,并且推荐节点数为奇数?
我:上面我们说过如果是两个主节点,那么其中一个主节点挂了,剩下活着的主节点只有一个了,没有达到总数的一半以上,投票也不好使啊,挂了的主节点那里还是选举不出来新的主节点。
另外假如是4台主节点,那么他跟三台主节点一样都是最多只能挂一个主节点,如果同时挂两个主节点,那么剩下活着的主节点也无法超过总数的一半,所以按照性价比来说,奇数主节点性价比更高,不过贵公司要是土豪,愿意弄几个主节点就弄几个吧。。。
面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)
我:额。。。面试官这个我的纸质简历可以给我吗,可以不往我的简历上写写画画吗,我明天的面试还要用。
面试官:还面啥别的公司啊,就来我这吧,条件随便开
我:那就100k吧(此时面试官又拿起了他准备好的棍子)
面试官:你要是不来就给我推荐一下,让别人来我这面试一下
我:你先好好学习一下Redis吧,今天幸亏只是我来了,如果是小奇的忠实读者来了,你将会被虐的很惨的。(我将我的《Redis设计与实现》留给了面试官,转身留下了帅气的背影,而面试官落寞无神的呆呆的坐在那里,仿佛一个亿离他而去。。。)
六、总结
这里关于Redis还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
如果觉得我的文章还不错的话就点个赞吧。
面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?的更多相关文章
- 面试官: Flink双流JOIN了解吗? 简单说说其实现原理
摘要:今天和大家聊聊Flink双流Join问题.这是一个高频面试点,也是工作中常遇到的一种真实场景. 本文分享自华为云社区<万字直通面试:Flink双流JOIN>,作者:大数据兵工厂 . ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- 【原创】为什么Redis集群有16384个槽
引言 我在<那些年用过的Redis集群架构(含面试解析)>一文里提到过,现在redis集群架构,redis cluster用的会比较多. 如下图所示 对于客户端请求的key,根据公式HAS ...
- 为什么Redis集群有16384个槽
一.前言 我在<那些年用过的Redis集群架构(含面试解析)>一文里提到过,现在redis集群架构,redis cluster用的会比较多. 如下图所示 对于客户端请求的key,根据公式H ...
- Redis——面试官考题
总结: 本文在一次面试的过程中讲述了 Redis 是什么,Redis 的特点和功能,Redis 缓存的使用,Redis 为什么能这么快,Redis 缓存的淘汰策略,持久化的两种方式,Redis 高可用 ...
- Redis集群搭建的三种方式
一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制. ...
- 女朋友面试回来抱怨说会redis,面试官问了一堆redis
Redis 优缺点及特点 什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,类似MemoryCache,整个数据库统统加载在内存当中进行操作,定期通过异步操 ...
- redis(6)--redis集群之分片机制(redis-cluster)
Redis-Cluster 即使是使用哨兵,此时的Redis集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于可用存储内存最小的节点,形成了木桶效应.而因为Redis是基于内存 ...
- redis 集群
http://www.linuxidc.com/Linux/2015-08/121845.htm Redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简 ...
随机推荐
- DLL链接库
转载请注明来源:https://www.cnblogs.com/hookjc/ 2. 静态链接库 对静态链接库的讲解不是本文的重点,但是在具体讲解 DLL 之前,通过一个静态链接库的例子可以快速地帮助 ...
- Windows安装RabbitMQ过程及相关问题
一.下载 1.首先需要下载erlang,下载地址:http://www.erlang.org/downloads 2.其次需要下载RabbitMQ,下载地址:https://www.rabbitmq. ...
- 07.python语法入门--流程控制
分支结构 什么是分支结构 为什么要用分支结构 如何使用分支结构 if语法 if应用案例 循环结构 什么是循环结构 为什么要用循环结构 如何使用循环结构 while循环语法 while循环应用案例 fo ...
- Solution -「Gym 102979E」Expected Distance
\(\mathcal{Description}\) Link. 用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...
- Solution -「NOI 2018」「洛谷 P4768」归程
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\).每次询问给出 \(u,p\),回答 ...
- 图计算 on nLive:Nebula 的图计算实践
本文首发于 Nebula Graph Community 公众号 在 #图计算 on nLive# 直播活动中,来自 Nebula 研发团队的 nebula-plato 维护者郝彤和 nebula-a ...
- 【论文考古】Training a 3-Node Neural Network is NP-Complete
今天看到一篇1988年的老文章谈到了训练一个简单网络是NPC问题[1].也就是下面的网络结构,在线性激活函数下,如果要找到参数使得输入数据的标签估计准确,这个问题是一个NPC问题.这个文章的意义在于宣 ...
- Node.JS学习——学习笔记
Node.JS--学习笔记 2020年02月23日11:52:01 我打算自学NodeJS-通过阅读NodeJS官网来完成. https://nodejs.org/dist/latest-v13.x/ ...
- 使用IDEA新建一个Spring Boot项目
本文使用Spring Initializer来创建 开发环境 操作系统:Windows 10 IDEA:2020.3.2 JDK:1.8 1. 启动IDEA,选择New Project(新建工程): ...
- [LeetCode]LCP 06. 拿硬币
桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释:第一堆力扣 ...