Redis集群介绍了解

Redis高可用-集群模式

image-20210220100728162

什么是Redis集群

Redis集群是一个分布式的,容错,不存在中心节点的集群实现。集群中存在多个master节点,每个master节点负责不同的数据,每个master节点有一个以上slave节点,每个slave节点仅备份当前master节点的数据。各master负责的键值通过数据分片方式分配给每个节点,Redis集群不支持select命令,默认DB为0。

集群节点

节点类型

分为主节点和从节点

节点标识

每个集群节点在集群内都有一个独一无二的ID,该ID是一个十六进制表示的160位随机数,在节点第一次启动时由 /dev/urandom 生成。

节点网络

每个节点启动都需要打开两个TCP连接,每个节点都使用TCP与其他所有节点建立连接,若一个集群有N个节点,每个节点则有N-1个出站连接和N-1个入站连接,节点之间采用Gossip协议交互。

* 低位端口,默认端口6379,用于为用户客户端连接提供服务
* 高位端口,为低位端口+10000,默认16379,该端口为集群总线端口,使用二进制协议节点到节点通信的端口,用于故障检测、配置更新、故障转移授权等数据交换功能。

KEY分布

Redis根据CRC16算法将键空间分割为16384个哈希槽,每个主节点负责处理16384中的一个或者多个。

节点对外广播数据

  • id:节点标识
  • ip:port@cport:节点IP和端口
  • flags:节点状态标识
  • ping-sent:最近在一次发送PING的时间
  • pong-recv:最近一次回复PONG的时间
  • config-epoch:节点配置的时间
  • link-state:链接状态
  • master:若该节点为从节点则会记录主节点ID,若是主节点则填充"-"
  • slot:节点负责的哈希槽范围

节点交互

节点始终接受集群总线端口的连接,在收到ping时回复pong。如果发送节点不是集群的一部分,则抛弃他的所有命令。

重定向

MOVED

127.0.0.1:7001> set demokey 1
(error) MOVED 11172 127.0.0.1:7003

Redis客户端可以向集群中每个节点发送命令包括从节点,redis会根据计算key所在哈希槽,如果是当前节点则直接处理,否则重定向到负责哈希槽的节点(这里是重定向不是代理转发),若当前节点是从节点,则重定向到主节点。

ASK

当节点需要让客户端仅仅在下一条命令请求转向至另外一个节点时,向客户端发送ASK。

节点变更

  • 新增节点:将已存在节点负责的哈希槽移动移动到一个空白节点上去
  • 删除节点:将删除节点负责的哈希槽移动到其他节点上去
  • 变更节点:将节点负责的哈希槽转移到其他节点上

节点变更主要涉及哈希槽的变更,可以了解以下几个状态

  • 可以将某个节点的某个哈希槽设置为 MIGRATING状态,在这个状态下收到命令,会先判断key是否存在本节点中,若存在执行命令,不存在则向客户端返回ASk转向错误,告知客户端,将命令发送到该哈希槽的迁移目标节点。
  • 可以将某个节点的某个哈希槽设置为IMPORTING状态,在这个状态下,在收到ASKING后才会接口这个哈希槽的命令请求。如果客户端没有向服务端发送ASKING,服务端会把命令重定向到真正负责这个哈希槽的节点。

参考

https://redis.io/topics/cluster-spec