1. 程式人生 > >redis-cluster核心原理分析:gossip通訊、jedis smart定位、主備切換

redis-cluster核心原理分析:gossip通訊、jedis smart定位、主備切換

1、節點間的內部通訊機制

1.1 基礎通訊原理

  • redis cluster節點間採取gossip協議進行通訊
    維護叢集的元資料有兩種方式:集中式和gossip
    集中式:
    優點在於元資料的更新和讀取,時效性非常好,一旦元資料出現變更立即就會更新到集中式的儲存中,其他節點讀取的時候立即就可以立即感知到;
    不足在於所有的元資料的更新壓力全部集中在一個地方,可能導致元資料的儲存壓力。
    gossip:
    優點在於元資料的更新比較分散,不是集中在一個地方,更新請求會陸陸續續,打到所有節點上去更新,有一定的延時,降低了壓力;
    缺點在於元資料更新有延時可能導致叢集的一些操作會有一些滯後。
  • 10000埠
    每個節點都有一個專門用於節點間通訊的埠,就是自己提供服務的埠號+10000,比如7001,那麼用於節點間通訊的就是17001埠。
    每個節點每隔一段時間都會往另外幾個節點發送ping訊息,同時其他幾點接收到ping之後返回pong。

1.2 gossip協議

gossip協議包含多種訊息,包括ping,pong,meet,fail等等。
meet:某個節點發送meet給新加入的節點,讓新節點加入叢集中,然後新節點就會開始與其他節點進行通訊;
ping:每個節點都會頻繁給其他節點發送ping,其中包含自己的狀態還有自己維護的叢集元資料,互相通過ping交換元資料;
pong: 返回ping和meet,包含自己的狀態和其他資訊,也可以用於資訊廣播和更新;
fail: 某個節點判斷另一個節點fail之後,就傳送fail給其他節點,通知其他節點,指定的節點宕機了。

2、面向叢集的jedis內部實現原理

2.1 基於重定向的客戶端

  • 請求重定向
    客戶端會挑選任意一個redis例項去傳送命令,每個redis例項接收到命令,都會計算key對應的hash slot;
#檢視key對應的hash slot
cluster keyslot key

#連線客戶端時加-c引數可以自動重定向
redis-cli -c
  • 計算hash slot
    計算hash slot的演算法,就是根據key計算CRC16值,然後對16384取模,拿到對應的hash slot;
    用hash tag可以手動指定key對應的slot,同一個hash tag下的key,都會在一個hash slot中,比如set mykey1:{100}和set mykey2:{100};
  • hash slot查詢
    節點間通過gossip協議進行資料交換,就知道每個hash slot在哪個節點上;

2.2 smart jedis

(1) 什麼是smart jedis?
基於重定向的客戶端,很消耗網路io,因為大部分情況下,可能都會出現一次請求重定向,才能找到正確的節點;
所以大部分的客戶端比如java redis客戶端,都是jedis,都是smart的,
本地維護一份hashslot -> node的對映表在快取裡,大部分情況下直接走本地快取就可以找到hashslot -> node,不需要通過節點進行moved重定向;

3. 高可用性與主備切換原理

3.1 判斷節點宕機

如果一個節點認為另外一個節點宕機,name就是pfail,主觀宕機;
如果多個節點都認為另外一個節點宕機了,那麼就是fail,客觀宕機,跟哨兵的原理幾乎一樣,sdown,odown;
在cluster-node-timeout內,某個節點一直沒有返回pong,那麼就被認為pfail;
如果一個節點認為某個節點pfail了,那麼會在gossip ping訊息中,ping給其他節點,如果超過半數的節點都認為pfail了,那麼就會變成fail;

3.2 從節點過濾

對宕機的master node,從其所有的slave node中,選擇一個切換成master node;
檢查每個slave node與master node斷開連線的時間,如果超過了cluster-node-timeout * cluster-slave-validity-factor,那麼就沒有資格切換成master;

3.3 從節點選舉

哨兵:對所有從節點進行排序,slave priority,offset,run id;
每個從節點,都根據自己對master複製資料的offset,來設定一個選舉時間,offset越大(複製資料越多)的從節點,選舉時間越靠前,優先進行選舉;
所有的master node開始slave選舉投票,給要進行選舉的slave進行投票,如果大部分master node(N/2 + 1)都投票給了某個從節點,那麼選舉通過,那個從節點可以切換成master;
從節點執行主備切換,從節點切換為主節點;

3.4 與哨兵比較

整個流程跟哨兵相比,非常類似,所以說,redis cluster功能強大,直接集成了replication和sentinal的功能;