系统中只有一台redis服务器是不可靠的,容易出现单点故障。为了避免单点故障,可以使用多台redis服务器组成redis集群。redis支持三种集群模式。

一、主从模式

至少需要两台redis服务器,一台主节点(master)、一台从节点(slave),组成主从模式的Redis集群。通常来说,master主要负责写,slave主要负责读,主从模式实现了读写分离。

集群中有多台redis节点,就必须保证每个节点中的数据是一致的。redis中,为了保持数据一致性,数据总是从master复制到slave,这就是redis的主从复制。

主从复制的作用:

  • 数据冗余:实现了数据的热备份,是持久化之外的另一种数据冗余方式
  • 故障恢复:master故障时,slave可以提供服务,实现故障快速恢复
  • 负载均衡:master负责写,slave负责读。在写少读多的场景下可以极大提高redis吞吐量
  • 高可用基石:主从复制是redis哨兵模式和集群模式的基础。

主从复制实现原理:

主从复制过程主要可以分为3个阶段:连接建立阶段、数据同步阶段、命令传播阶段。

  1. 连接建立阶段:在主从节点之间建立连接,为数据同步做准备。
  2. 数据同步阶段:执行数据的全量(或增量)复制(复制RDB文件)
  3. 命令传播阶段:主节点将已执行的命令发送给从节点,从节点接收命令并执行,从而实现主从节点的数据一致性

主从模式中,一个主节点可以有多个从节点。为了减少主从复制对主节点的性能影响,一个从节点可以作为另外一个从节点的主节点进行主从复制。

不足之处:主节点宕机之后,需要手动拉起从节点来提供业务,不能达到高可用。

二、哨兵模式(Sentinel)

Redis Sentinel是Redis的高可用实现方案,它可以实现对redis的监控、通知和自动故障转移,当redis master挂掉之后,可以自动拉起slave提供业务,从而实现redis的高可用。为了避免Sentinel本身出现单点故障,Sentinel自己也可采用集群模式。

 哨兵模式的原理

Sentinel是一种特殊的redis节点,每个sentinel节点会维护与其他redis节点(包括master/slave/sentinel)的心跳。

当一个sentinel节点与master节点的心跳丢失时,这个sentinel节点就会认为master节点出现了故障,处于不可用的状态,这种判定叫作主观下线(即sentinel节点自己主观认为master下线了)

之后,这个sentinel节点会与其他sentinel节点交换信息,如果发现认为主节点发生故障的sentinel节点的个数超过了某个阈值(通常为sentinel节点总数的1/2+1,即超过半数),则sentinel会认为master节点已经处于客观下线的状态,即大家都认为master故障不可用了。

之后,sentinel节点中会选举处一个sentinel leader来执行redis主节点的故障转移。

被选举出的 Sentinel 领导者进行故障转移的具体步骤如下:

(1)在从节点列表中选出一个节点作为新的主节点

  • 过滤不健康或者不满足要求的节点;

  • 选择 slave-priority(优先级)最高的从节点, 如果存在则返回, 不存在则继续;

  • 选择复制偏移量最大的从节点 , 如果存在则返回, 不存在则继续;

  • 选择 runid 最小的从节点。

(2)Sentinel 领导者节点会对选出来的从节点执行 slaveof no one 命令让其成为主节点。

(3)Sentinel 领导者节点会向剩余的从节点发送命令,让他们从新的主节点上复制数据。

(4)Sentinel 领导者会将原来的主节点更新为从节点, 并对其进行监控, 当其恢复后命令它去复制新的主节点。

 三、集群模式

主从模式实现了数据的热备份,哨兵模式实现了redis的高可用。但是有一个问题,这两种模式都没有解决,这两种模式都只能有一个master节点负责写操作,在高并发的写操作场景,master节点就会成为性能瓶颈。

redis的集群模式中可以实现多个节点同时提供写操作,redis集群模式采用无中心结构,每个节点都保存数据,节点之间互相连接从而知道整个集群状态。

如图所示集群模式其实就是多个主从复制的结构组合起来的,每一个主从复制结构可以看成一个节点,那么上面的Cluster集群中就有三个节点。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐