Redis的高可用

57 阅读5分钟

Redis的高可用

主从复制

简述

  • 是指在Redis主从模式下,通过将主节点(Master)的数据复制到从节点,进而实现读写分离,达到负载均衡的效果
  • Redis数据复制是单向的,只能由主节点复制到从节点

作用

  • 数据冗余。主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
  • 故障恢复。当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
  • 负载均衡。在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载
  • 高可用基石。主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

主从复制方式

全量复制(同步)

通过 replicaof命令配置主库和从库的关系,之后主从间协商完成第一次同步(Redis 5.0 之前使用 slaveof)

主从全量复制使用RDB复制

同步过程分析
  1. 建立连接
  2. 主节点通过bgsave生成RDB文件
  3. 将RDB文件发送给从节点,并记录在发送期间新的写入命令
  4. 从节点接收到主节点的RDB文件后,首先清空现有数据,然后加载新的RDB文件
  5. 当RDB文件发送完毕,再将期间记录的写入命令(Repl Buffer)发送给从节点
  6. 从节点执行Repl Buffer命令
  7. 完成同步

增量复制(同步)

在 Redis 2.8 版本引入了增量复制

读写分离应用分析

  • 延迟与不一致问题
    • 优化主从节点之间的网络环境
    • 监控主从节点延迟(通过offset)判断,如果从节点延迟过大,通知应用不再通过该从节点读取数据
  • 数据过期问题
    • 当主节点设置了惰性删除和定期删除策略,此时都不能保证主节点及时对过期数据执行删除操作,因此当客户端通过Redis从节点读取数据时,很容易读取到已经过期的数据
  • 故障切换问题
    • 如果使用读写分离,需要配合使用哨兵模式,进行故障自动切换达到自动化效果,应避免手动切换等方式处理

拓展

  • 主服务器未开启持久化的情况下,需关闭主节点自动重启,防止自动重启后同步导致子节点数据被清空
  • “主 - 从 - 从”模式
    • 通过级联分担主节点同步压力
    • 命令:replicaof 所选从库的IP 6379
  • 使用无磁盘复制模式
    • Redis从2.8.18版本开始尝试支持无磁盘的复制。即子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储
    • Redis 默认是磁盘复制,但是如果使用比较低速的磁盘,这种操作会给主服务器带来较大的压力

哨兵机制

简述

  • 哨兵机制提供了主节点故障时自动转移的功能,达到主从库自动切换的效果。通过实时监控主从节点状态,当主节点故障时,进行故障转移;从节点故障时,进行节点下线

作用

  • 监控(Monitoring)。哨兵会不断地检查主节点和从节点是否运作正常
  • 自动故障转移(Automatic failover)。当主节点故障时,哨兵会开始自动故障转移操作,在从节点中选择一个成为新的主节点,并让其他从节
  • 配置提供者(Configuration provider)。客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址
  • 通知(Notification)。哨兵可以将故障转移的结果发送给客户端

故障转移

流程分析

  1. 哨兵判定主节点主观下线
  2. 发起哨兵集群投票主节点客观下线
  3. 主节点客观下线(故障)
  4. 哨兵集群投票选举哨兵Leader
  5. 哨兵Leader通过主节点选择的要求,将某个从节点晋升为新的主节点
  6. 将其它从节点的主节点设置为新的主节点
  7. 完成故障转移

机制分析

哨兵监控Redis库

由哨兵向主库发送 INFO 命令,主库接受到这个命令后,就会把从库列表返回给哨兵。哨兵通过从库列表连接信息,和从库建立连接并持续的对从库进行监控

主库下线的判定

客观下线。由哨兵集群共同决定Redis节点是否下线(无法监控/无法访问/网络故障等)

主观下线。当Redis无法进行监控的时候,哨兵会对该库做出节点下线(主观下线)的判断

  • 流程

    哨兵判断主节点主观下线,并发起投票
    	进行投票(其它哨兵)
    		票数大于quorum(配置项)
    			Y(是)
    				判定主节点客观下线
    
竞选哨兵Leader
  • 流程

    竞选哨兵Leader
    	进行投票(哨兵)
    		获选票数大于(哨兵数量 / 2 + 1)
    			成为哨兵Leader
    				控制主节点故障转移和客户端通知
    
新主节点的选择要求
  • 过滤掉不健康的(下线或断线),没有回复过哨兵ping响应的从节点
  • 选择salve-priority从节点优先级最高(redis.conf)的
  • 选择复制偏移量最大,只复制最完整的从节点
主从故障转移细节
  • 将新晋升的主节点脱离从节点(replicaof no one)
  • 将其它从节点指向新的主节点
  • 通知客户端主节点变更
  • 将原主节点变成新的主节点的从节点

分片机制

简述

  • 是一种服务器Sharding技术,用于扩充节点的单机性能(存储与IO能力)
  • 高性能可线性扩展至最多1000节点。集群中没有代理,(集群节点间)使用异步复制,没有归并操作