Redis Cluster 是社區版推出的 Redis 分布式集群解決方案,主要解決 Redis 分布式方面的需求,比
如,當遇到單機內存,並發和流量等瓶頸的時候,Redis Cluster 能起到很好的負載均衡的目的。
Redis Cluster 集群節點最小配置 6 個節點以上(3 主 3 從),其中主節點提供讀寫操作,從節點作為
備用節點,不提供請求,只作為故障轉移使用。
Redis Cluster 采用虛擬槽分區,所有的鍵根據哈希函數映射到 0~16383 個整數槽內,每個節點負責維
護一部分槽以及槽所映射的鍵值數據 
原理
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放到哪個桶中。
a.redis cluster節點分配 現在我們是三個主節點分別是:A, B, C 三個節點,它們可以是一台機器上的
三個端口,也可以是三台不同的服務器。那么,采用哈希槽 (hash slot)的方式來分配16384個slot 的
話,它們三個節點分別承擔的slot 區間是:
節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383.
獲取數據: 如果存入一個值,按照redis cluster哈希槽的算法: CRC16('key')384 = 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移動完成后就可以刪除這個節點了。
b.Redis Cluster主從模式 redis cluster 為了保證數據的高可用性,加入了主從模式,一個主節點對應
一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉后,
就會有這個從節點選取一個來充當主節點,從而保證集群不會掛掉
上面那個例子里, 集群有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法
訪問整個集群了。A和C的slot也無法訪問。
所以我們在集群建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 集群包含主節點A、B、
C, 以及從節點
