1. 程式人生 > 其它 >Redis之叢集知識點總結(二)-- 原始碼分析

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處理