天天看點

驚呆了,竟然可以用這種方式秒建Redis叢集?

前面我們講了《Redis 性能優化的 13 條軍規!》,其中最重要的一條就是使用 Redis 的叢集功能,那麼本文我們就來看看,如何用 1s 鐘的時間來建立一個 Redis 叢集。

Redis Cluster 是 Redis 3.0 版本推出的 Redis 叢集方案,它将資料分布在不同的服務區上,以此來降低系統對單主節點的依賴,并且可以大大的提高 Redis 服務的讀寫性能。

Redis 将所有的資料分為 16384 個 slots(槽),每個節點負責其中的一部分槽位,當有 Redis 用戶端連接配接叢集時,會得到一份叢集的槽位配置資訊,這樣它就可以直接把請求指令發送給對應的節點進行處理。

Redis Cluster 是無代理模式去中心化的運作模式,用戶端發送的絕大數指令會直接交給相關節點執行,這樣大部分情況請求指令無需轉發,或僅轉發一次的情況下就能完成請求與響應,是以叢集單個節點的性能與單機 Redis 伺服器的性能是非常接近的,是以在理論情況下,當水準擴充一倍的主節點就相當于請求處理的性能也提高了一倍,是以 Redis Cluster 的性能是非常高的。

Redis Cluster 架構圖如下所示:

Redis Cluster 的搭建方式有兩種,一種是使用 Redis 源碼中提供的 create-cluster 工具快速的搭建 Redis 叢集環境,另一種是配置檔案的方式手動建立 Redis 叢集環境。

create-cluster 工具在 utils/create-cluster 目錄下,如下圖所示:

使用指令 <code>./create-cluster start</code>

接下來我們需要把以上建立的 6 個節點節點通過 <code>create</code> 指令組成一個叢集,執行如下:

在執行的過程中會詢問你是否通過把 30001、30002、30003 作為為主節點,把 30004、30005、30006 作為它們的從節點,輸入 <code>yes</code> 後會執行完成。

我們可以先使用 redis-cli 連接配接到叢集,指令如下:

在使用 nodes 指令來檢視叢集的節點資訊,指令如下:

可以看出 30001、30002、30003 都為主節點,30001 對應的槽位是 0-5460,30002 對應的槽位是 5461-10922,30003 對應的槽位是 10923-16383,總共有槽位 16384 個 (0 ~ 16383)。

create-cluster 搭建的方式雖然速度很快,但是該方式搭建的叢集主從節點數量固定以及槽位配置設定模式固定,并且安裝在同一台伺服器上,是以隻能用于測試環境。

我們測試完成之後,可以使用以下指令,關閉并清理叢集:

由于 create-cluster 本身的限制,在實際生産環境中我們需要使用手動添加配置的方式搭建 Redis 叢集,為此我們先要把 Redis 安裝包複制到 node1 到 node6 檔案中,因為我們要安裝 6 個節點,3 主 3 從,如下圖所示:

接下來我們進行配置并啟動 Redis 叢集。

我們需要修改每個節點内的 redis.conf 檔案,設定 <code>cluster-enabled yes</code> 表示開啟叢集模式,并且修改各自的端口,我們繼續使用 30001 到 30006,通過 <code>port 3000X</code> 設定。

redis.conf 配置好之後,我們就可以啟動所有的節點了,指令如下:

之前我們已經啟動了 6 個節點,但這些節點都在各自的叢集之内并未互聯互通,是以接下來我們需要把這些節點串連成一個叢集,并為它們指定對應的槽位,執行指令如下:

其中 create 後面跟多個節點,表示把這些節點作為整個叢集的節點,而 cluster-replicas 表示給叢集中的主節點指定從節點的數量,1 表示為每個主節點設定一個從節點。

在執行了 create 指令之後,系統會為我們指定節點的角色和槽位配置設定計劃,如下所示:

從以上資訊可以看出,Redis 打算把 30001、30002、30003 設定主節點,并為他們配置設定的槽位,30001 對應的槽位是 0-5460,30002 對應的槽位是 5461-10922,30003 對應的槽位是 10923-16383,并且把 30005 設定為 30001 的從節點、30006 設定為 30002 的從節點、30004 設定為 30003 的從節點,我們隻需要輸入 <code>yes</code> 即可确認并執行配置設定,如下所示:

顯示 OK 表示整個叢集就已經成功啟動了。

接下來,我們使用 redis-cli 連接配接并測試一下叢集的運作狀态,代碼如下:

相關字段的說明已經辨別在上述的代碼中了,這裡就不再贅述。

某些情況下,我們需要根據實際的業務情況,對已經在運作的叢集進行動态的添加或删除節點,那我們就需要進行以下操作。

使用 <code>cluster meet ip:port</code> 指令就可以把一個節點加入到叢集中,執行指令如下:

可以看出端口為 30007 的節點并加入到叢集中,并設定成了主節點。

使用 <code>redis-cli --cluster add-node 添加節點ip:port 叢集某節點ip:port</code> 也可以把一個節點添加到叢集中,執行指令如下:

從以上結果可以看出 30008 節點也被設定成了主節點。

使用 <code>cluster replicate nodeId</code> 指令就可以把目前節點設定為目标節點的從節點,執行指令如下:

可以看出 30008 已經變為 30007 的從節點了。

使用 <code>cluster forget nodeId</code> 指令就可以把一個節點從叢集中移除。 此指令和 meet 指令不同的時,删除節點需要是使用節點的 Id 進行删除,可以通過 <code>cluster nodes</code> 指令檢視所有節點的 Id 資訊,其中每一行的最前面的 40 位字母和數組的組合就是該節點的 Id,如下圖所示:

執行指令如下:

此時我們使用 <code>cluster nodes</code> 指令檢視叢集的所有節點資訊:

可以看出之前的端口為 30007 的節點已經被我們成功的移除了。

本文講了 Redis 叢集的兩種搭建方式:create-cluster start 和 cluster create,前一種方式雖然速度比較快,但它隻能建立數量固定的主從節點,并且所有節點都在同一台伺服器上,是以隻能用于測試環境。我們還講了 Redis 叢集動态添加主、從節點和删除任意節點的功能。

希望本文對你有幫助,動手實踐起來吧~

關注下面二維碼,訂閱更多精彩内容。

驚呆了,竟然可以用這種方式秒建Redis叢集?
驚呆了,竟然可以用這種方式秒建Redis叢集?
驚呆了,竟然可以用這種方式秒建Redis叢集?

關注公衆号(加好友):

驚呆了,竟然可以用這種方式秒建Redis叢集?

作者:

王磊的部落格

出處:

http://vipstone.cnblogs.com/