1. 程式人生 > >分散式快取Redis之主從複製與Sentinel哨兵

分散式快取Redis之主從複製與Sentinel哨兵

寫在前面

Redis主從複製

  • Master可以擁有多個slave
  • 多個slave可以連線同一個Master外,還可以連線到其他的slave
  • 主從複製不會阻塞Master,在主從複製時,Master可以處理client請求。
  • 提供系統的伸縮性。
  • 支援slave只讀模式
  • 非同步的

主從複製的過程

  這裡寫圖片描述

  1. Slave端在配置檔案中添加了slave of指令,於是Slave啟動時讀取配置檔案,初始狀態為REDIS_REPL_CONNECT。
  2. Slave端在定時任務serverCron(Redis內部的定時器觸發事件)中連線Master,傳送sync命令,然後阻塞等待master傳送回其記憶體快照檔案(最新版的Redis已經不需要讓Slave阻塞)
  3. Master端收到sync命令簡單判斷是否有正在進行的記憶體快照子程序,沒有則立即開始記憶體快照,有則等待其結束,當快照完成後會將該檔案傳送給Slave端。
  4. Slave端接收Master發來的記憶體快照檔案,儲存到本地,待接收完成後,清空記憶體表,重新讀取Master發來的記憶體快照檔案,重建整個記憶體表資料結構,並將最終狀態置位為 REDIS_REPL_CONNECTED狀態,Slave狀態機流轉完成。
  5. 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