二,哨兵(Sentinel)
主从复制最大的问题,还是在主机点上,如果主节点挂了,从节点不会晋升为主节点,需要通过人工干预的方式恢复。
因此Redis哨兵机制,就是为了解决上述问题,自动的对挂了的主节点进行替换,也就是将上述手动的过程改成自动。
哨兵机制是通过启动一个不同的进程来体现的,它和redis-servver服务器进程不是 同一个进程 。
哨兵自动恢复主节点故障
如果一个哨兵节点发现主节点挂了,为了防止预判,还需多个哨兵节点共同认为这件事情。
如果主节点确实挂了,这些哨兵节点会选出一个作为leader,由这个哨兵节点负责从剩下的从节点中选一个出来,作为主节点。选出新的主节点之后,哨兵节点就会控制该节点执行slaveof no one,并且通知其他从节点,修改slaveof到新的主节点之上。哨兵节点会自动通知客户端程序,告知新的主节点是谁,并且此后客户端再进行写操作时,就会访问新的主节点了。
3,哨兵机制的特点
监控:Sentinel节点会定期检查redis数据节点,使用心跳包机制。
故障转移:实现从节点晋升为主节点,并维护好正确的主从关系。
通知:Sentinel会将故障转移的结果通知给应用方。
4,主从切换的具体流程
重点,面试题:
1,主观下线:哨兵节点通过心跳包进制,判读redis主节点服务器是否正常工作,如果没有沙鸥到响应,该哨兵节点就会认为该主节点下线了。
2,客观下线:当多个哨兵节点都认为主节点挂了之后,此时这个主节点就是主观下线了。
3,再从多个哨兵节点中,选举出一个leader节点,由这个leader节点负责从剩下的节点中选出一个作为主节点。
4,leader挑选完毕后,此时需要从剩下的从节点中选一个当作新的主节点。
首先会看这些从节点的优先级,每个 redis数据节点,都会有自己的配置文件,配置文件中就有一个优先级的设置。leader会选择优先级高的作为新的主节点。
如果数据节点的优先级都一样,那么就比较这些数据节点的offset,offset表示从节点与原来主节点进行数据同步的进度,offset越大,说明这个节点与原来主节点的数据相似度最高,此时就会选择这个节点作为新的主节点。
如果前面两个条件都一样,此时其实意味着从这些节点中任选一个都行。那么再看这些节点的runid(一串数字),每个redis数据节点启动时都会生成一个随机的runid,此时比较runid的大小。让runid更小的作为新的主节点。
指定好新的主节点之后,此时leader就会控制这个主节点执行slaveof no one,让这个节点成为主节点(master)。再控制其他从节点,执行slaveof,让这些从节点,以新的mater作为主节点。
5,总结
哨兵节点不能只有一个,因为哨兵节点挂了也会影响 系统的运作。
哨兵节点最好是奇数个,方便选举leader,得票数更容易超过一半。
哨兵+主从复制解决的问题是"提高可用性",极端情况下写操作的数据丢失无法解决。
哨兵+主从复制不能提高数据的存储容量 ,当数据接近或者几乎超过机器的物理内存时,这样的结构就难以胜任了,而接下来的redis集群,就是解决存储容量问题的有效方案。