Redis集群模式

157 阅读2分钟

啥是redis集群

redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。一个集群通常由多个节点组成,刚开始的时候,每个节点都是互相独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。

屏幕快照 2021-07-03 下午2.43.35.png

像上面这样,通过握手,可以把一个节点“拉进”集群。具体命令:CLUSTER MEET ip:port

可以通过CLUSTER NODES 查看当前集群的节点情况。

Redis服务器在启动时,会根据cluster-enabled配置是否为yes, 来决定是否开启集群模式。

集群数据结构

clusterNode保存了一个节点的当前状态,每个节点都有一个clusterNode

struct clusterNode {
    // 创建节点的时间
    mstime_t ctime;
    // 节点的名字
    char name[REDIS_CLUSTER_NAMELEN];
    // 节点标记,主节点,从节点,以及目前所处的状态
    int flags;
    // 节点当前的配置纪元,用于故障转移
    unit64_t configEpoch;
    // 节点ip
    char ip[REDIS_IP_STR_LEN];
    // 节点端口
    int port;
   // 连接节点所需的有关信息
   clusterLink *link;
   // 二进制位数组,一共16384个二进制位,根据二进制位的值来判断节点是否处理槽i
   unsigned char slots[2048];
   // ...
}

每个节点都保存了一个clusterState结构,这个结构记录了在当前节点的视角下,集群目前所处的状态。

struct clusterState {
    // 指向当前节点
    clusterNode *myself;
    // 当前的配置纪元,用于故障转移
    uint64_t currentEpoch;
    // 集群当前状态,在线还是下线
    int state;
    // 集群中至少处理着一个槽的节点的数量
    int size;
    // 集群中的节点名单
    dict *nodes;
}

以前面三个节点为例,下面是一个clusterState例子

屏幕快照 2021-07-03 下午3.12.49.png

从这个图就可以看出握手的过程,就是两个节点彼此互相构建起clusterNode,和clusterState的过程。A与B握手之后,A会通知集群其他的节点,和B一一握手。

槽指派

Redis集群通过分片的方式保存数据库的键值对:集群的整个数据库被分为16384个槽,数据库中的每个键都属于其中一个槽,集群中的每个节点可以处理若干个槽。

数据库每个槽都有节点在处理时,集群处于上线,否则处于下线。