1. 程式人生 > >redis之二 主從複製、sentinel叢集搭建

redis之二 主從複製、sentinel叢集搭建

redis中文官網:
replication
sentinel

一、主從複製

通過redis的持久化功能,redis可以保證伺服器重啟也不會損失(或少量損失)資料。但資料儲存在單臺redis伺服器上,如果這臺伺服器出現硬碟故障,則會導致資料丟失。
為了避免單點故障,可以將資料庫複製多個副本儲存在不同的伺服器上,這樣即使一臺伺服器故障,其它伺服器仍可以提供服務。
redis提供了複製(replication)功能,可以在一臺伺服器資料更新後,自動將新的資料同步其它伺服器上。
主從複製將伺服器分為兩類,一類是master,另一類是slave。主資料庫可以讀寫,而從資料庫通常是隻讀的,
這裡寫圖片描述

主從複製的配置很簡單,只需在從庫的配置中加入”slave of 主庫ip 主庫埠”即可,主庫無需進行任何配置。

伺服器 角色
127.0.0.1 6379 master
127.0.0.1 6380 slave
127.0.0.1 6381 slave
1.配置
【windows下請將redis.windows.conf檔案複製一份改名為redis.conf後操作。】
#分別修改各自配置檔案的埠
port 6379 port 6380 port 6381 #然後在兩臺slave庫都加入以下配置 slave of 127.0.0.1 6379 #####這樣就已經配置好了###### 2.啟動 #啟動三臺資料庫 redis-server #然後分別啟動三臺資料庫的客戶端 redis-cli redis-cli -p 6380 redis-cli -p 6381 #檢視各庫的資訊。注意檢視主庫輸出中role為master,兩個從庫為slave。 info replication 3.驗證 #在主庫上插入 set myname "hello kitty" #三個庫都獲取,如果都能獲取值"hello kitty",則說明配置成功
get myname 4.其它 #從庫預設為是隻讀的,若對從庫進行set,會發現報錯:(error) READONLY You can't write against a read only slave. #對應配置項為slave-read-only。修改該配置沒意義,因為主庫更新時進行資料同步會覆蓋該值。 set myname "hello world"

二、sentinel叢集

參考官網Redis 的 Sentinel 文件
主從複製模式中,當主庫down掉後,可以手動將從庫提升為主庫來繼續提供服務。但是手動的方式畢竟比較麻煩,需要人工介入,難以實現自動化。為此,redis在2.8版本中提供了哨兵工具來實現自動化的監控和故障恢復功能,哨兵是一個獨立的程序。在生產環境下,為了高可用,哨兵通常也不會只有單節點,而是有多個。

需要再次強調的是,哨兵只是一個單獨的程序。所以只需要在redis節點單獨再啟動一個哨兵程序即可。(有些部落格演示時是把哨兵單獨搞成個redis節點的形式,容易誤導人)

伺服器 角色 是否部署哨兵 哨兵埠
127.0.0.1 6379 master 部署哨兵 26379
127.0.0.1 6380 slave 部署哨兵 26380
127.0.0.1 6381 slave 部署哨兵 26381
#說明
因為是在單臺機器上演示,所以三個哨兵埠不能一樣。
如果是三臺伺服器,則哨兵埠可以設為同一個,預設是26379

配置哨兵時,只需配置其監視主庫即可,哨兵會自動發現主庫對應的從庫。

這裡在前面主從複製的基礎上,為每個redis節點都部署一個哨兵。
配置前首先確保按照前面主從複製的步驟配置好了主從複製模式。

1.開始配置

【linux下redis自帶了sentinel.conf檔案,直接配置下列項即可。
windows下請先建立一個sentinel.conf檔案,然後在裡面配置下列項】


#哨兵埠
port 26379
#監視一個主伺服器(redis主節點), 這個主伺服器的名稱為mymaster,IP地址為127.0.0.1,埠為6379。 
#而將這個主伺服器判斷為失效至少需要2個Sentinel同意。只要同意Sentinel的數量不達標,自動故障遷移就不會執行。
sentinel monitor mymaster 127.0.0.1 6379 2
#
sentinel down-after-milliseconds mymaster 60000
#
sentinel failover-timeout mymaster 180000
#
sentinel parallel-syncs mymaster 1

2.啟動redis叢集

#啟動三臺redis
redis-server

3.依次啟動三個哨兵
使用以下命令依次啟動26379,26380,26381三個哨兵,注意觀察輸出

#下面依次啟動三個哨兵程序(windows下沒有redis-sentinel命令,不能用後者啟動) 
  redis-server sentinel.conf --sentinel (Linux或Windows)
或redis-sentinel sentinel.conf          (僅Linux)

我這裡僅觀察26379哨兵的介面輸出。其它哨兵的情況類似。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
從輸出介面的變化可以發現,哨兵啟動後可以自動發現隸屬於其監視的master節點下的slave節點,同時哨兵間也可以相互發現。

我們還可以使用info命令檢視一下哨兵的資訊

#連線26379哨兵
redis-cli -p 26379
#檢視sentinel資訊
info sentinel

到這裡,哨兵叢集的配置就算成功了。

4.演示故障遷移
實驗目的:幹掉master節點,觀察哨兵選舉將slave節點提升為master節點

windows下直接關閉master節點的命令列介面

Linux下使用kill殺程序
#檢視master節點的pid
ps -ef|grep redis
#kill掉程序 
kill -9 [上面的pid]

然後等待一段時間(預設為,由sentinel.conf中的配置項決定),觀察其它的哨兵命令列介面視窗。
這裡寫圖片描述
最終,我們發現哨兵通過選舉將6381這臺slave節點提升為了master節點。
具體的選舉過程和更多內容可以參考官方文件Redis 的 Sentinel 文件