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归该节点处理。这样通过位运算就知道这个节点处理哪些槽。