Redis資料量日益增大,而且使用的公司越來越多,不僅用於做緩存,同時趨向於存儲這塊,這樣必促使集群的發展,各個公司也正在收集適合自己的叢集方案,目前產業用的比較多的是下面幾種叢集架構,大部分都是採用分片技術,解決單一實例記憶體增大帶來的一系列問題。
本篇文章簡單介紹五種方案:
官方cluster方案
twemproxy代理程式方案
#哨兵模式 codis
#客戶端分片
官方cluser方案
從redis 3.0版本開始支援redis-cluster集群,redis-cluster採用無中心結構,每個節點保存資料和整個集群狀態,每個節點都和其他節點連接。 redis-cluster是一種服務端分片技術。 redis-cluster架構圖redis-cluster特點:
每個節點都和n-1個節點通信,這被稱為叢集匯流排(cluster bus)。它們使用特殊的連接埠號,即對外服務埠號加10000。所以要維護好這個叢集的每個節點訊息,不然會導致整個叢集不可用,其內部採用特殊的二進位協定來優化傳輸速度和頻寬。
redis-cluster把所有的實體節點映射到[0,16383]slot(槽)上,cluster負責維護node--slot--value。
叢集預先分好16384桶,當需要在redis叢集中插入資料時,根據CRC16(KEY) mod 16384的值,決定將一個key放到哪個桶中。
客戶端與redis節點直連,不需要連接叢集所有的節點,連接叢集中任何一個可用節點即可。
Redis代理程式中間件twemproxy是一種利用中間件做分片的技術。 twemproxy處於客戶端和伺服器的中間,將客戶端發來的請求,進行一定的處理後(sharding),再轉發給後端真正的redis伺服器。也就是說,客戶端不直接存取redis伺服器,而是透過twemproxy代理中間件間接存取。降低了客戶端直連後端伺服器的連線數量,並且支援伺服器叢集水平擴展。
twemproxy中間件的內部處理是無狀態的,它本身可以很輕鬆地集群,這樣可以避免單點壓力或故障。
twemproxy又稱為nutcracker,起源於推特系統中redis、memcached叢集的輕量級代理。
哨兵模式
Sentinel哨兵
Sentinel(哨兵)是Redis的高可用性解決方案:由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主伺服器以及這些主伺服器下的所有從伺服器,並在被監視的主伺服器進入下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器。
如果一個實例距離最後一次有效回覆PING指令的時間超過down-after-milliseconds選項所指定的值,則這個實例會被Sentinel標記為主觀下線。
如果一個Master被標記為主觀下線,則正在監視這個Master的所有Sentinel要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
當有足夠數量的Sentinel(大於等於設定檔指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態,則Master會被標記為客觀下線。
在一般情況下,每個Sentinel會以每10秒一次的頻率向它所知的所有Master、Slave發送INFO指令。
當Master被Sentinel標記為客觀下線時,Sentinel向下線的Master的所有Slave發送INFO指令的頻率會從10秒一次改為每秒一次。
如果沒有足夠數量的Sentinel同意Master已經下線,Master的客觀下線狀態就會被移除。若Master重新向Sentinel的PING指令回傳有效值,Master的主觀下線狀態就會移除。
codis
codis是一個分散式的Redis解決方案,由豌豆莢開源,對於上層的應用來說,連接codis proxy和連接原生的redis server沒什麼明顯的區別,上層應用可以像使用單機的redis一樣使用,codis底層會處理請求的轉發,不停機的資料遷移等工作,所有後方的事情,對於前面的客戶端來說是透明的,可以簡單的認為後邊連接的是一個記憶體無限大的redis服務。
客戶端分片
分區的邏輯在客戶端實現,由客戶端自行選擇請求到哪個節點。方案可參考一致性哈希,此方案通常適用於使用者對客戶端的行為有完全控制能力的場景。
總結:沒有最好的方案,只有最適合的方案。
更多Redis相關技術文章,請造訪Redis教學欄位進行學習!
以上是redis集群方案有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!