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