架构上,高可用性,需要保证公式99.99%(四个9)。
即一年365天,有365*99.99%天数系统是可用的。
Redis的不可用性情况
单实例
单机的Redis宕机,无法对外提供缓存服务,所有的请求服务全部走数据库,导致数据库并发处理请求太多,造成数据库不可用,进而造成系统不可用。
主从架构不可用
master节点宕机,无法处理写请求,mater缓存失效。
slave节点无法同步master节点数据,一定程度下不可用。
slave节点宕机,并不会影响可用性,master节点还可以继续对外提供服务。
Redis主从架构如何保证高可用性
使用哨兵机制实现系统的高可用性。
在master节点宕机后,哨兵可以检测到master节点的状态,客观确认宕机后,哨兵会通过选举的方式,在可用的slave节点上,选举一台机器,切换为master节点。后续,旧的master节点恢复后,就作为新的slave节点加入集群当中。
只有在做切换的过程当中,redis集群是不可用的,这个过程时间很短,只有几分钟。
这种保证高可用的架构,称为主备切换(或故障转移)。
哨兵的介绍
主要功能
1、集群监控:负责监控 redis master和slave进程是否正常工作。
2、消息通知:如果某个redis实例出现故障,那么哨兵会负责发送消息报警通知。
3、故障转移:如果master节点挂掉,会自动将一个slave节点切换为master节点。
4、配置中心:故障转移发生后,会通知client客户端新的master节点地址。
哨兵集群
故障转移时,判断一个master节点宕机,需要大部分哨兵都统一才行(涉及到分布式选举的问题);
即使部分哨兵节点挂掉,哨兵集群还是能正常工作。
哨兵架构必须为集群架构。
哨兵核心知识
哨兵至少需要3个实例来保证自己的健壮性。
哨兵+redis主从部署架构,是不会保证数据零丢失的,只能保证redis集群的高可用性。
对于哨兵+redis主从这种复杂的部署架构,需要在测试环境和生产环境上,都进行充足的测试和演练。
为什么哨兵集群必须部署2个以上节点
如果哨兵集群只部署2个哨兵实例,则对应的quorum
=1。
quorum
,主要表示:在master宕机之后,需要有多少个哨兵认为master宕机。
同时需要保证有majority
个哨兵是运行的,保证哨兵的选举。
majority
主要表示:需要多少个哨兵运行,才能允许执行故障转移。(2个哨兵的majority=2
,3个哨兵的majority=2
,5个哨兵的majority=3
)。
+-----+ +-----+
| M1 |-------------| R1 |
| S1 | | S2 |
+-----| +-----+
两台机器
两个节点,一个master节点M1,一个slave节点 R1,
两个哨兵实例, S1, S2
对应的quorum=1,majority=2
此时,如果运行M1和S1的机器宕机,就会导致哨兵只有1个,没有majoryity个哨兵实例来允许执行故障转移
故障转移失败
经典的3哨兵集群
+----+
| M1 |
| S1 |
+----+
|
+----+ | +----+
| R2 |----+----| R3 |
| S2 | | S3 |
+----+ +----+
Configuration: quorum = 2,majority=2
如果M1所在机器宕机了,那么三个哨兵还剩下2个,S2和S3可以一致认为master宕机,
然后选举出一个来执行故障转移。
同时3个哨兵的majority是2,所以还剩下的2个哨兵运行着,就可以允许执行故障转移。