Redis的使用模式主要分為單機和叢集,而叢集又分為三種模式,分别是主從模式、Sentinel模式、Cluster模式,本文記錄下三種搭建叢集的方式,友善以後回顧。
由于搞不到那麼多伺服器,本文搭建叢集使用一個主機,不同端口運作不同執行個體來模拟多個伺服器。
一、主從模式:
主從模式是最基本的叢集模式,主要構成由主資料庫(master)和從屬資料庫(slave)構成。

上圖中的叢集由一個master(6379端口)和兩個slave(6380和6381端口)構成,主從模式類似于資料庫的讀寫分離機制,主要有以下特點:
1.主資料庫可以進行讀和寫操作,而從資料庫一般隻允許讀操作,主資料庫寫入資料後會将資料同步到從資料庫,是以保證了無論從哪個資料庫讀取資料都是一緻的。
2.其中一個slave挂了(如上圖6380),不影響主資料庫的讀寫操作,如果有不止一個slave則不影響整個叢集系統的運作,如果slave全部挂掉則所有讀寫壓力均放到主資料庫上。
3.主資料庫挂了(如上圖6379),不影響從資料的讀操作,整個系統則不提供寫操作,但是讀資料操作不受影響。
主從模式搭建方法:
示範環境為Windows(比較好操作):
準備3個配置檔案,一個master的兩個slave的:
通用配置有IP、端口,這裡用的是localhost:127.0.0.1,master端口是6380,slave端口是6381和6382,其他配置用的預設:
兩個slave的配置中還需要開啟slaveof項,表示隸屬于哪個主伺服器:
然後就可以啟動伺服器了,關于redis控制台指令這裡不過多介紹,大家可自行百度。先啟動主伺服器:redis-server.exe redis.master.conf
然後啟動從伺服器:redis-server.exe redis.slave1.conf、redis-server.exe redis.slave2.conf
可以看到啟動從伺服器後會自動同步資料,現在可以啟動redis用戶端連接配接進行測試:redis-cli.exe -p 6380
關閉一個slave在master控制台可以看到提示,關閉master在slave控制台可以看到一直嘗試與主資料庫同步但是一直失敗,重新開機master後同步成功:
二、Sentinel模式:
哨兵模式建立在主從模式之上,彌補主從模式當master挂掉之後導緻寫操作不可用的問題,當master挂掉時會從slave中選舉産生一個作為新的master,哨兵模式叢集主要由主從模式加哨兵伺服器構成。
如上圖,哨兵伺服器監視着叢集中伺服器的狀态,當master挂掉之後,哨兵會根據算法(投票或選舉)在slave中選擇一個将其晉升為master伺服器。
由于算法的原因,推薦哨兵伺服器是3個以上的奇數,而且slave伺服器至少也要有兩個,我這裡示範就用的一個哨兵伺服器作測試:
哨兵模式搭建方法:
準備主從模式所需檔案并追加一個哨兵伺服器的配置檔案,再次強調本文僅用于示範隻是用了一個哨兵,真實環境建議使用3個以上的奇數哨兵:
哨兵伺服器的配置檔案比較簡單,通用的有哨伺服器的ip、端口,需要新加的一項是要監視的maser資訊,還有一些可選項包括當機時間判定、故障轉移逾時等,大家可自行百度:
然後按照主從模式的步驟啟動伺服器,然後使用指令:redis-server.exe redis.sentinel1.conf --sentinel啟動哨兵伺服器:
可以在哨兵伺服器的控制台看到監視的叢集的資訊。
手動關閉master,在預設的當機響應時間後,哨兵将6381晉升為了新的master。注意在故障轉移的時候會修改配置檔案,下一次啟動時6381就是master伺服器了,剩下兩個成為slave了。
三、Cluster模式:
哨兵模式很好地實作了高可用,在master挂掉的時候可以及時将slave晉升為主節點,保證了服務的可用性。但其也隻是在主從模式上新增了一個晉升機制,使其具備了高可用的特性,
master節點始終隻有一個,當資料操作頻繁時,寫入将會成為性能瓶頸。是以在Redis3.0後加入了全新的Cluster模式,它采用了去中心方式,将資料通過一緻性雜湊演算法進行存取。
一個cluster叢集由多個節點組成,每個節點都是互相連接配接的,會将資訊及時地進行交換保證新加入或是當機後服務的可用性,以及大資料情況下的穩定運作。ps:節點多了,自然負載就提高了。
同時為了保證高可用,,通常在使用cluster模式搭建叢集時還會為每個主節點添加slave,即如下圖所示:
當然也可以為每個master節點設定兩個或者更多的slave節點,是不是有點像在之前3個主從模式的基礎上再進行了一次組合。這樣cluster叢集就有了3個可以寫入操作的節點,所有節點均可讀取資料,
當主節點挂掉之後,其下的slave會自動根據算法進行晉升(類似哨兵模式),保證主節點的數量。并且cluster還友善維護人員添加删除節點,配置設定槽(slot)等操作。
Redis3.0推出cluster叢集模式,Redis5.0之前使用Ruby來建構cluster叢集,5.0之後直接使用redis-cli --cluster來建構cluster叢集。本文使用的是5.0之後的Linux版本示範(懶得安Ruby)。
Linux下的Redis安裝就不做過多贅述,大家可自行百度。安裝完redis後,這裡準備使用上圖所示的6節點模式,即3主3從。
1.首先準備6個檔案夾放6份配置檔案,這裡我剛開始想的是6380、6381、6382作為主節點,6383、6384、6385分别為對應的從節點,結果後面不小心寫錯了導緻從屬關系沒對應上,無傷大雅讓大家了解這個過程就行了,
ps:這才6個節點我就搞暈了,具體上線還是交給專業的運維吧!!!QAQ
2.然後是修改配置檔案:端口(port:6380)、開啟cluster模式(cluster-enabled yes)、節點配置檔案(cluster-config-file nodes-6380.conf)、Pid檔案(pidfile /var/run/redis-6380.pid),注意都要與各自的端口号對應。
3.使用redis-server指令啟動6個執行個體,注意使用各自的配置檔案,并使用ps aux|grep redis檢視服務是否開啟成功。
4.接下來就是一系列的cluster操作,cluster指令是cluster叢集所獨有的,大家可查閱相關資料學習,這裡推薦大神的文章--“Redis Cluster日常操作指令梳理”。
過程中可能遇到各種錯誤,本人再嘗試過程中也是遇到各種各樣的小問題,但是基本上百度都有,畢竟有人先試過水了。值得注意的一點就是使用redis-cli連接配接節點時要帶上-c參數,表示使用cluster模式。
完成之後就可以通過cluster info檢視叢集資訊,cluster nodes檢視所有節點及其資訊。
從截圖可以看到相應的ID、主從關系、配置設定的槽點等。随便設定了幾個資料測試了沒有問題:
值得注意的是,由于資料是嚴格按照配置設定的槽進行存儲的,是以會redirected到指定槽點的節點。ps:cluster模式雖好,配置運維也麻煩,還有各種資料同步機制,恢複機制,不得不佩服開發的大佬啊。
雖然寫的不是很全面,但是大體功能是實作了,本文僅作個人練習參考,歡迎大家指正錯誤。