【Redis】Redis哨兵模式
Redis主从模式当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预费事费力,为了解决这个问题出现了哨兵模式。
哨兵模式是是一个管理多个 Redis 实例的工具,它可以实现对 Redis 的监控、通知、自动故障转移,是Redis实现高可用的方案。哨兵模式能够在发生故障时自动触发故障转移流程,从而保证集群的高可用性。
哨兵模式概述
Redis 可以存在多台服务器,并且实现了主从复制的功能。哨兵模式是一种特殊的模式,在 Redis 中哨兵是一个独立的进程。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例是否可以正常工作,如下图所示。
- 通过发送命令,让 Redis 服务器返回其运行状态,包括主服务器和从服务器。
- 当哨兵监测到主机出现故障后,会自动将其中一台从服务器切换成主服务器,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换新的主服务器。
但是在现实中,一个哨兵进程监控 Redis 服务器,也可能出现问题,因为这个哨兵进程本身也可能出现故障。为了处理这个问题,可以使用多个哨兵监控,而各个哨兵之间还会相互监控,这样就变为了多个哨兵模式。除了监控各个 Redis 主从服务器,各个哨兵之间还会互相监控,看看哨兵们是否还“活”着。其关系如下图所示。
论述一下故障切换 (failover)
的过程:假设主服务器宕机,哨兵1先监测到这个结果,当时系统并不会马上进行 failover 操作,而仅仅是哨兵1 主观地认为主服务器已经不可用,这个现象被称为主观下线。当后面的哨兵也监测到了主服务器不可用,并且有了一定数量的哨兵认为主服务器不可用后,哨兵之间就会形成一次投票。通过哨兵之间的投票机制,选出新的主服务器后,就会通过发布订阅方式,让各个哨兵对自己监控的服务器进行切换主服务器操作,这个过程被称为客观下线。这样对于 Redis 客户端而言,一切都是透明的。
故障转移流程
故障转移需要选择一个slaver节点来作为master。
选择主Maseter过程大致如下:
- 选择优先级最高的节点,通过sentinel配置文件中的
replica-priority
配置项,这个参数越小,表示优先级越高 - 如果第一步中的优先级相同,选择
offset
最大的,offset表示主节点向从节点同步数据的偏移量,越大表示同步的数据越多 - 如果第二步offset也相同,选择
run id
较小的
这样通过以上四大步骤,实现由Redis Sentinel自动完成故障发现和转移,实现自动高可用。
Redis 哨兵模式的优缺点
哨兵模式优点:最大的优点就是主从可以自动切换,系统更健壮,可用性更高
哨兵模式缺点:最大的缺点就是还要多维护一套哨兵模式,实现起来也变的更加复杂增加维护成本
最大的缺点就是还要多维护一套哨兵模式,实现起来也变的更加复杂增加维护成本