Redis的高可用
主从复制
简述
- 是指在Redis主从模式下,通过将主节点(Master)的数据复制到从节点,进而实现读写分离,达到负载均衡的效果
- Redis数据复制是单向的,只能由主节点复制到从节点
作用
- 数据冗余。主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
- 故障恢复。当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
- 负载均衡。在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载
- 高可用基石。主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础
主从复制方式
全量复制(同步)
通过 replicaof命令配置主库和从库的关系,之后主从间协商完成第一次同步(Redis 5.0 之前使用 slaveof)
主从全量复制使用RDB复制
同步过程分析
- 建立连接
- 主节点通过bgsave生成RDB文件
- 将RDB文件发送给从节点,并记录在发送期间新的写入命令
- 从节点接收到主节点的RDB文件后,首先清空现有数据,然后加载新的RDB文件
- 当RDB文件发送完毕,再将期间记录的写入命令(Repl Buffer)发送给从节点
- 从节点执行Repl Buffer命令
- 完成同步
增量复制(同步)
在 Redis 2.8 版本引入了增量复制
读写分离应用分析
- 延迟与不一致问题
- 优化主从节点之间的网络环境
- 监控主从节点延迟(通过offset)判断,如果从节点延迟过大,通知应用不再通过该从节点读取数据
- 数据过期问题
- 当主节点设置了惰性删除和定期删除策略,此时都不能保证主节点及时对过期数据执行删除操作,因此当客户端通过Redis从节点读取数据时,很容易读取到已经过期的数据
- 故障切换问题
- 如果使用读写分离,需要配合使用哨兵模式,进行故障自动切换达到自动化效果,应避免手动切换等方式处理
拓展
- 主服务器未开启持久化的情况下,需关闭主节点自动重启,防止自动重启后同步导致子节点数据被清空
- “主 - 从 - 从”模式
- 通过级联分担主节点同步压力
- 命令:replicaof 所选从库的IP 6379
- 使用无磁盘复制模式
- Redis从2.8.18版本开始尝试支持无磁盘的复制。即子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储
- Redis 默认是磁盘复制,但是如果使用比较低速的磁盘,这种操作会给主服务器带来较大的压力
哨兵机制
简述
- 哨兵机制提供了主节点故障时自动转移的功能,达到主从库自动切换的效果。通过实时监控主从节点状态,当主节点故障时,进行故障转移;从节点故障时,进行节点下线
作用
- 监控(Monitoring)。哨兵会不断地检查主节点和从节点是否运作正常
- 自动故障转移(Automatic failover)。当主节点故障时,哨兵会开始自动故障转移操作,在从节点中选择一个成为新的主节点,并让其他从节
- 配置提供者(Configuration provider)。客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址
- 通知(Notification)。哨兵可以将故障转移的结果发送给客户端
故障转移
流程分析
- 哨兵判定主节点主观下线
- 发起哨兵集群投票主节点客观下线
- 主节点客观下线(故障)
- 哨兵集群投票选举哨兵Leader
- 哨兵Leader通过主节点选择的要求,将某个从节点晋升为新的主节点
- 将其它从节点的主节点设置为新的主节点
- 完成故障转移
机制分析
哨兵监控Redis库
由哨兵向主库发送 INFO 命令,主库接受到这个命令后,就会把从库列表返回给哨兵。哨兵通过从库列表连接信息,和从库建立连接并持续的对从库进行监控
主库下线的判定
客观下线。由哨兵集群共同决定Redis节点是否下线(无法监控/无法访问/网络故障等)
主观下线。当Redis无法进行监控的时候,哨兵会对该库做出节点下线(主观下线)的判断
-
流程
哨兵判断主节点主观下线,并发起投票 进行投票(其它哨兵) 票数大于quorum(配置项) Y(是) 判定主节点客观下线
竞选哨兵Leader
-
流程
竞选哨兵Leader 进行投票(哨兵) 获选票数大于(哨兵数量 / 2 + 1) 成为哨兵Leader 控制主节点故障转移和客户端通知
新主节点的选择要求
- 过滤掉不健康的(下线或断线),没有回复过哨兵ping响应的从节点
- 选择salve-priority从节点优先级最高(redis.conf)的
- 选择复制偏移量最大,只复制最完整的从节点
主从故障转移细节
- 将新晋升的主节点脱离从节点(replicaof no one)
- 将其它从节点指向新的主节点
- 通知客户端主节点变更
- 将原主节点变成新的主节点的从节点
分片机制
简述
- 是一种服务器Sharding技术,用于扩充节点的单机性能(存储与IO能力)
- 高性能可线性扩展至最多1000节点。集群中没有代理,(集群节点间)使用异步复制,没有归并操作