能坚持别人不能坚持的,才能拥有别人不曾拥有的。
关注左上角编程大道
公众号,让咱们一同坚持心中所想,一块儿成长!!html
《【面试突击】— Redis篇》-- Redis的主从复制?哨兵机制?node
在这个系列里,我会整理一些面试题与你们分享,帮助年后和我同样想要在金三银四准备跳槽的同窗。
咱们一块儿巩固、突击面试官常问的一些面试题,加油!!面试
《【面试突击】— Redis篇》--Redis数据类型?适用于哪些场景?redis
《【面试突击】— Redis篇》--Redis的线程模型了解吗?为啥单线程效率还这么高?算法
面试官在问了上两次提到的问题以后,可能就会开始更加猛烈的攻势,一连串的Redis的知识点向你抛过来,你顶的住吗?编程
下面就面试常常问到的问题,以问答的方式分享给你们。缓存
高并发:
redis的单机吞吐量能够达到几万不是问题,若是想提升redis的读写能力,能够用redis的主从架构,redis天热支持一主多从的准备模式,单主负责写请求多从负责读请求,主从之间异步复制,把主的数据同步到从。网络
高可用:
首先利用redis的主从架构解决redis的单点故障致使的不可用,而后若是使用的是主从架构,那么只须要增长哨兵机制便可,就能够实现,redis主实例宕机,自动会进行主备切换。以此来达到redis的高可用。架构
在redis主从架构中,master负责接收写请求,写操做成功后返回客户端OK,而后后将数据异步的方式发送给多个slaver进行数据同步,不过从redis 2.8开始,slave node会周期性地确认本身每次复制的数据量。并发
当启动一个slave node的时候,它会发送一个PSYNC
命令给master node。若是slave node是从新链接master node,那么master node仅仅会复制给slave部分缺乏的数据; 不然若是是slave node第一次链接master node,那么会触发一次full resynchronization
全量复制。
开始full resynchronization
的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的全部写命令缓存在内存(内存缓冲区)中。RDB文件生成完毕以后,master会将这个RDB发送给slave,slave会先写入本地磁盘,而后再从本地磁盘加载到内存中。而后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
另外slave node作复制的时候,是不会block master node的正常工做的,也不会block对本身的查询操做,它会用旧的数据集来提供服务; 可是复制完成的时候,须要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。slave node主要用来进行横向扩容,作读写分离,扩容的slave node能够提升读的吞吐量。slave与高可用性有很大的关系。
Tips:边讲边画图最好了。
若是出现网络故障断开链接了,会自动重连的,从redis 2.8开始,就支持主从复制的断点续传,能够接着上次复制的地方,继续复制下去,而不是从头开始复制一份。
master若是发现有多个slave node都来从新链接,仅仅会启动一个rdb save操做,用一份数据服务全部slave node。
master node会在内存中建立一个backlog
,master和slave都会保存一个replica offset
,还有一个master id
,offset就是保存在backlog中的。若是master和slave网络链接断掉了,slave会让master从上次的replica offset开始继续复制。
可是若是没有找到对应的offset,那么就会执行一次resynchronization
全量复制。
哨兵是redis集群架构中很是重要的一个组件,主要功能以下
(1)集群监控,负责监控redis master和slave进程是否正常工做
(2)消息通知,若是某个redis实例有故障,那么哨兵负责发送消息做为报警通知给管理员
(3)故障转移,若是master node挂掉了,会自动转移到slave node上
(4)配置中心,若是故障转移发生了,通知client客户端新的master地址
哨兵自己也是分布式的,做为一个哨兵集群去运行,互相协同工做
(1)故障转移时,判断一个master node是宕机了,须要大部分的哨兵都赞成才行,涉及到了分布式选举的问题
(2)即便部分哨兵节点挂掉了,哨兵集群仍是能正常工做的,由于若是一个做为高可用机制重要组成部分的故障转移系统自己是单点的,那就很坑爹了。
目前采用的是sentinal 2版本,sentinal 2相对于sentinal 1来讲,重写了不少代码,主要是让故障转移的机制和算法变得更加健壮和简单。
若是两个哨兵实例,即两个redis实例,一主一从的模式。
则redis的配置quorum=1,表示一个哨兵认为master宕机便可认为master已宕机。
可是若是是机器1宕机了,那哨兵1和master都宕机了,虽然哨兵2知道master宕机了,可是这个时候,须要majority,也就是大多数哨兵都是运行的,2个哨兵的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),2个哨兵都运行着,就能够容许执行故障转移。
但此时哨兵1没了就只有1个哨兵了了,此时就没有majority来容许执行故障转移,因此故障转移不会执行。
会有,并且有两种可能,一种是异步复制,一种是脑裂致使的数据丢失。
好的,第一种很好理解,由于master 到 slave的复制是异步的,因此可能有部分数据还没复制到slave的时候,master就宕机了,此时这些部分数据就丢失了。虽然master会作持久化,可是哨兵将slave提高为master后,若是旧的master这时候好了,会当作slave挂到新的master上,重新的master同步数据,原来的数据仍是会丢失。
第二种,也就是说,某个master所在机器忽然脱离了正常的网络,跟其余slave机器不能链接,可是实际上master还运行着,即集群分区现象。此时哨兵可能就会认为master宕机了,而后开启选举,将其余slave切换成了master.
这个时候,集群里就会有两个master,也就是所谓的脑裂。
此时虽然某个slave被切换成了master,可是可能client还没来得及切换到新的master,还继续向旧master写数据,这部分数据可能就丢失了。所以旧master再次恢复的加入到主从结构中时,会被做为一个slave挂到新的master上去,本身的数据会清空,从新重新的master复制数据,原来的写到旧master的数据就丢失了。
数据丢失的问题是不可避免的,可是咱们能够尽可能减小。
在redis的配置文件里设置参数
min-slaves-to-write 1
min-slaves-max-lag 10
min-slaves-to-write
默认状况下是0,min-slaves-max-lag
默认状况下是10。
上面的配置的意思是要求至少有1个slave,数据复制和同步的延迟不能超过10秒。若是说一旦全部的slave,数据复制和同步的延迟都超过了10秒钟,那么这个时候,master就不会再接收任何请求了。
上面两个配置能够减小异步复制和脑裂致使的数据丢失。
以上面配置为例,这两个参数表示至少有1个salve的与master的同步复制延迟不能超过10s,一旦全部的slave复制和同步的延迟达到了10s,那么此时master就不会接受任何请求。
咱们能够减少min-slaves-max-lag
参数的值,这样就能够避免在发生故障时大量的数据丢失,一旦发现延迟超过了该值就不会往master中写入数据。
那么对于client,咱们能够采起降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间后从新写入master来保证数据不丢失;也能够将数据写入kafka消息队列,隔一段时间去消费kafka中的数据。
经过上面两个参数的设置咱们尽量的减小数据的丢失,具体的值还须要在特定的环境下进行测试设置。
面试官显然对你今天的回答比较满意,已经邀请你下一轮面试了~~~
手机阅读的用户可移至公众号哦,更方便
本系列文章在于面试突击,不是教程,要是细挖,能讲好多,而面试你只须要把这个原理说出来就好了,若是边讲边画图那就更好了。
该系列文章在于快速突击,快速拾遗,温习。
原文出处:https://www.cnblogs.com/ibigboy/p/12204300.html