1. 程式人生 > >Azure Redis Cache (5) Redis Cache Cluster叢集模式 Windows Azure Platform 系列文章目錄

Azure Redis Cache (5) Redis Cache Cluster叢集模式 Windows Azure Platform 系列文章目錄

  《Windows Azure Platform 系列文章目錄

  

  Redis Cluster 3.0之後的版本,已經支援Redis Cluster叢集模式,Redis Cluster採用無中心架構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。其redis-cluster架構圖如下

  

 

  架構特點:

  1.所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬

  2.節點的fail是通過叢集中超過半數的節點檢測失效時才生效

  3.客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

  4.redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value

  5.Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中

 

  Redis Cluster叢集節點分配:

  假設我們的Redis Cluster有三個節點,分別是A,B和C,它們可以是一臺機器上的三個埠,也可以是三臺不同的伺服器。那麼,採用雜湊槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:

  節點A覆蓋:0-5460

  節點B覆蓋:5461-10922

  節點C覆蓋:10923-16383

 

  插入資料:

  如果插入一個值,按照Redis Cache Cluster的雜湊槽的演算法: CRC16('key')%16384 = 6782。 就會把這個key 的儲存分配到 B 上了。同樣,當我連線(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的演算法,然後內部跳轉到B節點上獲取資料   

 

  新增一個主節點:

  新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大致就會變成這樣:

  節點A覆蓋:1365-5460

  節點B覆蓋:6827-10922

  節點C覆蓋:12288-16383

  節點D覆蓋:0-1364,5461-6826,10923-12287

  同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了

 

  所以我們在設定Redis Cache叢集的Scale Out,需要小心處理,因為資料會產生移動,消耗大量的IO