ClusterMode.1 - wyc902/redis GitHub Wiki

redis运行在集群模式下的相关数据结构在cluster.h文件里主要有三个,clusterNode,clusterLink,clusterState

typedef struct clusterNode {
    mstime_t ctime; 
    char name[CLUSTER_NAMELEN]; 
    int flags;                 /* 标志,主节点or从节点,节点目前状态 */
    uint64_t configEpoch; 
    unsigned char slots[CLUSTER_SLOTS/8]; /* CLUSTER_SLOTS=16384, 这个node 处理的槽 */
    int numslots;    /* 节点处理槽的个数 */
    int numslaves;  /* 从节点个数 */
    struct clusterNode **slaves; /* 指向所有从节点数组 */
    struct clusterNode *slaveof; /* 指向主节点 */
   .....
    char ip[NET_IP_STR_LEN];  /* 节点ip地址 */
    int port;                   /* 节点的端口 */
    ....
    clusterLink *link;          /* 节点的tcp连接的信息,fd,输入输出缓冲区指针 */
  ......
} clusterNode;

typedef struct clusterState {
    clusterNode *myself;  /* 指向本节点 */
    uint64_t currentEpoch;
    int state;            /集群的状态/
    int size;             /* 负责处理槽的master node数量 */
    dict *nodes;          /* 键值对,key是节点名一般是ip:port,value是对应clusterNode结构 */
    ....
    clusterNode *migrating_slots_to[CLUSTER_SLOTS]; /*迁移走的槽信息*/
    clusterNode *importing_slots_from[CLUSTER_SLOTS]; /*迁来的槽信息*/
    clusterNode *slots[CLUSTER_SLOTS]; /*槽指派信息,处理第i槽的clusterNode结构*/
  ......
} clusterState

clusterState结构存储的是这个节点视角下怎个cluster的状态。通过clusterState.slots就知道第i槽归哪个节点处理。 slots 数组共有16384个二进制位每位表示一个槽,如果第i位是1表示槽i归该节点处理。这样通过位运算就知道这个节点处理哪些槽。