1. 程式人生 > >RedisCluster叢集原理

RedisCluster叢集原理

主從複製,資料值每個伺服器都存了。

針對redis叢集的解決方案, 

   連線這個叢集,不用在乎Master了

  6臺redis

 

1、why use Redis?

  減輕資料庫訪問壓力

2、持久化

  RDB(間隔,非實時) AOF(日誌形式記錄,實時)   如果在專案 斷電(不會儲存) 和 停止redis  redis停止時候會儲存就rdb日誌檔案     rdb是獨立程序實現的

3、redis 叢集方案  

                            redis3.0 之前 不支援redis叢集

     1、客戶端分片技術(mycat,沒有故障轉移功能)

     2、主從複製實現的叢集,缺點資料冗餘! 

     3、redis強烈推薦 redis-cluster (redis3.0之後實現的)

 

三臺獨立的 redis 伺服器

卡槽:0 - 16384位置

   set name  ok

  如何儲存呢? 

      根據客戶端的key  進行演算法 計算出一個數字    取模 卡槽總數(16384)  得出來的值 對映到對應的卡槽

     比如有3臺redis   每個卡槽均勻分佈

 

客戶端隨便連線一臺redis   get name時候    根據key 通過演算法 得到數字 自動轉到 實際值儲存的那一臺

 

 

Redis叢集方式

3.0版本之前

 

  1. 3.0版本之前的redis是不支援叢集的,我們的redis如果想要叢集的話,就需要一箇中間件,然後這個中介軟體負責將我們需要存入redis中的資料的key通過一套演算法計算得出一個值。然後根據這個值找到對應的redis節點,將這些資料存在這個redis的節點中。
  2.       在取值的時候,同樣先將key進行計算,得到對應的值,然後就去找對應的redis節點,從對應的節點中取出對應的值。
  3.   這樣做有很多不好的地方,比如說我們的這些計算都需要在系統中去進行,所以會增加系統的負擔。還有就是這種叢集模式下,某個節點掛掉,其他的節點無法知道。而且也不容易對每個節點進行負載均衡。

常見叢集方案

1.官方方案redis-cluster搭建實戰

2.客戶端分片技術(不推薦),擴容/縮容時,必須手動調整分片程式,出現故障不能自動轉移

3.可以使用主從複製方式(不推薦)

4.使用一些代理工具

 

Redis-cluster原理

 

 

 

Redis 是一個開源的 key-value 儲存系統,由於出眾的效能,大部分網際網路企業都用來做伺服器端快取。Redis 在3.0版本前只支援單例項模式,雖然支援主從模式、哨兵模式部署來解決單點故障,但是現在網際網路企業動輒大幾百G的資料,可完全是沒法滿足業務的需求,所以,Redis 在 3.0 版本以後就推出了叢集模式。

Redis 叢集採用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 個 slot,每個 Redis 例項負責其中一部分 slot 。叢集中的

所有資訊(節點、埠、slot等),都通過節點之間定期的資料交換而更新。

Redis 客戶端可以在任意一個 Redis 例項發出請求,如果所需資料不在該例項中,通過重定向命令引導客戶端訪問所需的例項。

 

 

 

 

 

在這個圖中,每一個藍色的圈都代表著一個redis的伺服器節點。它們任何兩個節點之間都是相互連通的。客戶端可以與任何一個節點相連線,然後就可以訪問叢集中的任何一個節點。對其進行存取和其他操作。

那麼redis是怎麼做到的呢?首先,在redis的每一個節點上,都有這麼兩個東西,一個是插槽(slot)可以理解為是一個可以儲存兩個數值的一個變數這個變數的取值範圍是:0-16383。還有一個就是cluster我個人把這個cluster理解為是一個叢集管理的外掛。當我們的存取的key到達的時候,redis會根據crc16的演算法得出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作。

還有就是因為如果叢集的話,是有好多個redis一起工作的,那麼,就需要這個叢集不是那麼容易掛掉,所以呢,理論上就應該給叢集中的每個節點至少一個備用的redis服務。這個備用的redis稱為從節點(slave)。那麼這個叢集是如何判斷是否有某個節點掛掉了呢?

 首先要說的是,每一個節點都存有這個叢集所有主節點以及從節點的資訊。

 它們之間通過互相的ping-pong判斷是否節點可以連線上。如果有一半以上的節點去ping一個節點的時候沒有迴應,叢集就認為這個節點宕機了,然後去連線它的備用節點。如果某個節點和所有從節點全部掛掉,我們叢集就進入faill狀態。還有就是如果有一半以上的主節點宕機,那麼我們叢集同樣進入發力了狀態。這就是我們的redis的投票機制,具體原理

 

這套架構的特點:

 

分片演算法:基於 slot hash桶;

分片例項之間相互獨立,每組 一個master 例項和多個slave;

路由資訊存放到第三方儲存元件,如 zookeeper 或etcd

旁路元件探活