1. 程式人生 > >Redis叢集的兩種實現方式之Redis Sharding和Redis Cluster

Redis叢集的兩種實現方式之Redis Sharding和Redis Cluster

  在當前網際網路的背景下,企業的業務需求越來越大,所以一般的業務+資料庫已經不能滿足需求了,所以大批的記憶體式資料庫應運而生,Redis是一個應用比較廣泛的資料庫。用它來實現分散式的操作得心應手。目前有兩種實現分散式的方式,基於Redisx2的Redis Sharding,還有基於Redisx3的Redis Cluster。

我閱讀了一些大牛的文章,做了一些總結:

因為Redis Cluster是基於Redis Shadring的,所以先看一下Redis Sharding

    1:Redis Sharding

這是客戶端sharding分片技術的體現,它是一主多備的實現方式。採用一致性Hash演算法來實現資料的分片。採用普通的Hash演算法來實現分片不是不行,但是當我們增加一個伺服器或者一個伺服器突然宕機的時候,我們便要在列表中增加一個編號或者刪除一個編號,那麼普通的在普通hash演算法的情況下,按照h = Hash(key) % (N+1)

重新計算雜湊值,這種情況下系統中一旦有伺服器變更,大量的key會被重定位到不同的伺服器從而造成大量的快取不命中。而這種情況在分散式系統中是非常糟糕的。所以我們採用一致性Hash演算法,關於這個演算法更詳細的地方可以參考:

那麼Redis Sharding作為客戶端分片,服務端還是一個個Redis例項節點,我們也不需要增加額外的中間元件,所以它是十分靈活的。但是相應的,它也要在一些方面做出妥協,比如叢集擴容方面,當我們想要增加或者刪除一個節點的時候,就需要進行鍵值遷移(儘管我們採用了一致性Hash演算法,還是會發生key匹配不到的情況,所以就需要進行鍵值遷移)。

但是對於客戶端進行鍵值遷移比較不現實,這就需要我們從後端,資料庫去讀資料,但是跨過快取區訪問資料庫對系統會造成很 大的壓力,所以它就採用一種取巧的方法,即一主多從的方式來實現。即一個主Master和多個從slave,即使這樣,一個Redis節點有可能還是要承受很多訪問,所以可以採用讀寫分離,即主master進行讀操作,從slave進行寫操作,因為一般讀操作往往是寫操作的很多倍。

關於主從備份的一些圖片以及更多詳細知識,可以參考下面連結

    1:Redis Cluster

相較於單機版的Redis,Redis Cluster保證了CAP理論中的C(Consistency一致性)和A(Availability 可用性),Redis Cluster的誕生是基於Redis Sharding的,因為對於Redis Sharding的資料遷移一直是比較麻煩的,它一方面要保證業務的可用性,一方面又要保證資料不會發生丟失,所以能夠資料不遷移就不遷移,所以就誕生了Redis Cluster。