1. 程式人生 > 其它 >Redis-叢集節點如何組成-從資料機構入手

Redis-叢集節點如何組成-從資料機構入手

技術標籤:Redis原始碼redis資料庫資料結構

1、背景

  • 叢集中的每個節點都需要專門的資料結構來儲存叢集的狀態和自身資訊。
  • 分為clusterNodeclusterState結構:
    clusterNode記錄了叢集中的單個節點的狀態
    clusterState記錄叢集所有節點作為一個整體的狀態

2、clusterNode結構

typedef struct clusterNode {
    //節點建立時間
    mstime_t ctime;
    //節點id
    char name[REDIS_CLUSTER_NAMELEN];
    //節點的ip和埠號
    char
ip[REDIS_IP_STR_LEN]; int port; //節點標識:整型,每個bit都代表了不同狀態,如節點的主從狀態、是否線上、是否在握手等 int flags; //配置紀元:故障轉移時起作用,類似於哨兵的配置紀元 uint64_t configEpoch; //槽在該節點中的分佈:佔用16384/8個位元組,16384個位元;每個位元對應一個槽:位元值為1,則該位元對應的槽在節點中;位元值為0,則該位元對應的槽不在節點中 unsigned char slots[16384/8]; //節點中槽的數量 int numslots;
………… //還包含節點連線、主從複製、故障發現和轉移需要的資訊 } clusterNode;
  • clusterNode 結構儲存了 一個節點的當前狀態,包括建立時間、節點 id、ip 和埠號等。
  • 每個節點都會用一個 clusterNode 結構記錄自己的狀態,併為叢集內所有其他節點都建立一個 clusterNode 結構來記錄節點狀態。

3、clusterState

  • clusterState 結構儲存了在當前節點視角下,叢集所處的狀態。
  • 除下列程式碼展示外,clusterState 還包括故障轉移、槽遷移等需要的資訊
typedef struct clusterState {
    //自身節點
clusterNode *myself; //配置紀元 uint64_t currentEpoch; //叢集狀態:線上還是下線 int state; //叢集中至少包含一個槽的節點數量 int size; //雜湊表,節點名稱->clusterNode節點指標 dict *nodes; //槽分佈資訊:陣列的每個元素都是一個指向clusterNode結構的指標;如果槽還沒有分配給任何節點,則為NULL clusterNode *slots[16384]; ………… } clusterState;