能坚持别人不能坚持的,才能拥有别人未曾拥有的。
关注编程大道公众号,让我们一同坚持心中所想,一起成长!!
《【面试突击】— Redis篇》-- Redis哨兵原理及持久化机制
在这个系列里,我会整理一些面试题与大家分享,帮助年后和我一样想要在金三银四准备跳槽的同学。
我们一起巩固、突击面试官常问的一些面试题,加油!!
前两次因为时间原因面试官暂时中止了面试,觉得上次你对redis的主从复制,哨兵机制的知识掌握的还可以,于是今天面试官想看看你到底对Redis了解有多深,又加大了攻势,你准备好了吗?
上次因为时间问题面试草草收场今天我还有几个哨兵的问题要问。首先说一下Redis Sentinel是怎么工作的?重点描述一下故障转移的过程好的。
1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。
2)如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被当前 Sentinel 标记为主观下线。
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4)当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。
5)当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 (在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 )。
6)若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会变成主观下线。 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
7)sentinel节点会与其他sentinel节点进行“沟通”,投票选举一个sentinel节点进行故障处理,在从节点中选取一个主节点,其他从节点挂载到新的主节点上自动复制新主节点的数据。
故障转移时会从剩下的slave选举一个新的master,被选举为master的标准是什么?如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,此时首先要选举一个slave来,会考虑slave的一些信息。
(1)跟master断开连接的时长。
如果一个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master.
(2)slave优先级。
按照slave优先级进行排序,slave priority越低,优先级就越高
(3)复制offset。
如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级就越高
(4)run id
如果上面两个条件都相同,那么选择一个run id比较小的那个slave
会进行configuraiton配置信息传播。
哨兵完成切换之后,会在自己本地更新生成最新的master配置,然后通过pub/sub消息机制同步给其他的哨兵。
同步配置的时候其他哨兵根据什么更新自己的配置呢?执行切换的那个哨兵,会从要切换到的新master(salve->master)那里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的。
如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch 作为新的version号。
这个version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的,其他的哨兵都是根据版本号的大小来更新自己的master配置的。
好,上次哨兵的问题暂时就到这吧,接下来说说redis的持久化方面的问题吧。首先,生产上Redis要不要持久化?如果要,说说为什么需要,或者说持久化对生产系统的意义何在?要。
redis持久化主要是做灾难恢复,数据恢复,也可以归类到高可用的范畴。
比如Redis整个挂了,导致Redis不可用了,这时候首先要做的事情是让Redis尽快变得可用。那么就会去重启Redis,尽快让它对外提供服务。但是如果没做持久化没有数据备份,这个时候Redis启动了,也不可用啊,数据都没了!