一 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解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案