我這裡搭建演示的版本是redis-5.0.5,這個版本對於集群搭建會有很大的簡化,比如最常用的redis-trib.rb指令碼功能已經整合到redis-cli工具中了,具體下面會詳細介紹。
①、併發量
通常來說,單台redis能夠執行10萬/秒的命令,這個併發基本上能夠滿足我們所有需求了,但有時候比如做離線計算,為了更快的得出結果,有時候我們希望超過這個併發,那這個時候單機就不滿足我們需求了,就需要集群了.
②、資料量
通常來說,單台伺服器的記憶體大概在16g-256g之間,前面我們說redis資料量都是存在記憶體中的,那如果實際業務要儲存在redis的資料量超過了單台機器的記憶體,這個時候最簡單的方法是增加伺服器記憶體,但是單台伺服器記憶體不可能無限制的增加,縱向擴充套件不了了,便想到如何進行橫向擴充套件.這時候我們就會想將這些業務資料分散儲存在多台redis伺服器中,但是要保證多台redis伺服器能夠無障礙的進行記憶體資料溝通,這也就是redis集群.
對於集群來說,如何將原來單台機器上的資料拆分,然後盡量均勻的分布到多台機器上,這是我們建立集群首先要考慮的乙個問題,通常來說,有如下兩種資料分割槽方式。
順序分布
比如我們有100w條資料,有3臺伺服器,我們可以將100w/3的結果分別儲存到三颱伺服器上,如下所示:
雜湊分布
同樣是100w條資料,有3臺伺服器,通過自定義乙個雜湊函式,比如節點取餘的方法,餘數為0的存在第一台伺服器,餘數為1的存在第二台伺服器,餘數為2的儲存在第三台伺服器.如下所示:
特點:資料分散度高;鍵值分布與業務無關;不支援順序訪問;支援批量操作。
問題① 增加節點
如上圖所示,總共10個資料通過節點取餘hash(key)%/3 的方式分布到3個節點,這時候由於訪問量變大,要進行擴容,由 3 個節點變為 4 個節點。
我們發現,如圖所示,資料除了標紅的1 2 沒有進行遷移,別的資料都要進行變動,達到了80%,如果這時候併發很高,80%的資料都要從下層節點(比如資料庫)獲取,會給下層節點造成很大的訪問壓力,這是不能接受的。
即使我們進行翻倍擴容,從3個節點增加到6個節點,其資料遷移也在50%左右。
② 刪除節點
上圖其實不管是哪乙個節點宕機,其資料遷移量都會超過50%。基本上也是我們所不能接受的。
那麼如何使得集群中新增節點或者刪除節點時,資料遷移量最少?——一致性雜湊演算法誕生。
假設有乙個雜湊環,從0到2的32次方,均勻的分成三份,中間存放三個節點,沿著順時針旋轉,從node1到node2之間的資料,存放在node2節點上;從node2到node3之間的資料,存放在node3節點上,依次類推。
假設node1節點宕機,那麼原來node3到node1之間的資料這時候改為存放到node2節點上,node2到node3之間資料保持不變,原來node1到node2之間的資料還是存放在node2上,也就是只影響三分之一的資料,節點越多,影響資料越少。
同理,假設增加乙個節點,影響的資料甚至更少。
當然,實際業務中並不是你節點均勻分布,訪問就會很平均,這時候容易造成訪問傾斜的問題,這裡就會引出虛擬節點的定義。
redis集群資料分布沒有使用一致性雜湊分布,而是使用虛擬槽分割槽概念。
redis內部內建了序號 0-16383 個槽位,每個槽位可以用來儲存乙個資料集合,將這些槽位按順序分配到集群中的各個節點。每次新的資料到來,會通過雜湊函式 crc16(key) 算出將要儲存的槽位下標,然後通過該下標找到前面分配的redis節點,最後將資料儲存到該節點中。
具體情況如下圖:(以集群有3個節點為例)
至於為什麼redis不使用一致性雜湊分布,而是虛擬槽分割槽。因為虛擬槽分割槽雖然沒有一致性雜湊那麼靈活,但是crc16(key)%16384 已經分布很均勻了,並且對於後面節點增刪操作起來也很方便。
**:
Redis集群模式詳解
1.集群節點 1.2 節點啟動 2.槽指派 3.在集群中執行命令 4.重新分片 5.複製與故障轉移 6.集群訊息 7.gossip協議 參考文獻 clusterstate結構 typedef struct clusterstateclusternode結構struct clusternodeclus...
Redis三種集群模式詳解
目錄 redis主從複製 redis 的複製分為兩部分操作 同步 sync 和 命令傳播 command propagate 上面介紹了redis複製的兩種操作,而redis得主從複製正式基於 同步 和 命令傳播 來實現得。下面兩張圖展示了redis複製的流程 優點 1 實現讀寫分離,提高了可用性,...
elasticsearch集群詳解
在單台es伺服器節點上,隨著業務量的發展索引檔案慢慢增多,會影響到效率和記憶體儲存問題等。如果使用es集群,會將單台伺服器節點的索引檔案使用分片技術,分布式的存放在多個不同的物理機器上,從而可以實現高可用 容錯性等。es核心存放的是索引。將資料拆分成多台節點進行存放。es是如何解決高併發 es是乙個...