redis資料庫—主從複製、哨兵模式、叢集
一、Redis的三種高可用方案
-
主從複製:主從複製是高可用Redis的基礎,哨兵和叢集都是在主從複製基礎上實現高可用的。主從複製主要實現了資料的多機備份(和同步),以及對於讀操作的負載均衡和簡單的故障恢復。
- 缺陷:故障恢復無法自動化;寫操作無法負載均衡;儲存能力受到單機的限制
-
哨兵模式:在主從複製的基礎上,哨兵實現了自動化的故障恢復。
- 缺陷:寫操作無法負載均衡;儲存能力受到單機的限制;哨兵無法對從節點進行自動化故障轉移,在讀寫分離場景下,從節點故障會導致讀服務不可用,需要對從節點做額外的監控、切換操作。
-
叢集模式(Cluster模式):通過叢集,Redis解決了寫操作無法負載均衡,以及儲存能力受到單機限制的問題,實現了較為完善的高可用方案。
二、Redis主從複製
2.1 Redis主從複製概述
- 主從複製:是指將一臺Redis伺服器的資料,複製到其他的Redis伺服器。前者稱為主節點(Master),後者稱為從節點(slave);資料的複製是單向的,只能由主節點到從節點。
- 預設情況下,每臺Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。
2.2 主從複製的作用
-
資料冗餘: 主從複製實現了資料的熱備份,是持久化之外的一種資料冗餘方式。
-
故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗餘。
-
負載均衡: 在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis資料時應用連線主節點,讀Redis資料時應用連線從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的併發量。
-
高可用基石: 除了上述作用以外,主從複製還是哨兵和叢集能夠實施的基礎,因此說主從複製是Redis高可用的基礎。
2.3 主從複製的工作流程
-
若啟動一個slave機器程序,則它會向Master機器傳送一個sync command命令,請求同步連線。
-
無論是第一次連線還是重新連線,Master機器都會啟動一個後臺程序,將資料快照儲存到資料檔案中(執行rdb操作),同時Master還會記錄修改資料的所有命令並快取在資料檔案中.
-
後臺程序完成快取操作之後,Master機器就會向slave機器傳送資料檔案,slave端機器將資料檔案儲存到硬碟上,然後將其載入到記憶體中,接著Master機器就會將修改資料的所有操作一併傳送給slave端機器。若slave出現故障導致宕機,則恢復正常後會自動重新連線。
-
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