1. 程式人生 > >Redis cluster叢集模式的原理

Redis cluster叢集模式的原理

 

redis cluster

  自動將資料進行分片,每個master上放一部分資料
  提供內建的高可用支援,部分master不可用時,還是可以繼續工作的

 

  支撐N個redis master node,每個master node都可以掛載多個slave node

  讀寫分離的架構,對於每個master來說,寫就寫到master,然後讀就從mater對應的slave去讀

  高可用,因為每個master都有salve節點,那麼如果mater掛掉,redis cluster這套機制,就會自動將某個slave切換成master

 

redis cluster vs. replication + sentinal

  如果你的資料量很少,主要是承載高併發高效能的場景,比如你的快取一般就幾個G,單機足夠了

  replication,一個mater,多個slave,要幾個slave跟你的要求的讀吞吐量有關係,然後自己搭建一個sentinal叢集,去保證redis主從架構的高可用性,就可以了

  redis cluster,主要是針對海量資料+高併發+高可用的場景,海量資料,如果你的資料量很大,那麼建議就用redis cluster

 

資料分佈演算法

hash演算法

  比如你有 N 個 cache 伺服器(後面簡稱 cache ),那麼如何將一個物件 object 對映到 N 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 N 個 cache :

  hash(object)%N

  如果增加一個cache,對映公式變成了 hash(object)%(N+1)

  如果一個cache宕機了,對映公式變成了 hash(object)%(N-1)

  在這兩種情況下,幾乎所有的 cache 都失效了。會導致資料庫訪問的壓力陡增,嚴重情況,還可能導致資料庫宕機。

 

一致性hash演算法

  一個master宕機不會導致大部分快取失效,可能存在快取熱點問題

 

用虛擬節點改進

 

 

 

redis cluster的hash slot演算法

  redis cluster有固定的16384個hash slot,對每個key計算CRC16值,然後對16384取模,可以獲取key對應的hash slot

  redis cluster中每個master都會持有部分slot,比如有3個master,那麼可能每個master持有5000多個hash slot

  hash slot讓node的增加和移除很簡單,增加一個master,就將其他master的hash slot移動部分過去,減少一個master,就將它的hash slot移動到其他master上去

  移動hash slot的成本是非常低的

  客戶端的api,可以對指定的資料,讓他們走同一個hash slot,通過hash tag來實現

 

  127.0.0.1:7000>CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000  可以將槽0-5000指派給節點7000負責。

  每個節點都會記錄哪些槽指派給了自己,哪些槽指派給了其他節點。

  客戶端向節點發送鍵命令,節點要計算這個鍵屬於哪個槽。

  如果是自己負責這個槽,那麼直接執行命令,如果不是,向客戶端返回一個MOVED錯誤,指引客戶端轉向正確的節點。

 

轉自:中華石杉Java工程師面試突擊