首頁  >  文章  >  資料庫  >  redis如何集群

redis如何集群

(*-*)浩
(*-*)浩原創
2019-06-12 17:06:533805瀏覽

Redis Sharding叢集

Redis Sharding是一種客戶端Sharding分片技術。

redis如何集群

Redis Sharding可以說是Redis Cluster出來之前,業界普遍使用的多Redis實例叢集方法。主要想法是採用雜湊演算法將Redis資料的key進行雜湊,透過hash函數,特定的key會映射到特定的Redis節點上。 (建議學習:Redis影片教學

這樣,客戶端就知道該向哪個Redis節點操作資料,需要說明的是,這是在客戶端完成的。

java redis客戶端jedis,已支援Redis Sharding功能,即ShardedJedis以及結合快取池的ShardedJedisPool。 Jedis的Redis Sharding實作具有以下特點:

##1、採用一致性雜湊演算法(consistent hashing)

將key和節點name同時哈希,然後進行映射匹配,採用的演算法是MURMUR_HASH。一致性雜湊主要原因是當增加或減少節點時,不會產生由於重新匹配造成的rehashing。一致性雜湊只影響相鄰節點key分配,影響量小。更多一致性雜湊演算法介紹,可以參考:http://blog.csdn.net/cywosp/article/details/23397179/

#2、虛擬節點

#ShardedJedis會對每個Redis節點,依照名字虛擬化出160個虛擬節點進行雜湊。用虛擬節點做映射匹配,可以在增加或減少Redis節點時,key在各Redis節點移動更分配更均勻,而不是只有相鄰節點受影響。如圖,Redis節點1虛擬化成NODE1-1和NODE1-2,散列中哈希環上。這樣當object1、object2雜湊時,選取最近節點NODE1-1和NODE1-2,而NODE1-1和NODE1-2又是NODE節點的虛擬節點,即實際儲存在NODE節點上。

增加虛擬節點,可以確保平衡性,也就是每台Redis機器,儲存的資料都差不多,而不是一台機器儲存的資料較多,其它的少。

3、ShardedJedis支持keyTagPattern模式

#抽取key的一部分keyTag做sharding,這樣透過合理命名key,可以將一組相關聯的key放入同一Redis節點,避免跨節點存取。即客戶端將相同規則的key值,指定儲存在同一Redis節點上。

新增或減少節點時?

Redis Sharding採用客戶端Sharding方式,服務端的Redis還是一個相對獨立的Redis實例節點。同時,我們也不需要增加額外的中間處理元件,這是一個非常輕量、靈活的Redis多實例叢集方案。

當然,這種輕量靈活方式必然在集群其它能力方面做出妥協。例如擴容,當想要增加Redis節點時,儘管採用一致性哈希,那麼不同的key就分佈到不同的Redis節點上。

當我們需要擴容時,增加機器到分片清單。這時候客戶端根據key算出來落到跟原來不同的機器上,這樣如果要取某一個值,會出現取不到的情況。

對於這種情況,一般的作法是取不到後,直接從後端資料庫重新載入數據,但有些時候,擊穿快取層,直接存取資料庫層,會對系統存取造成很大壓力。

Redis作者給了一個辦法--presharding。

是一種線上擴容的方法,原理是將每一台實體機上,運行多個不同連接埠的Redis實例,假如三個實體機,每個實體機運行三個Redis實例,那麼我們的分片列表中實際有9個Redis實例,當我們需要擴容時,增加一台實體機,步驟如下:

1、在新的實體機上執行Redis-server

2、該Redis-server從屬於(slaveof)分片列表中的某一Redis-Server(假設叫RedisA)。

3、主從複製(Replication)完成後,將客戶端分片清單中RedisA的IP和連接埠改為新實體機上Redis-Server的IP和連接埠。

4、停止RedisA

這樣相當於將某一Redis-Server轉移到了一台新機器上。但還是很依賴Redis本身的複製功能,如果主庫快照資料檔過大,這個複製的過程也會很久,同時也會給主Redis帶來壓力,所以做這個拆分的過程最好選擇業務訪問低峰時段進行。

節點發生故障時

並不是只有增刪Redis節點造成鍵值遺失問題,更大的障礙來自Redis節點突然宕機。

為不影響Redis效能,盡量不開啟AOF與RDB檔案儲存功能,因此需架構Redis主備模式,主Redis宕機,備Redis留有備份,資料不會遺失。

Sharding演變成如下:

這樣,我們的架構模式變成一個Redis節點切片包含一個主Redis和一個備Redis,主備共同組成一個Redis節點,透過自動故障轉移,確保了節點的高可用性.

Redis Sentinel哨兵

#提供了在主備模式下Redis監控、故障轉移等功能,達到系統的高可用性。

讀寫分離

高訪問時量下,即使採用Sharding分片,一個單獨節點還是承擔了很大的存取壓力,這時我們還需要進一步分解。

通常情況下,讀常常是寫的數倍,這時我們可以將讀寫分離,讀提供更多的實例數。利用主從模式實現讀寫分離,主負責寫,從負責只讀,同時一主掛多個從。在Redis Sentinel監控下,還可以保障節點故障的自動監測。

更多Redis相關技術文章,請造訪Redis資料庫使用入門教學欄位學習!

以上是redis如何集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn