1. 程式人生 > 其它 >redis資料庫—主從複製、哨兵模式、叢集

redis資料庫—主從複製、哨兵模式、叢集

一、Redis的三種高可用方案

  • 主從複製:主從複製是高可用Redis的基礎,哨兵和叢集都是在主從複製基礎上實現高可用的。主從複製主要實現了資料的多機備份(和同步),以及對於讀操作的負載均衡和簡單的故障恢復。

    • 缺陷:故障恢復無法自動化;寫操作無法負載均衡;儲存能力受到單機的限制
  • 哨兵模式:在主從複製的基礎上,哨兵實現了自動化的故障恢復。

    • 缺陷:寫操作無法負載均衡;儲存能力受到單機的限制;哨兵無法對從節點進行自動化故障轉移,在讀寫分離場景下,從節點故障會導致讀服務不可用,需要對從節點做額外的監控、切換操作。
  • 叢集模式(Cluster模式):通過叢集,Redis解決了寫操作無法負載均衡,以及儲存能力受到單機限制的問題,實現了較為完善的高可用方案。

二、Redis主從複製

2.1 Redis主從複製概述

  • 主從複製:是指將一臺Redis伺服器的資料,複製到其他的Redis伺服器。前者稱為主節點(Master),後者稱為從節點(slave);資料的複製是單向的,只能由主節點到從節點。
  • 預設情況下,每臺Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。

2.2 主從複製的作用

  • 資料冗餘: 主從複製實現了資料的熱備份,是持久化之外的一種資料冗餘方式。

  • 故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗餘。

  • 負載均衡: 在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis資料時應用連線主節點,讀Redis資料時應用連線從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的併發量。

  • 高可用基石: 除了上述作用以外,主從複製還是哨兵和叢集能夠實施的基礎,因此說主從複製是Redis高可用的基礎。

2.3 主從複製的工作流程

  1. 若啟動一個slave機器程序,則它會向Master機器傳送一個sync command命令,請求同步連線。

  2. 無論是第一次連線還是重新連線,Master機器都會啟動一個後臺程序,將資料快照儲存到資料檔案中(執行rdb操作),同時Master還會記錄修改資料的所有命令並快取在資料檔案中.

  3. 後臺程序完成快取操作之後,Master機器就會向slave機器傳送資料檔案,slave端機器將資料檔案儲存到硬碟上,然後將其載入到記憶體中,接著Master機器就會將修改資料的所有操作一併傳送給slave端機器。若slave出現故障導致宕機,則恢復正常後會自動重新連線。

  4. Master機器收到slave端機器的連線後,將其完整的資料檔案傳送給slave端機器,如果Mater同時收到多個slave發來的同步請求,則Master會在後臺啟動一個程序以儲存資料檔案,然後將其傳送給所有的slave端機器,確保所有的slave端機器都正常。

三、搭建Redis主從複製

實驗環境:

主從 虛機 IP地址
master centos7-1 192.168.108.30
slave1 centos7-2 192.168.108.40
slave2 centos7-3 192.168.108.50
 

3.2 修改master節點的配置檔案

3.3 修改slave節點的配置檔案

修改slave1的配置檔案,之後scp傳給slave2。

3.4 驗證主從效果

1)主節點檢視日誌,並插入一條資料。

 2)從節點檢視資料是否同步成功。

四、Redis哨兵模式

主從切換技術的方法是:當伺服器宕機後,需要手動一臺從機切換為主機,這需要人工干預,不僅費時費力而且還會造成一段時間內服務不可用。為了解決主從複製的缺點,就有了哨兵機制。

哨兵的核心功能:在主從複製的基礎上,哨兵引入了主節點的自動故障轉移。

2.1 哨兵模式的作用

  • 監控: 哨兵會不斷地檢查主節點和從節點是否運作正常。
  • 自動故障轉移: 當主節點不能正常工作時,哨兵會開始自動故障轉移操,它會將失效主節點的其中一個從節點升級為新的主節點,並讓其它從節點改為複製新的主節點。
  • 通知(提醒): 哨兵可以將故障轉移的結果傳送給客戶端。

2.2 哨兵結構

哨兵節點: 哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不儲存資料

資料節點: 主節點和從節點都是資料節點。

2.3 故障轉移機制

1、由哨兵節點定期監控發現主節點是否出現了故障

每個哨兵節點每隔1秒會問主節點、從節點及其它哨兵節點發送一次ping命令做一次心檢測。如果主節點在一定時間範圍內不回覆或者是回覆一個錯誤訊息,那麼這個哨兵就會認為這個主節點主觀下線了(單方面的)。當超過半數哨兵節點認為該主節點主觀下線了,這樣就客觀下線了。

2、當主節點出現故障,此時哨兵節點會通過Raft演算法(選舉演算法)實現選舉機制共同選舉出一個哨兵節點為leader,來負責處理主節點的故障轉移和通知。所以整個執行哨兵的叢集的數量不得少於3個節點。

3、由leader哨兵節點執行故障轉移,過程如下:

  • 將某一個從節點升級為新的主節點,讓其它從節點指向新的主節點;
  • 若原主節點恢復也變成從節點,並指向新的主節點;
  • 通知客戶端主節點已經更換。

需要特別注意的是,客觀下線是主節點才有的概念;如果從節點和哨兵節點發生故障,被哨兵主觀下線後,不會再有後續的客觀下線和故障轉移操作

2.4 主節點的選舉

1.過濾掉不健康的(己下線的),沒有回覆哨兵ping響應的從節點。

2.選擇配置檔案中從節點優先順序配置最高的。(replica-priority,預設值為100)

3.選擇複製偏移量最大,也就是複製最完整的從節點。

哨兵的啟動依賴於主從模式,所以須把主從模式安裝好的情況下再去做哨兵模式。

五、搭建Redis哨兵模式

實驗步驟:

5.1 修改Redis哨兵模式的配置檔案(所有節點操作)

 

 5.2 啟動哨兵模式

5.3 檢視哨兵資訊

5.4 故障模擬

 獲取redis的pid,並殺死 Master 節點上redis-server的程序號

 驗證結果,檢視master是轉換至從服務

 在Slave1上檢視是否轉換成功

六 、Cluster群集

叢集,即Redis Cluster,是Redis3.0開始引入的分散式儲存方案。

叢集由多個節點(Node)組成,Redis的資料分佈在這些節點中。叢集中的節點分為主節點和從節點:只有主節點負責讀寫請求和叢集資訊的維護;從節點只進行主節點資料和狀態資訊的複製。

6.1 叢集的作用

(1)資料分割槽: 資料分割槽(或稱資料分片)是叢集最核心的功能。

  • 叢集將資料分散到多個節點,一方面突破了Redis單機記憶體大小的限制,儲存容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了叢集的響應能力。
  • Redis單機記憶體大小受限問題,在介紹持久化和主從複製時都有提及;例如,如果單機記憶體太大,bgsave和bgrewriteaof的fork操作可能導致主程序阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量複製階段主節點的複製緩衝區可能溢位。

(2)高可用: 叢集支援主從複製和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,叢集仍然可以對外提供服務。

通過叢集,Redis解決了寫操作無法負載均衡,以及儲存能力受到單機限制的問題,實現了較為完善的高可用方案。

6.2 Redis叢集的資料分片

Redis叢集引入了雜湊槽的概念。

Redis叢集有16384個雜湊槽(編號0-16383)。

叢集的每個節點負責一部分雜湊槽。

每個Key通過CRC16校驗後對16384取餘來決定放置哪個雜湊槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作。

以3個節點組成的叢集為例:

  • 節點A包含0到5460號雜湊槽
  • 節點B包含5461到10922號雜湊槽
  • 節點c包含10923到16383號雜湊槽

6.3 叢集模式的主從複製模型

  • 叢集中具有A、B、C三個節點,如果節點B失敗了,整個叢集就會因缺少5461-10922這個範圍的槽而不可以用。
  • 為每個節點新增一個從節點A1、B1、C1整個叢集便有三個Master節點和三個slave節點組成,在節點B失敗後,叢集選舉B1位為主節點繼續服務。當B和B1都失敗後,叢集將不可用。

七、搭建 Redis 叢集

7.1 建立目錄複製配置檔案到對應的節點上

7.2 修改主配置檔案,設定開啟群集功能

 

 可以寫一個for迴圈將6001的檔案複製給6002~6006,這樣就不需要全部一個一個檔案進行修改;複製之後修改埠號即可(92行和840行)

 

7.3 啟動redis節點

7.4 啟動叢集

7.5 測試群集

 

在其他節點檢視

 

總結 

三種模式需要注意修改不同的配置檔案。

主從複製:vim /etc/redis/6379.conf

哨兵模式:vim /opt/redis-5.0.7/sentinel.conf

cluster叢集:vim /opt/redis-5.0.7/redis.conf