天天看點

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

redis中文官網:

replication

sentinel

一、主從複制

通過redis的持久化功能,redis可以保證伺服器重新開機也不會損失(或少量損失)資料。但資料儲存在單台redis伺服器上,如果這台伺服器出現硬碟故障,則會導緻資料丢失。

為了避免單點故障,可以将資料庫複制多個副本儲存在不同的伺服器上,這樣即使一台伺服器故障,其它伺服器仍可以提供服務。

redis提供了複制(replication)功能,可以在一台伺服器資料更新後,自動将新的資料同步其它伺服器上。

主從複制将伺服器分為兩類,一類是master,另一類是slave。主資料庫可以讀寫,而從資料庫通常是隻讀的,

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

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

伺服器 端口 角色
127.0.0.1 6379 master
127.0.0.1 6380 slave
127.0.0.1 6381 slave
配置
【windows下請将redis.windows.conf檔案複制一份改名為redis.conf後操作。】
#分别修改各自配置檔案的端口
port 
port 
port 

#然後在兩台slave庫都加入以下配置
slave of  

#####這樣就已經配置好了######

啟動
#啟動三台資料庫
redis-server

#然後分别啟動三台資料庫的用戶端
redis-cli 
redis-cli -p 
redis-cli -p 
#檢視各庫的資訊。注意檢視主庫輸出中role為master,兩個從庫為slave。
info replication

驗證
#在主庫上插入
set myname "hello kitty"

#三個庫都擷取,如果都能擷取值"hello kitty",則說明配置成功
get myname

其它
#從庫預設為是隻讀的,若對從庫進行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
#說明
因為是在單台機器上示範,是以三個哨兵端口不能一樣。
如果是三台伺服器,則哨兵端口可以設為同一個,預設是

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

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

1.開始配置

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


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

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哨兵的界面輸出。其它哨兵的情況類似。

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

從輸出界面的變化可以發現,哨兵啟動後可以自動發現隸屬于其監視的master節點下的slave節點,同時哨兵間也可以互相發現。

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

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

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

4.示範故障遷移

實驗目的:幹掉master節點,觀察哨兵選舉将slave節點提升為master節點

windows下直接關閉master節點的指令行界面

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

然後等待一段時間(預設為,由sentinel.conf中的配置項決定),觀察其它的哨兵指令行界面視窗。

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

最終,我們發現哨兵通過選舉将6381這台slave節點提升為了master節點。

具體的選舉過程和更多内容可以參考官方文檔Redis 的 Sentinel 文檔

繼續閱讀