一 Redis主从复制
有一个主节点(master)和多个从节点(slave)构成,主节点负责写数据,从节点负责读数据,主节点写入的数据会根据配置和策略自动同步到从节点上。
单机有什么问题:
- 单机故障导致服务不可用
- 容量存在瓶颈
- qps存在瓶颈
优点
- 读写分离
- 容灾备份
缺点
1.从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
2.当主机宕机之后,将不能进行写操作,需要手动将从机升级为主机,从机需要重新制定master。
注意点
一个master可以有多个Slave
一个slave只能有一个master
数据流向是单向的,只能从主到从
全量复制存在的时间消耗
- bgsave时间
- rdb文件网络传输
- 从节点请求请求数据时间
- 从节点加载rdb的时间
- 可能的aof重写时间
二 redis哨兵模式
前言
在Redis 2.8版本开始引入。哨兵的核心功能是主节点的自动故障转移(主从复制需要手动操作)。
哨兵主要功能
监控(Monitoring):检查节点,哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移(Automatic Failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作:它会将其中一个从节点升级为新的主节点,并让其他从节点从新的主节点上复制数据。
配置提供者(Configuration Provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
通知(Notification):哨兵可以将故障转移的结果发送给客户端。
监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;配置提供者和通知功能体现在与客户端的交互上。
架构
哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的Redis节点,不存储数据。
数据节点:主节点和从节点都是数据节点。
哨兵相关概念和原理
主观下线:哨兵通过心跳定时检测其他节点(1秒),如果节点超过一定时间没有回复,该哨兵节点就会将其主观下线(该哨兵节点主观的自认为节点下线了)。
客观下线:哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。(客观下线时针对主节点的,其他节点不存在客观下线)
定时任务:每个哨兵节点维护了3个定时任务:
- 每10秒向主从节点发送info命令获取最新的主从结构;
作用:1. 发现slave节点;2. 确定主从关系。 - 每2秒发布订阅功能获取其他哨兵节点的信息,交互对节点的“看法”和自身情况:SUBSCRIBE c2 PUBLISH c2 hello-redis
- 每1秒向其他节点发送ping命令进行心跳检测,判断是否下线(monitor)。
作用:心跳检测,判断节点是否失效。
选举领导者哨兵节点:当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。
领导者哨兵节点选举使用的是Raft算法;Raft算法的基本思路是先到先得:即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。一般来说,哨兵选择的过程很快,谁先完成客观下线,一般就能成为领导者。
故障转移:选举出的领导者哨兵,开始进行故障转移操作,该操作大体可以分为3个步骤:
在从节点中选择新的主节点:选择的原则是,
1.首先过滤掉不健康的从节点;
2.然后选择优先级最高的从节点(由replica-priority配置指定);
3.如果优先级无法区分,则选择复制偏移量最大的从节点;
4.如果仍无法区分,则选择runid最小的从节点。
更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。
将已经下线的主节点保持关注,当该节点重新上线后设置其为从节点。
实践建议
- 哨兵节点的数量应不止一个。一方面增加哨兵节点的冗余,避免哨兵本身成为高可用的瓶颈;另一方面减少对下线的误判。
- 不同的哨兵节点应部署在不同的物理机上。
- 哨兵节点的数量应该是奇数,便于哨兵通过投票做出“决策”:领导者选举的决策、客观下线的决策等。 各个哨兵节点的配置应一致,包括硬件、参数等。
- 保证各节点时间准确、一致。
总结
在主从复制的基础上,哨兵引入了主节点的自动故障转移,进一步提高了Redis的高可用性;但是哨兵的缺陷同样很明显:哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要我们对从节点做额外的监控、切换操作。此外,哨兵仍然没有解决写操作无法负载均衡、及存储能力受到单机限制的问题
redis cluster高可用集群
redis cluster集群介绍
Redis cluster集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis cluster集群不需要哨兵也能完成节点移除和故障转移的功能。
Redis cluster将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到1000节点。redis cluster集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单
总结
redis集群演变过程
1.单机版
核心技术:持久化
持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
2.复制
复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
3.哨兵
在复制的基础上,哨兵实现了自动化的故障恢复。缺陷是写操作无法负载均衡;存储能力受到单机的限制。
4.集群
通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案