1. 程式人生 > >Redis 3.2.4集群實戰

Redis 3.2.4集群實戰

取數據 端口 value mod 測試 負責 log redis 集群 tar

一、Redis Cluster集群設計
Redis集群搭建的方式有多種,例如使用zookeeper等,但從redis3.0之後版本支持Redis-Cluster集群,Redis-Cluster采用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。其redis-cluster架構圖如下:
xxxxx
結構特點:
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放到哪個桶中。

1、redis cluster節點分配
假如現在有三個主節點分別是:A, B, C三個節點,它們可以是一臺機器上的三個端口,也可以是三臺不同的服務器。那麽,采用哈希槽 (hash slot)的方式來分配16384個slot的話,它們三個節點分別承擔的slot區間是:

節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383.

獲取數據:
如果存入一個值,按照redis 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

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

2、Redis Cluster主從模式
Redis Cluster為了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會從從節點選取一個來充當主節點,從而保證集群不會掛掉。

上面那個例子裏, 集群有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個集群了。A和C的slot也無法訪問。

所以我們在集群建立的時候,一定要為每個主節點都添加從節點, 比如像這樣, 集群包含主節點A、B、C, 以及從節點A1、B1、C1, 那麽即使B掛掉系統也可以繼續正確工作。

B1節點替代了B節點,所以Redis集群將會選擇B1節點作為新的主節點,集群將會繼續正確地提供服務。 當B重新開啟後,它就會變成B1的從節點。

不過需要註意,如果節點B和B1同時掛了,Redis集群就無法繼續正確地提供服務了。

二、Redis集群搭建

三、redis集群測試
xxxxx

Redis 3.2.4集群實戰