Redis Cluster是Redis的分布式解决方案,有效地解决了Redis分布式方面的需求

数据分布

数据分布理论

分布式数据库首先要把震哥哥数据集按照分区规则映射到多个节点问题,把数据集划分到多个节点上,每个节点负责整体数据的一个子集
常见的分区规则有hash分区和顺序分区
image.png

hash分区规则

节点取余分区

一致性哈希分区

虚拟槽分区

虚拟槽分区使用了hash空间,使用分散度良好的hash函数把所有数据映射到一个固定范围的整数集合中,整数定义为槽(slot)。这个范围一般远远大于节点数,Redis Cluster槽范围为0~16383

Redis 数据分区

Redis Cluster采用虚拟槽分区,每个节点负责维护一部分槽以及槽所映射的键值数据
image.png

  • Redis虚拟槽分区的特点:
    1.解耦数据和节点直接的关系,简化了节点扩容和收缩难度
    2.节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据
    3.支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等场景

集群功能限制

需要提前了解,在使用时做好规避

key批量操作支持有限制。

mget、mset等操作可能存在于多个节点上因此不被支持

key事务操作支持优先

支支持多key在同一节点上的事务操作,分布在不同节点上时无法使用事务功能

key作为数据区分的最小力度

不能将一个大的键值对像如hash、list等映射到不同的节点

不支持多数据库空间

单机Redis支持16个数据库,集群只能使用一个数据库空间db 0

复制结构只支持一层

从节点只能复制主节点,不支持嵌套树状复制结构

集群搭建

有三个步骤:准备节点、节点握手、分配槽

准备节点

集群配置文件如下
image.png

image.png
启动之后会生成配置文件,根据命令规则生成如下

image.png4

集群模式的Redis除了原有配置文件又有几千年配置文件,当集群内节点信息发生变化,如添加、下线节点、故障转移等。节点会自动保存集群状态到配置文件,Redis会自动维护集群配置文件,不需要手动更改,防止节点重启时产生节点错乱
其配置文件如下
image.png
记录内容:

  • 节点ID:由40位16禁止字串,唯一标识集群内一个节点。节点ID不同于运行ID,只在初始化时创建一次,节点重启时会加载配置文件重用

节点握手

通过握手让节点彼此建立联系从而组成一个集群。通过Gossip协议批次通信,达到感知的过程
cluster meet 127.0.0.1 6380让6380和6379通信(用localhost报错,如下图)
image.png

分别与其他节点执行meet加入集群中(只需要再集群内任意节点上执行cluster meet命令加入新节点,握手状态会通过消息在集群内传播,其他节点会自动发现新节点并发起握手流程
image.png
查看集群状态
image.png
此时集群还不能正常工作,处于下线状态,所有的数据读写都被禁止,因为目前所有的槽没有分配到节点,因此集群无法完成槽到节点的映射,必须16384个槽全部分配节点后,集群才进入在线状态
image.png

分配槽 cluster addslots

cluster addslots [num1..num2]
image.png
如上图
cluster_state:OK,集群进入在线状态
image.png

主从复制节点槽信息 cluster replication [nodeId]

如前面图所示,还有3个节点没有没有使用。在集群模式下Redis节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从节点复制主节点槽信息和相关的数据。
使用cluster replicate [noedId]命令上3个未使用的节点变为已经使用的3个主节点的从节点
image.png
到目前为止,手动建立了Redis集群,由6个节点构成,3个主节点负责处理槽和相关数据,3个从节点负责故障转移
image.png

使用redis-trib.rb搭建集群

当集群节点众多时,必然会加大搭建集群的复杂度和运维成本。因此Redis官方提供了redis-trib.rb工具快速搭建集群

redis-trib.rb介绍

redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令简化集群创建、检查、槽迁移和均衡等常见运维操作

Ruby环境准备

yum安装Ruby
image.png
yum安装redis-trib
image.png
image.png
检查是否安装好redis-trib
image.png
其提供了集群创建、检查、修复、均衡等命令行工具

准备节点

按照之前的配置文件,删除node配置文件
image.png
启动节点
image.png

创建集群

image.png
如上图所示,

  • --replicas参数指定急群众每个主节点配备几个从节点,此处设置为1
  • 同意上述配置,redis-trib开始执行节点握手和槽分配
    image.png
    image.png
  • 如上图所示16384个槽全部分配,集群创建成功

检查集群完整性:redis-trib check

image.png
集群完整性指的是所有的槽都愤怒配到存活的主节点上,使用redis-trib check检查创建的是否成功
image.png

节点通信

通信流程

分布式存储中需要提供维护节点元数据信息的机制

  • 元数据:节点负责那些数据,是否出现故障等状态信息
    常见的元数据维护方式分为:集中式和P2P方式
    Redis采用PSP的Gossip(流言协议),原理为家电彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,最终达到一致的状态,这种方式类似流言传播

Gossip消息

节点选择

集群伸缩

伸缩原理

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

  • 集群水平伸缩的上层原理
    集群伸缩=槽和数据在节点之间的移动

扩容集群

扩容集群可分为准备新节点、加入集群迁移槽和数据

收缩集群

收缩集群要所见规模,需要从现有急群众安全下线部分节点。

  • 流程说明:
    1.下线的节点是否由负责的槽,如果是,需要把槽迁移到其他节点,保证节点下线后真个集群槽节点映射的完整性
    2.当下线节点不择负责槽或者本身是从节点时,就可以通知集群内其他节点忘记下线节点,当所有的节点忘记该节点后可以正常关闭

请求路由

故障转移

集群运维


这个家伙很懒,啥也没有留下😋