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 |
配置
【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哨兵的界面輸出。其它哨兵的情況類似。
從輸出界面的變化可以發現,哨兵啟動後可以自動發現隸屬于其監視的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中的配置項決定),觀察其它的哨兵指令行界面視窗。
最終,我們發現哨兵通過選舉将6381這台slave節點提升為了master節點。
具體的選舉過程和更多内容可以參考官方文檔Redis 的 Sentinel 文檔