1. 程式人生 > >redis(8)集群簡介

redis(8)集群簡介

互聯 nod 解決 一致性 特點 天都 需要 topic 不一致

一、集群

互聯網每天都會產生大量的數據,單實例已經不能滿足需求。但是如果依賴於硬件成本的提升,那就不是所有人能夠負擔的起的。

集群這個時候出現,一定程度上解決了這個問題。它通過互聯網,將多個單實例連接在一起,對外隱藏實現細節,這樣在用戶看來跟單實例是一樣的。你不需要去購買昂貴的服務器,甚至於只需要通過多臺廉價的服務器就可以滿足需要。

二、redis集群

1、簡介

在redis3.0之前是它的無集群時代,大家只能夠通過一些中間件來完成集群。而3.0開始,redis內部集群的實現開始逐漸替代很多中間件。redis集群主要有以下兩個特點:

1)數據會自動地被分布到集群節點上;

2)它以主從模式提高集群的高可用性。

2、TCP端口

每一個集群節點都有兩個TCP端口需要開啟:

1)用於服務客戶端的端口(通常是6379)

2)用於集群節點的通信端口(服務端口加上10000,如:16379)

你需要確保防火墻沒有關閉這兩個端口,否則集群將無法通信從而失效。

3、數據分片

redis並沒有采用一致性哈希算法,而是使用哈希槽(slot)來包含數據,一個哈希槽可以存放很多數據。

在redis集群裏,總共有16384個哈希槽,每一個key都會根據CRC16算法獲得一個值,然後把這個值對16384求余,那麽也就是說,每一個key都會落在[0,16384]這個區間當中。而這16384個哈希槽將被分配到集群的節點當中,根據計算出的值尋找落在哪個節點,並找到該節點的對應哈希槽,進行操作。

4、主從模型

redis集群的主節點如果掛掉,那麽集群就失效了。為了讓集群高可用,redis實現了主從模式。

例如:

主節點是A、B、C那麽我們將設立從節點A1、B1、C1。主節點A掛掉,那麽從節點A1將會被提升為主節點,以保證集群可用。當然,如果從節點也掛掉,或者一半的主節點掛掉了,那麽集群也就直接失效。

5、一致性

redis集群並不是強一致性,例如:

1)客戶端向主節點A寫入數據

2)主節點A寫入完成並返回OK

3)主節點A再向從節點A1,A2...寫入數據。

我們看到,主節點A寫入數據就立馬返回了,而不是同步對A1,A2...寫入數據以後再返回。那麽如果主節點A寫入完畢,這時主節點A掛掉呢?從節點A1或者A2會被提升為主節點,而從節點還未寫入數據,也就產生了數據不一致的問題。當然,還有很多其它情況會產生數據不一致,這裏只是簡單舉個例子。

6、集群參數配置

在開始構建集群之前,我們先了解一些redis.conf的參數配置:

1)cluster-enabled<yes/no>: 這個配置表示當前的redis實例是否開啟集群支持,如果是那麽配置yes如果你希望它保持單實例那麽配置no;

2) cluster-config-file<filename>: 註意:你看到這裏filename是可配置的,但事實上這裏配置的這個文件是用戶永遠無法接觸到的,也就是說你無法去編輯這個文件。而是當程序啟動的時候,由redis集群節點自動持久化生成並維護的。這個文件裏面包含了一些其它節點的信息,狀態,變量等。

3)cluster-node-timeout<milliseconds>: 這裏配置的是集群節點的超時時間,意思就是當該節點被判斷為不可達(無法通信)的時間超過這個最大時間限制,那麽將會被判定為該節點失效。

4)cluster-slave-validity-factor<factor>: 這裏配置從節點的有效因子,如果設置為0,那麽從節點將會不斷嘗試替換主節點。如果值為正數,那麽不可達的超時時間將乘以這個有效因子來計算主節點什麽時候判定為失效並替換主節點。如果當前節點是從節點,那麽會反過來,也就是說超過該計算結果的話,當前節點將不會嘗試替換主節點。

5)cluster-migration-barrier<count>: 這裏配置最小的從節點數量,如果該主節點沒有任何從節點,那麽會從其它主節點那移一個過來作為當前主節點的從節點。

6)cluster-require-full-coverage<yes/no>: 配置集群的可用情況,例如:當一個key所在的節點掛掉,並且沒有從節點可用的情況下,那麽意味著該集群不完整,如果配置為yes集群將不可用。如果配置為no,那麽意味著即使集群有部分不完整,也需要處理可用的那些key。redis默認設置為yes,也就是集群需要完整可用。

詳細內容參考官網:https://redis.io/topics/cluster-tutorial

redis(8)集群簡介