Redis高可用
高可用通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。Redis中实现高可用主要有三种方式:主从模式、哨兵、集群。
主从架构
将系统中多个Redis节点进行责任划分,其中一个Redis节点作为主节点,剩余的Redis节点作为从节点。主节点提供整个系统数据的增删改,从节点只提供读操作。当主节点更新数据时,将数据同步到从节点,从而保持系统中各个节点数据一致。
主从同步
- 全量同步
当第一次master与slave同步时,采用增量同步
1. 从服务器启动发送一个psync命令
2. 此时主服务器会执行一次Bgsave,生成RDB文件,而且此时开辟一个缓冲区,此时所有的写命令都将同步到缓冲区
3. 当RDB文件生成完成,主服务器同步给从服务器
4. 从服务器加载RDB完成,再同步主服务器的缓冲区数据,至此完成数据的全量同步
- 增量同步
当slave重启后与master进行同步,此时无必要使用全量同步。master和其他slave之间会维护一个环形的数组和指针,指针表明当前数据的进度,指针指向相同则数据一致。当salve重启后,master 会查看与salve指针间相差的数据,将数据发送给slave,当与salve差距过大时,直接使用全量同步。
哨兵
哨兵是Redis中额外启动的服务,用来监控Redis的Master和Slave节点,保证高可用,它主要有以下三个作用。
- 监控
每个一段时间向Master和Slave定时发送心跳包探测是否存活。
- 节点下线
- 主观下线
哨兵向节点发送心跳,如果未回复则认为该redis节点主观下线。
- 客观下线
如果是redis主节点下线,该哨兵会向其他哨兵征求意见,超过半数认为该redis节点下线,那么这个Redis主节点就主观下线,开启故障转移操作。
- 故障转移
基于Raft算法实现选举操作,产生新的Leader,然后向其他Follwer节点同步。
集群
集群是Redis实现高可用的一种方式,它实现了分布式存储,将整个数据进行分片存储。
-
分片原理
- 基于hash槽实现,每个集群有16384个槽,当客户端传入key时,按crc16校验后对16384取模,决定key放在哪个槽..
- 集群中的每个redis节点管理1个或者多个节点,理论上可以有16384个节点,每个redis节点管理一个槽
- redis集群中每个节点都存储了其他节点的信息,基于gossip算法传播信息链接。当key传入后可返回该key所在redis节点的信息
-
主从模式
集群中的每个节点也实现了主从模型,实现数据同步和故障转移。