Redis三種叢集方式:主從複製,哨兵模式,Cluster叢集。
當新建立一個從伺服器時,從伺服器將向主伺服器傳送SYNC命令,接收到SYNC命令後的主伺服器會進行一次BGSAVE命令,在執行期間,會將所有命令寫入緩衝區中,當BGSAVE命令執行完畢之後會將生成的RDB檔案傳送給從伺服器,從伺服器使用這個檔案載入資料到記憶體中,之後主伺服器會以Redis命令協定的格式將緩衝區的命令傳送給從伺服器。此後每次主服務執行命令都會同步給從伺服器。即使有多個從伺服器向主伺服器傳送SYNC命令,主伺服器也只會執行一個BGSAVE命令,就可以處理接下來的同步請求。一個主伺服器可以擁有多個從伺服器,而從伺服器也可擁有從伺服器,從而形成一個圖狀結構,複製功能不會阻塞主伺服器,即使有一個或多個同步請求,主伺服器依然能處理命令請求。
當設定了主從複製模式時需要開啟主伺服器的持久化功能,如果將主伺服器的持久化功能關閉,主伺服器一旦重啟,所有從伺服器的資料將會丟失,即使設定了Sentinel模式,如果主伺服器自動拉起程序比較快,以至於在Sentinel模式下還未選舉出新的主伺服器,主服務的啟動也會造成子伺服器的資料丟失。
設定一個主從複製模式,只需要使用Slaveof命令即可,在conf組態檔中新增或者是在redis中執行命令。
SLAVEOF host port
Redis的Sentinel系統用於管理多個Redis,主要執行以下三件事:
監控:Sentinel會不斷的檢查主從伺服器執行狀態
提醒:當某個Redis伺服器出現故障,可通過API或者其他應用程式傳送通知
自動故障遷移:當一個主伺服器不能正常工作時,Sentinel會進行一次故障自動遷移,會將失效主伺服器的從伺服器選舉出一個新的主伺服器,剩下的從伺服器將會自動連線複製選舉出來的新伺服器的資料。
Redis的Sentinel系統是一個分散式的系統,可以在系統中設定一個或多個Sentinel。
使用redis-sentinel啟動
redis-sentinel sentinel.confy
也可以使用redis-server來啟動
redis-server sentinel.conf --sentinelyy
以上兩種方式都可以啟動sentinel,啟動sentinel必須指定組態檔,否則無法啟動:
一個sentinel.conf檔案最少需要一句設定:
sentinel monitor mymaster 127.0.0.1 6379 2
監視一個別名叫做mymaster的主機,地址是127.0.0.1,埠是6379,將這個主伺服器判斷為失效至少需要2個sentinel同意。
無論設定多少個sentinel同意判斷一個主伺服器的失效,都需要系統中多個Sentinel支援才能進行故障遷移,而只有少數sentinel正常執行的時候,是無法進行故障遷移。
當一個Sentinel發現主伺服器下線時,稱為主觀下線,只有多個Sentinel都發現主服務下線,並相互之間通過命令進行交流判斷主伺服器下線時,稱為客觀下線。只有對主伺服器進行客觀下線時,會選舉出領頭Sentinel,選舉出之後,會進行新的主伺服器投票選舉,選舉出一個從伺服器升級為主伺服器。並向被選中的從伺服器傳送Slaveof no one命令,讓其變為主伺服器,通過釋出訂閱的功能,將新的設定廣播給其他Sentinel進行更新,並向下線的主伺服器傳送Slaveof命令,讓其複製新的主伺服器,當所有從伺服器都已經開始複製新的主伺服器時,領頭Sentinel終止本次故障遷移。
當一個 Redis 範例被重新設定是,無論是被設定成主伺服器、從伺服器、又或者被設定成其他主伺服器的從伺服器 ,Sentinel 都會向被重新設定的範例傳送一個
CONFIG REWRITE
命令, 從而確保這些設定會持久化在硬碟裡。
之前的主從複製,哨兵模式都難以再現擴容,而Redis cluster叢集實現了對Redis的水平擴容,即啟動N個Redis節點,每個節點又可以有自己的從伺服器,將資料均勻分佈的儲存在這N個結點上,每個節點儲存資料的1/N。Redis cluster叢集就是一個可以在多個Redis節點之間進行資料共用的設施;Redis cluster叢集採用的是無中心化設定,即節點A無法處理,會將請求轉發只節點B進行處理。
Redis叢集中的鍵空間被分割為16384個槽位。每個主節點負責16384中槽位的一部分,Redis使用CRC16 演演算法進行槽位分配。為了保證高可用,cluster模式也引入了主從複製模式,一個主節點對應一個或多個從節點,當主節點發生宕機時,可進行故障轉移,將子節點升級為主節點。
Redis 叢集由多個執行在叢集模式(cluster mode)下的 Redis 範例組成, 範例的叢集模式需要通過設定來開啟,以下是一個包含了最少選項的叢集組態檔範例:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
cluster-enabled:開啟叢集模式
cluster-config-file:節點組態檔名,無須人為修改, 它由 Redis 叢集在啟動時建立, 並在有需要時自動進行更新
cluster-node-timeout:節點失聯時間,當超過此毫秒,叢集將自動切換主從節點。
要讓叢集正常運作至少需要三個主節點,而每個主節點都應該正確設定一個或者多個從節點。
使用redis-cli --cluster create命令將節點合併成一個叢集
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
--cluster-replicas 1 這個指的是從機的數量,表示我們希望為叢集中的每個主節點建立一個從節點。
進入叢集模式只需要使用redis-cli -c命令
redis-cli -c -p 7000
無中心話節點,所以進入任意一個埠號的主節點即可。