Redis之集群知识点总结(二)-- 源码分析
一 集群的数据结构
ClusterNode
clusterNode 结构保存了一个节点的当前状态,比如节点的创建时间、节点的名字、节点 当前的配置纪元、节点的IP地址和端口号等等。除此之外,clusterNode结构的 link 属性是一个clusterLink结构,该结构保存了连接节点所需的有关信息,比如套接字描述符,输入缓冲区和输出缓冲区。clusterNode 还有一个 fail_report 的列表,用来记录疑似下线报告。
typedef struct clusterNode { mstime_t ctime; /* 创建节点的时间 */ char name[CLUSTER_NAMELEN]; /* 节点的名字 */ int flags; /* 节点标识,标记节点角色或者状态,比如主节点从节点或者在线和下线 */ uint64_t configEpoch; /* 当前节点已知的集群统一epoch */ unsigned char slots[CLUSTER_SLOTS/8]; /* slots handled by this node */ int numslots; /* Number of slots handled by this node */ int numslaves; /* Number of slave nodes, if this is a master */ struct clusterNode **slaves; /* pointers to slave nodes */ struct clusterNode *slaveof; /* pointer to the master node. Note that it may be NULL even if the node is a slave if we don't have the master node in our tables. */ mstime_t ping_sent; /* 当前节点最后一次向该节点发送 PING 消息的时间 */ mstime_t pong_received; /* 当前节点最后一次收到该节点 PONG 消息的时间 */ mstime_t fail_time; /* FAIL 标志位被设置的时间 */ mstime_t voted_time; /* Last time we voted for a slave of this master */ mstime_t repl_offset_time; /* Unix time we received offset for this node */ mstime_t orphaned_time; /* Starting time of orphaned master condition */ long long repl_offset; /* 当前节点的repl便宜 */ char ip[NET_IP_STR_LEN]; /* 节点的IP 地址 */ int port; /* 端口 */ int cport; /* 通信端口,一般是端口+1000 */ clusterLink *link; /* 和该节点的 tcp 连接 */ list *fail_reports; /* 下线记录列表 */ } clusterNode;
clusterNodeFailReport 是记录节点下线报告的结构体, node 是报告节点的信息,而 time 则代表着报告时间。
typedef struct clusterNodeFailReport {
struct clusterNode *node; /* 报告当前节点已经下线的节点 */
mstime_t time; /* 报告时间 */
} clusterNodeFailReport;
还有一个重要的数据结构,clusterLink
最后,每个节点都保存着一个clusterState的结构,该结构记录着当前的节点的视角下,整个集群的状态。例如,当前集群都有哪些节点,每个节点分配的槽位。
我刚开始看这里时候也是有点绕,后来就明白了。比如NodeA会保存NodeB的信息。把NodeB保存在dict * nodes中。在每个ClusterNode中所保存的Link,表示
的是从NodeA到NodeB的socket链接。
typedef struct clusterState { clusterNode *myself; /* 当前节点的clusterNode信息 */ .... dict *nodes; /* name到clusterNode的字典 */ .... clusterNode *slots[CLUSTER_SLOTS]; /* slot 和节点的对应关系*/ .... } clusterState;
在 clusterState中的slots数组,每一个元素都指向一个ClusterNode,表示该槽位应该由哪个node处理