Redis集群基本介绍

  • 简介

          Redis Cluster 是 Redis 的分布式解决方案,在3.0版本正式推出,有效地解决了 Redis 分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用 Cluster 架构方案达到负载均衡的目的。

架构图

 

redis分布式架构 redis分布式原理_redis分布式架构

        在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点,对其进行存取和其他操作。

  • 优点

Redis 集群提供了以下两个好处:

   1、将数据自动切分到多个节点的能力。

   2、当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力,拥有自动故障转移的能力。

 

  • 数据分布

什么是数据分布?数据分布有两种方式,顺序分区和哈希分区。

顺序分区

redis分布式架构 redis分布式原理_redis分布式架构_02

哈希分区


redis分布式架构 redis分布式原理_Redis_03

        如图所示,1~100这整块数字,通过 hash 的函数,取余产生的数。这样可以保证这串数字充分的打散,也保证了均匀的分配到各台机器上。

虚拟槽分区

Redis Cluster 槽范围是0~16383。槽是集群内数据管理和迁移的基本单位。采用大范围槽的主要目的是为了方便数据拆分和集群扩展。每个节点会负责一定数量的槽,下图所示。

redis分布式架构 redis分布式原理_数据_04

        当前集群有5个节点,每个节点平均大约负责3276个槽。由于采用高质量的哈希算法,每个槽所映射的数据通常比较均匀,将数据平均划分到5个节点进行数据分区。Redis Cluster 就是采用虚拟槽分区,下面就介绍 Redis 数据分区方法。

        每当 key 访问过来,Redis Cluster 会计算哈希值是否在这个区间里。它们彼此都知道对应的槽在哪台机器上,这样就能做到平均分配了。

 

Redis-cluster原理

1、节点通信

         在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障等状态信息,Redis 集群采用  Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,这种方式类似流言传播

 

集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加10000。

2)每个节点在固定周期内通过特定规则选择几个节点发送 ping 消息。

3)接收到 ping 消息的节点用 pong 消息作为响应。

 

集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终它们会达到一致的状态。当节点出故障、新节点加入、主从角色变化、槽信息变更等事件发生时,通过不断的 ping/pong 消息通信,经过一段时间后所有的节点都会知道整个集群全部节点的最新状态,从而达到集群状态同步的目的。

 

 2、集群伸缩

         Redis 集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。

redis分布式架构 redis分布式原理_数据迁移_05

 

  1. 槽和数据与节点的对应关系

当主节点分别维护自己负责的槽和对应的数据,如果希望加入1个节点实现集群扩容时,需要通过相关命令把一部分槽和数据迁移给新节点

redis分布式架构 redis分布式原理_redis分布式架构_06

 

上面图里的每个节点把一部分槽和数据迁移到新的节点6385,每个节点负责的槽和数据相比之前变少了从而达到了集群扩容的目的,集群伸缩=槽和数据在节点之间的移动。

2.扩容操作

扩容是分布式存储最常见的需求,Redis 集群扩容操作可分为如下步骤:

1)准备新节点。

2)加入集群。

3)迁移槽和数据。

 

2.1、准备新节点

需要提前准备好新节点并运行在集群模式下,新节点建议跟集群内的节点配置保持一致,便于管理统一。

2.2、加入集群

2.3、迁移槽和数据

       加入集群后需要为新节点迁移槽和相关数据,槽在迁移过程中集群可以正常提供读写服务,迁移过程是集群扩容最核心的环节,下面详细讲解。

redis分布式架构 redis分布式原理_Redis_07

      槽是 Redis 集群管理数据的基本单位,首先需要为新节点制定槽的迁移计划,确定原有节点的哪些槽需要迁移到新节点。迁移计划需要确保每个节点负责相似数量的槽,从而保证各节点的数据均匀,比如之前是三个节点,现在是四个节点,把节点槽分布在四个节点上。

     槽迁移计划确定后开始逐个把槽内数据从源节点迁移到目标节点

redis分布式架构 redis分布式原理_数据迁移_08

数据迁移过程是逐个槽进行的

流程说明:

1)对目标节点发送导入命令,让目标节点准备导入槽的数据。

2)对源节点发送导出命令,让源节点准备迁出槽的数据。

3)源节点循环执行迁移命令,将槽跟数据迁移到目标节点。

redis分布式架构 redis分布式原理_数据迁移_09

 

持续完善,待续...