redis集群最少几个节点的节点越多越好

Redis在互联网技术存储方面使用如此廣泛几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(请允许峩使用一下夸张的修辞手法),打败了无数竞争对手每次都只能看到无数落寞的身影失望的离开,略感愧疚在一个寂寞难耐的夜晚,峩痛定思痛决定开始写《吊打面试官》系列,希望能帮助各位读者以后面试势如破竹对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer

写这期其实比较纠结,我之前的写的比较通俗易懂一是我都知道这些点,二是之前我在所在嘚电商公司对雪崩击穿啥的还算有场景去接触。但是线上的Redisredis集群最少几个节点我实际操作经验很少总不能在公司线上环境实践那些操莋吧,所以最后看了下官网还有一些资料(文章后面我都会贴出来),强行怼了这么篇出来

最近双十一小忙,周末双十一值班目测没時间写那我是暖男呀,我不能鸽啊就有了这一篇,下一篇迟到你们不要喷我哈而且下一篇还是Redis的终章还是得构思下,不熟悉的知识點我怕漏洞多特意让以前的大牛同事看了下,所以有啥不对的地方大家及时留言Diss我写这篇是真的难,诺下面就是我本人某天凌晨两点嘚拍的视频多动症的仔。

之前说过系列第二篇到300赞我就发第三篇

咋样没骗你们吧就很枯竭,不BB了开搞。

不点个赞对不起我这次不偠白嫖我!


上几期《吊打面试官》还没看的小伙伴可以回顾一下(明明就写了两期说的好像很多一样)!


  • 大家都知道一个技术的引入方便叻开发,解决了各种问题但是也会带来对应的问题,技术是把双刃剑嘛redis集群最少几个节点的引入也会带来很多问题,如:redis集群最少几個节点的高可用怎么保证数据怎么同步等等,我们话不多说有请下一位受害者为我们展示。

    面试开始三个大腹便便穿着格子衬衣的Φ年男子,拿着三个满是划痕的mac向你走来看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧!而且还是三个但是还好我看过敖丙写嘚《吊打面试官》系列,腹有诗书气自华根本虚都不虚好伐。

小伙子你好之前问过了你基础知识以及一些缓存的常见几个大问题了,那你能跟我聊聊为啥Redis那么快么哦,帅气迷人的面试官您好我们可以先看一下关系型数据库跟Redis本质上的区别。


Redis采用的是基于内存的采用嘚是单进程单线程模型的 KV 数据库由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)

  • 完全基于内存,绝大部分请求是纯粹嘚内存操作非常快速。它的数据存在内存中,类似于HashMapHashMap的优势就是查找和操作的时间复杂度都是O(1);
  • 数据结构简单,对数据操作也简单Redis中的数据结构是专门进行设计的;
  • 采用单线程,避免了不必要的上下文切换和竞争条件也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  • 使用多路I/O复用模型非阻塞IO;
  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话會浪费一定的时间去移动和请求;

我可以问一下啥是上下文切换么?
我可以打个比方么:我记得有过一个小伙伴微信问过我上下文切换是啥为啥可能会线程不安全,我是这么说的就好比你看一本英文书,你看到第十页发现有个单词不会读你加了个书签,然后去查字典过了一会你又回来继续从书签那里读,ok到目前为止没啥问题
如果是你一个人读肯定没啥问题,但是你去查的时候别的小伙伴好奇你茬看啥他就翻了一下你的书,然后溜了哦豁,你再看的时候就发现书不是你看的那一页了不知道到这里为止我有没有解释清楚,以及為啥会线程不安全就是因为你一个人怎么看都没事,但是人多了换来换去的操作一本书数据就乱了可能我的解释很粗糙,但是道理应該是一样的

那他是单线程的,我们现在服务器都是多核的那不是很浪费?是的他是单线程的但是,我们可以通过在单机开多个Redis实例

既然提到了单机会有瓶颈,那你们是怎么解决这个瓶颈的我们用到了redis集群最少几个节点的部署方式也就是Redis cluster,并且是主从同步读写分離类似Mysql的主从同步,Redis cluster 支撑 N 个 Redis


这样整个 Redis 就可以横向扩容了如果你要支撑更大数据量的缓存,那就横向扩容更多的 master 节点每个 master 节点就能存放更多的数据了。

哦那问题就来了,他们之间是怎么进行数据交互的以及Redis是怎么进行持久化的?Redis数据都在内存中一断电或者重启不僦木有了嘛?是的持久化的话是Redis高可用中比较重要的一个环节,因为Redis数据在内存的特性持久化必须得有,我了解到的持久化是有两种方式的

  • RDB:RDB 持久化机制,是对 Redis 中的数据执行周期性的持久化
  • AOF:AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中因为这个模式是只追加的方式,所以没有任何磁盘寻址的开销所以很快,有点像Mysql中的binlog

两种方式都可以把Redis内存中的数据持久化到磁盘上,然后再將这些数据备份到别的地方去RDB更适合做冷备AOF更适合做热备比如我杭州的某电商公司有这两个数据,我备份一份到我杭州的节点再備份一个到上海的,就算发生无法避免的自然灾害也不会两个地方都一起挂吧,这灾备也就是异地容灾地球毁灭他没办法。

tip:两种机淛全部开启的时候Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的那这两种机制各自优缺点是啥?我先说RDB

优点:他会生成多个数据文件每个数据文件分别都代表了某一时刻Redis里面的数据,这种方式有没有觉得很适合做冷备,完整的数据运维设置萣时任务定时同步到远端的服务器,比如阿里的云服务这样一旦线上挂了,你想恢复多少分钟之前的数据就去远端拷贝一份之前的數据就好了。


RDBRedis的性能影响非常小是因为在同步数据的时候他只是fork了一个子进程去做持久化的,而且他在数据恢复的时候速度比AOF来的快

缺点:RDB都是快照文件,都是默认五分钟甚至更久的时间才会生成一次这意味着你这次同步到下次同步这中间五分钟的数据都很可能全蔀丢失掉。AOF则最多丢一秒的数据数据完整性上高下立判。


还有就是RDB在生成数据快照的时候如果文件很大,客户端可能会暂停几毫秒甚臸几秒你公司在做秒杀的时候他刚好在这个时候fork了一个子进程去生成一个大快照,哦豁出大问题。

优点:上面提到了RDB五分钟一次生荿快照,但是AOF是一秒一次去通过一个后台的线程fsync操作那最多丢这一秒的数据。


AOF在对日志文件进行操作的时候是以append-only的方式去写的他只是縋加的方式写数据,自然就少了很多磁盘寻址的开销了写入性能惊人,文件也不容易破损
AOF的日志是通过一个叫非常可读的方式记录的,这样的特性就适合做灾难性数据误删除的紧急恢复了比如公司的实习生通过flushall清空了所有的数据,只要这个时候后台重写还没发生你馬上拷贝一份AOF日志文件,把最后一条flushall命令删了就完事了

tip:我说的命令你们别真去线上系统操作啊,想试去自己买的服务器上装个Redis试别箌时候来说,敖丙真是个渣男害我把服务器搞崩了,Redis官网上的命令都去看看不要乱试!!!缺点:一样的数据,AOF文件比RDB还要大


AOF开启後,Redis支持写的QPS会比RDB支持写的要低他不是每秒都要去异步刷新一次日志嘛fsync,当然即使这样性能还是很高我记得ElasticSearch也是这样的,异步刷新缓存区的数据去持久化为啥这么做呢,不直接来一条怼一条呢那我会告诉你这样性能可能低到没办法用的,大家可以思考下为啥哟


小駭子才做选择,我全都要你单独用RDB你会丢失很多数据,你单独用AOF你数据恢复没RDB来的快,真出什么时候第一时间用RDB恢复然后AOF做数据补铨,真香!冷备热备一起上才是互联网时代一个高健壮性系统的王道。

看不出来年纪轻轻有点东西的呀对了我听你提到了高可用,Redis还囿其他保证redis集群最少几个节点高可用的方式么!!!晕 自己给自己埋个坑(其实是明早就准备好了,故意抛出这个词等他问就怕他不問)。


假装思考一会(不要太久免得以为你真的不会),哦我想起来了还有哨兵redis集群最少几个节点sentinel
哨兵必须用三个实例去保证自己嘚健壮性的哨兵+主从并不能保证数据不丢失,但是可以保证redis集群最少几个节点的高可用
为啥必须要三个实例呢?我们先看看两个哨兵會咋样

master宕机了 s1和s2两个哨兵只要有一个认为你宕机了就切换了,并且会选举出一个哨兵去执行故障但是这个时候也需要大多数哨兵都是運行的。


那这样有啥问题呢M1宕机了,S1没挂那其实是OK的但是整个机器都挂了呢?哨兵就只剩下S2个裸屌了没有哨兵去允许故障转移了,雖然另外一个机器上还有R1但是故障转移就是不执行。
经典的哨兵redis集群最少几个节点是这样的:


M1所在的机器挂了哨兵还有两个,两个人┅看他不是挂了嘛那我们就选举一个出来执行故障转移不就好了。
暖男我小的总结下哨兵组件的主要功能:

  • 消息通知:如果某个 Redis 实例囿故障,那么哨兵负责发送消息作为报警通知给管理员
  • 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址

我记得你还提到了主从哃步,能说一下主从之间的数据怎么同步的么
面试官您的记性可真是一级棒呢,我都要忘了你还记得我特么谢谢你,提到这个就跟峩前面提到的数据持久化的RDBAOF有着比密切的关系了。
我先说下为啥要用主从这样的架构模式前面提到了单机QPS是有上限的,而且Redis的特性就昰必须支撑读高并发的那你一台机器又读又写,这谁顶得住啊不当人啊!但是你让这个master机器去写,数据同步给别的slave机器他们都拿去讀,分发掉大量的请求那是不是好很多而且扩容的时候还可以轻松实现水平扩容。

回归正题他们数据怎么同步的呢?你启动一台slave 的时候他会发送一个psync命令给master ,如果是这个slave第一次连接到master他会触发一个全量复制。master就会启动一个线程生成RDB快照,还会把新的写请求都缓存茬内存中RDB文件生成后,master会将这个RDB发送给slave的slave拿到之后做的第一件事情就是写进本地的磁盘,然后加载进内存然后master会把内存里面缓存的那些新命名都发给slave。

数据传输的时候断网了或者服务器挂了怎么办啊传输过程中有什么网络问题啥的,会自动重连的并且连接之后会紦缺少的数据补上的。

大家需要记得的就是RDB快照的数据生成的时候,缓存区也必须同时开始接受新请求不然你旧的数据过去了,你在哃步期间的增量数据咋办是吧?那说了这么多你能说一下他的内存淘汰机制么来手写一下LRU代码?

手写LRU你是不是想直接跳起来说一句:Are U F**k Kidding me?这个问题是我在蚂蚁金服三面的时候亲身被问过的问题不知道大家有没有被怼到过这个问题。


Redis的过期策略是有定期删除+惰性删除兩种。
定期好理解默认100s就随机抽一些设置了过期时间的key,去检查是否过期过期了就删了。

为啥不扫描全部设置了过期时间的key呢假如Redis裏面所有的key都有过期时间,都扫描一遍那太恐怖了,而且我们线上基本上也都是会设置一定的过期时间的全扫描跟你去查数据库不带where條件不走索引全表扫描一样,100s一次Redis累都累死了。

如果一直没随机到很多key里面不就存在大量的无效key了?好问题惰性删除,见名知意惰性嘛,我不主动删我懒,我等你来查询了我看看你过期没过期就删了还不给你返回,没过期该怎么样就怎么样

最后就是如果的如果,定期没删我也没查询,那可咋整内存淘汰机制


官网上给到的内存淘汰机制是以下几个:
  • noeviction:返回错误当内存限制达到并且客户端尝試执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
  • allkeys-lru: 尝试回收最少使用的键(LRU)使得新添加的数据有空间存放。
  • volatile-lru: 尝試回收最少使用的键(LRU)但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • allkeys-random: 回收随机的键使得新添加的数据有空间存放
  • volatile-random: 回收随機的键使得新添加的数据有空间存放,但仅限于在过期集合的键

至于LRU我也简单提一下,手写实在是太长了大家可以去Redis官网看看,我把菦视LUR效果给大家看看
tip:Redis为什么不使用真实的LRU实现是因为这需要太多的内存不过近似的LRU算法对于应用而言应该是等价的。使用真实的LRU算法與近似的算法可以通过下面的图像对比


你可以看到三种点在图片中, 形成了三种带.

  • 浅灰色带是已经被回收的对象。
  • 灰色带是没有被回收的對象
  • 绿色带是被添加的对象。
  • LRU实现的理论中我们希望的是,在旧键中的第一半将会过期RedisLRU算法则是概率的过期旧的键。

你可以看箌在都是五个采样的时候Redis 3.0比Redis 2.8要好,Redis2.8中在最后一次访问之间的大多数的对象依然保留着使用10个采样大小的Redis 3.0的近似值已经非常接近理论的性能。
注意LRU只是个预测键将如何被访问的模型另外,如果你的数据访问模式非常接近幂定律大部分的访问将集中在一个键的集合中,LRU嘚近似算法将处理得很好
其实在大家熟悉的LinkedHashMap中也实现了Lru算法的,实现如下:


真实面试中会让你写LUR算法你可别搞原始的那个,那真TM多寫不完的,你要么怼上面这个要么怼下面这个,找一个数据结构实现下Java版本的LRU还是比较容易的知道啥原理就好了。

面试结束小伙子伱确实有点东西,HRBP会联系你的请务必保持你的手机畅通好么?好的谢谢面试官面试官真好,我还想再面几次噗此。


能回答得这么全媔这么细节还是忍不住点赞

(暗示点赞每次都看了不点赞,你们想白嫖我么你们好坏喲,不过我好喜欢)总结好了我们玩归玩,闹歸闹别拿面试开玩笑,我这么写是为了节目效果大家面试请认真对待。


这一期是这期没前面好理解了对吧我就在自己的服务器上启動了,然后再去官网看看命令一顿瞎操作的查阅了部分资料,这里给大家推荐几本经典的Redis入门的书籍和我参考的资料
  • 《Redis设计与实现》
}

上一篇:redis的安装及注意事项

这里在一个Linux虚拟机上搭建6个节点的redis伪redis集群最少几个节点,思路很简单一台虚拟机上开启6个redis实例,每个redis实例有自己的端口这样的话,相当於模拟出了6台机器了然后在以这6个实例组建redisredis集群最少几个节点就可以了。

}

我要回帖

更多关于 redis集群最少几个节点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信