Redis集群的作用
Redis 单节点存在单点故障问题,为了解决单点问题,一般都需要对 Redis 配置从节点,然后使用哨兵来监听 主节点的存活状态,如果主节点挂掉,从节点能继续提供缓存功能,主从配置结合哨兵模式能解决单点故障问 题,提高 Redis 可用性。从节点仅提供读操作,主节点提供写操作。对于读多写少的状况,可给主节点配置多 个从节点,从而提高响应效率。
Redis的几种常见使用方式包括:
- Redis单副本;
- Redis多副本(主从);
- Redis Sentinel(哨兵);
- Redis Cluster;
- Redis自研。
1、Redis单副本
Redis单副本,采用单个Redis节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策 略,适用于数据可靠性要求不高的纯缓存业务场景。
优点:
架构简单,部署方便; 高性价比:缓存使用时无需备用节点(单实例可用性可以用supervisor或crontab保证),当然为 了满足业务的高可用性,也可以牺牲一个备用节点,但同时刻只有一个实例对外提供服务; 高性能。
缺点:
不保证数据的可靠性; 在缓存使用,进程重启后,数据丢失,即使有备用的节点解决高可用性,但是仍然不能解决缓存预 热问题,因此不适用于数据可靠性要求高的业务; 高性能受限于单核CPU的处理能力(Redis是单线程机制),CPU为主要瓶颈,所以适合操作命令 简单,排序、计算较少的场景。
2、redis 主从
redis 的主从通过哨兵机制可以达到高可用
高并发:单位时间内可以接收的请求数量
高可用:服务器的服务质量
应用场景:
1、在生产中难以避免单台 redis 出现故障,保证高可用可以用主从
2、单台 redis 官网说能抗住 11w 并发量,超过了 10w 高并发,就可以主从
3、QPS 瓶颈。其中 QPS 每秒处理的查询次数、TPS 每秒处理的事务数。从请求到获得数据为一个完整事务过 程 注意:一个 master 可以有多个 slave,一个 slave 只能有一个 master,数据流向是单向的 master 到 slave
主从复制的作用:
1、读写分离:master 写,slave 读,提高服务器的读写负载能力
2、负载均衡:基于主从架构,配合读写分离,由 slave 分担 master 负载,并根据需求的变化,改变 slave 的 数量,通过多个从节点分担数据读取负载,大大提高 redis 服务器并发量和数据吞吐量 3、故障恢复:当 master 出现问题时,由 slave 提供服务,实现快速的故障恢复
4、数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
5、高可用基石:基于主从复制,构建哨兵模式与集群,实现 redis 的高可用方案。
主从复制实现原理:
主从复制过程主要可以分为 3 个阶段:连接建立阶段、数据同步阶段、命令传播阶段
1、连接建立阶段:在主从节点之间建立连接,为数据同步做准备
2、数据同步阶段:执行数据的全量(或增量)复制(复制 RDB 文件)
3、命令传播阶段:主节点将已执行的命令发送给从节点,从节点接收命令并执行,从而实现主从节点的数据 一致性 主从模式中,一个主节点可以有多个从节点。为了减少主从复制对主节点的性能影响,一个从节点可以作为另 外一个从节点的主节点进行主从复制。 不足之处:主节点宕机之后,需要手动拉起从节点来提供业务,不能达到高可用
3、哨兵模式
Sentinel Redis Sentinel 是 Redis 的高可用实现方案,它可以实现对 redis 的监控、通知和自动故障转移,当 redis master 挂掉之后,可以自动拉起 slave 提供业务,从而实现 redis 的高可用。为了避免 Sentinel 本身出现单点故障, Sentinel 自己也可采用集群模式
哨兵模式的原理
Sentinel 是一种特殊的 redis 节点,每个 sentinel 节点会维护与其他 redis 节点,包括 master、slave、sentinel 的心跳。
1、当一个 sentinel 节点与 master 节点的心跳丢失时,这个 sentinel 节点就会认为 master 节点出现了故障, 处于不可用的状态,这种判定叫作主观下线,即 sentinel 节点自己主观认为 master 下线了。
2、之后,这个 sentinel 节点会与其他 sentinel 节点交换信息,如果发现认为主节点发生故障的 sentinel 节点 的个数超过了某个阈值(通常为 sentinel 节点总数的 1/2+1,即超过半数),则 sentinel 会认为 master 节点 已经处于客观下线的状态,即大家都认为 master 故障不可用了。
3、之后,sentinel 节点中会选举处一个 sentinel leader 来执行 redis 主节点的故障转移。 阿里微服务教程 被选举出的 Sentinel 领导者进行故障转移
进行故障转移的具体步骤
1、在从节点列表中选出一个节点作为新的主节点 过滤不健康或者不满足要求的节点 选择 slave-priority 优先级最高的从节点,如果存在则返回,不存在则继续 选择复制偏移量最大的从节点,如果存在则返回,不存在则继续 选择 runid 最小的从节点
2、Sentinel 领导者节点会对选出来的从节点执行 slaveof no one 命令让其成为主节点
3、Sentinel 领导者节点会向剩余的从节点发送命令,让他们从新的主节点上复制数据
4、Sentinel 领导者会将原来的主节点更新为从节点, 并对其进行监控, 当其恢复后命令它去复制新的主节点。