【Redis】6. Redis集群

790 阅读4分钟

Redis集群介绍

Redis在 3.0 后开始支持Cluster(集群)模式。

目前Redis的集群支持节点的自动发现,支持Master-Slave选举和容错,支持在线分片(Reshard)等。

节点的自动发现:往集群中动态添加一个节点,该节点可以自动融入该集群。

Master-Slave选举和容错:在Master节点故障时,在若干个Slave节点中选出一个顶替原Master节点成为新Master节点。

在线分片:见下文。

Redis集群架构图

20210922214053.png

在Redis集群中,节点与节点彼此互联,且会相互测心跳,判断对方有没有宕机。测心跳的实质就是节点之间相互通信,因此会大量占用内网带宽。因此Redis对心跳机制的原始通信进行了传输速度和带宽的优化,PING-PANG机制。

PING-PANG机制就是Redis专门为节点之间相互测心跳封装了一个二进制协议,Node1向Node2发送一个PING,如果Node2返回给Node1一个PANG,那么Node1就会判断Node2还处于健康状态。

如果集群中超过半数的节点认为某一个节点处于不健康的状态可能宕机,该集群才会认为该节点宕机,因此Redis集群中的节点个数建议时奇数个。

客户端可以连接Redis集群中的任意一个节点,并且是直连,不需要中间Proxy层。(区别于Tomcat集群需要Nginx做中间层和MySQL集群需要MyCat做中间层)

Redis集群原理

20210923090000.png

首先要明白几个名词的含义

  • 物理节点:对外提供服务的节点,也就是Master节点。
  • Slot:中文翻译叫 "Hash槽"。Redis集群在设计时,规定有 0 ~ 16383 一共16384个Hash槽。Redis在创建时,所有物理节点会对这16384个Hash槽进行平均分配。(比方说集群中有3个Master节点,第1个Master节点分0 ~ 5461的Slot,第2个Master节点分5462 ~ 10922的Slot,第3个Master节点分10922 ~ 16383的Slot)
  • CRC16:一种Hash一致性算法。在集群模式下,CRC16算法会对所有客户端发送给集群的Key进行计算,计算的结果始终在 0 ~ 16383 之间。同一个Key经过多次CRC16计算的结果始终一致,不同的Key进行CRC16计算得到的结果一定会出现重复(不同Key结果一致)。

集群维护物理节点,每个物理节点上必须至少有1个Slot。因为最多只有16384个Slot,假如有16385个物理节点,那么该集群会创建失败,因此Redis集群中最大物理节点上限数为16384

Slot维护Key-Value,假设客户端发送一个 set name John 给Redis集群,虽然客户端可以连接集群中任意一个物理节点,但是该指令并不会向单机模式那样直接到物理节点,而是会先通过CRC16算法进行计算,计算得到的结果后,将Key-Value放入对应Slot区间的物理节点上(例如Key的计算结果为12,那么放入第1个Master节点,因为Master节点的Slot范围是0~5461)。当客户端发送一个 get name 给Redis集群,也会先通过CRC16算法进行计算,计算得到结果后,去对应Slot区间的物理节点上检索Key-Value。

通过CRC16算法,可以让Redis集群中每一个物理节点都能够持有一定的数据,从而解决了单节点的物理上限问题。因为客户端的每个指令都会被CRC16算法计算Key,从而连接重定向到对应的物理节点进行操作,因此Redis集群中是多个物理节点共同对外提供服务,从而解决了单节点压力问题。

因为集群中每一个主从架构都推荐是哨兵机制架构,从而也解决了故障自动转移的问题。(在故障转移时,会连带着Slot一起转移)

重新分配Slot就叫做Reshard,翻译为 "在线重新分片"。比方说当前集群中有三个物理节点,现在需要添加一个物理节点,那么原来分配在三个节点上的Slot就需要进行Reshard,如果不给新节点分配Slot,那么新节点将永远提供不了服务,因为Slot维护Key-Value。具体Slot的分配原则由开发人员指定,在分配Slot时,对应Slot的Key-Value也会一并被分配

Redis集群搭建

自行百度。