分散式快取Redis之主從複製與Sentinel哨兵
寫在前面
Redis主從複製
- Master可以擁有多個slave
- 多個slave可以連線同一個Master外,還可以連線到其他的slave
- 主從複製不會阻塞Master,在主從複製時,Master可以處理client請求。
- 提供系統的伸縮性。
- 支援slave只讀模式
- 非同步的
主從複製的過程
- Slave端在配置檔案中添加了slave of指令,於是Slave啟動時讀取配置檔案,初始狀態為REDIS_REPL_CONNECT。
- Slave端在定時任務serverCron(Redis內部的定時器觸發事件)中連線Master,傳送sync命令,然後阻塞等待master傳送回其記憶體快照檔案(最新版的Redis已經不需要讓Slave阻塞)
- Master端收到sync命令簡單判斷是否有正在進行的記憶體快照子程序,沒有則立即開始記憶體快照,有則等待其結束,當快照完成後會將該檔案傳送給Slave端。
- Slave端接收Master發來的記憶體快照檔案,儲存到本地,待接收完成後,清空記憶體表,重新讀取Master發來的記憶體快照檔案,重建整個記憶體表資料結構,並將最終狀態置位為 REDIS_REPL_CONNECTED狀態,Slave狀態機流轉完成。
- Master端在傳送快照檔案過程中,接收的任何會改變資料集的命令都會暫時先儲存在Slave網路連線的傳送快取佇列裡(list資料結構),待快照完成後,依次發給Slave,之後收到的命令相同處理,並將狀態置位為 REDIS_REPL_ONLINE。
主從複製的配置
我們建立三臺linux伺服器,一臺作為主伺服器Master,ip為192.168.1.10,另外兩臺作為slave,ip分別為192.168.1.11和192.168.1.12。
三臺伺服器分別安裝redis,當然這裡我們要確保三臺伺服器之間是能進行互相通訊的,即互相可以ping通。然後Master伺服器不需要做什麼配置,將11和12兩臺伺服器的redis.conf配置檔案進行修改之後,redis就會自動的為我們實現主從複製。
那麼如何修改兩臺slave的redis.conf這個配置檔案呢?
如果主伺服器沒有設定密碼,那麼我們只要找到slaveof ,這裡我們的主伺服器ip是192.168.1.10,redis埠是6379,那麼我們只需要在redis.conf配置檔案中加入slaveof 192.168.1.10 6379,然後儲存即可。
如果主伺服器設定了密碼,我們還需要修改masterauth (主伺服器的密碼)這個配置項。
然後同時啟動三臺伺服器,進入到redis-cli客戶端用info命令進行檢視狀態(此處我的Master的ip是192.168.1.231,slave的ip分別為229和230)
我們看到上面的role顯示此臺機器是master,有兩個slave,還可以看到對應的ip和埠。
此時我們在slave只能進行讀操作,只能通過master進行寫操作。並且我們每次的寫操作會發現在每一臺伺服器上面都是同步的。
簡單的說Redis主從複製,假設我們有三臺Redis伺服器,一臺主伺服器Master,兩臺從伺服器slave,slave中只能做讀操作。Master可做讀寫操作,每次對Master進行寫操作之後,首先Master會將資料儲存在硬碟中,然後通過sync同步命令將每一個slave的資料進行更新,然後每一個slave都將更新的資料寫在自己的硬碟中,這樣就保證了資料的一致性。
Sentinel 哨兵模式
如果我們在使用主從複製的情況下,Master伺服器進行了down機的情況,我們的系統就不能再進行寫的操作,所以此時redis在2.6版本引入了哨兵模式,但是並不穩定,2.8版本之後哨兵模式才穩定了起來。一個健壯的部署至少需要三個哨兵例項。
顧名思義Redis的哨兵模式就是對redis系統進行實時的監控,其主要功能有:
- 監測主資料庫和從資料庫是否正常執行。
- 當我們的主資料庫出現故障的時候,可以自動將從資料庫轉換為主資料庫,實現自動的切換。
- 當被監控的某個Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應用程式傳送通知。
例如:
在Server1掉線後:
升級Server2為新的主伺服器:
實現步驟
這裡我們還是使用上面的redis伺服器的ip,Master的ip為192.168.1.229,slave1為:192.168.1.230,slave2為:192.168.1.231
在其中一臺伺服器配置sentinel.conf (比如192.168.1.230)
- 進入解壓的redis資料夾中使用cp命令將sentinel.conf檔案copy到你的redis中的etc資料夾。
- 修改sentinel.conf這個配置檔案
開啟這個檔案,我們注意到哨兵使用的埠號是26379
dir “/usr/local/redis/etc” 這個dir相當於哨兵的一些日誌,我們修改他的路徑,讓他存放在我們想要儲存的目錄中。
sentinel monitor mymaster 192.168.1.229 6379 1 對應的分別是 名稱,ip,埠,投票選舉的次數(那麼我們哨兵監聽的肯定是master的ip,然後埠是6379,1說明當master主伺服器down機之後,剩下的伺服器要進行一個投票選舉出一個主伺服器)
sentinel down-after-milliseconds mymaster 5000 這個配置代表哨兵5s進行一次檢查這個叢集。
sentinel parallel-syncs mymaster 2 這個配置代表你的幾個從節點將支援轉換為主伺服器的這個事情。
需要修改的幾乎就這幾個配置。
然後,我們分別啟動三臺redis伺服器:
輸入bin/redis-server etc/sentinel.conf –sentinel & 這個命令啟動哨兵
/usr/local/redis/bin/redis-cli -h 192.168.1.230 -p 26379 info sentinel 這個命令是檢視哨兵的狀態
我們看到我的主伺服器現在是229現在有兩個slave
這樣我們的哨兵模式就已經開啟了,此時我們可以試圖關閉229的redis,然後看哨兵會不會去從兩個從伺服器中選舉一臺充當主伺服器。
Sentinel配置檔案詳解:
更多關於哨兵的命令操作參考部落格:
—–樂於分享,共同進步
—–Any comments greatly appreciated
—–誠心歡迎各位交流討論!QQ:1138517609