歡迎光臨
每天分享高質量文章

Redis 主從複製以及主從複製原理

作者:LoyaltyLu

連結:https://segmentfault.com/a/1190000018268350

 

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。

概述

在現有企業中80%公司大部分使用的是redis單機服務,在實際的場景當中單一節點的redis容易面臨風險。

 

面臨問題

 

1、機器故障。我們部署到一臺 Redis 伺服器,當發生機器故障時,需要遷移到另外一臺伺服器並且要保證資料是同步的。而資料是最重要的,如果你不在乎,基本上也就不會使用 Redis 了。

2、容量瓶頸。當我們有需求需要擴容 Redis 記憶體時,從 16G 的記憶體升到 64G,單機肯定是滿足不了。當然,你可以重新買個 128G 的新機器。

 

解決辦法

 

要實現分散式資料庫的更大的儲存容量和承受高併發訪問量,我們會將原來集中式資料庫的資料分別儲存到其他多個網路節點上。

 

Redis 為瞭解決這個單一節點的問題,也會把資料複製多個副本部署到其他節點上進行複製,實現 Redis的高可用,實現對資料的冗餘備份,從而保證資料和服務的高可用。

主從複製

什麼是主從複製

 

 

主從複製,是指將一臺Redis伺服器的資料,複製到其他的Redis伺服器。前者稱為主節點(master),後者稱為從節點(slave),資料的複製是單向的,只能由主節點到從節點。

 

預設情況下,每臺Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。

 

主從複製的作用

 

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

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

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

4、讀寫分離:可以用於實現讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高伺服器的負載能力,同時可根據需求的變化,改變從庫的數量。

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

主從複製啟用

從節點開啟主從複製,有3種方式:

 

1、配置檔案:在從伺服器的配置檔案中加入 slaveof。

2、啟動命令:redis-server啟動命令後加入 –slaveof。

3、客戶端命令:Redis伺服器啟動後,直接透過客戶端執行命令 slaveof,則該Redis實體成為從節點。

 

透過 info replication 命令可以看到複製的一些資訊。

主從複製原理

主從複製過程大體可以分為3個階段:連線建立階段(即準備階段)、資料同步階段、命令傳播階段。

 

在從節點執行 slaveof 命令後,複製過程便開始運作,下麵圖示可以看出複製過程大致分為6個過程。

 

 

主從配置之後的日誌記錄也可以看出這個流程。

 

1、儲存主節點(master)資訊

 

執行 slaveof 後 Redis 會列印如下日誌:

 

 

2、從節點與主節點建立網路連線

 

從節點(slave)內部透過每秒執行的定時任務維護複製相關邏輯,當定時任務發現存在新的主節點後,會嘗試與該節點建立網路連線。

 

 

從節點與主節點建立網路連線。

 

從節點會建立一個 socket 套接字,從節點建立了一個埠為51234的套接字,專門用於接受主節點傳送的複製命令。從節點連線成功後列印如下日誌:

 

 

如果從節點無法建立連線,定時任務會無限重試直到連線成功或者執行 slaveofnoone 取消複製。

 

關於連線失敗,可以在從節點執行 info replication 檢視 master_link_down_since_seconds 指標,它會記錄與主節點連線失敗的系統時間。從節點連線主節點失敗時也會每秒列印如下日誌,方便發現問題:

 

Error condition on socket for SYNC: {socket_error_reason}

 

3、傳送 ping 命令

 

連線建立成功後從節點傳送 ping 請求進行首次通訊, ping 請求主要目的如下:

 

  • 檢測主從之間網路套接字是否可用。

  • 檢測主節點當前是否可接受處理命令。

 

如果傳送 ping 命令後,從節點沒有收到主節點的 pong 回覆或者超時,比如網路超時或者主節點正在阻塞無法響應命令,從節點會斷開複製連線,下次定時任務會發起重連。

 

 

從節點傳送的 ping 命令成功傳回,Redis 列印如下日誌,並繼續後續複製流程:

 

 

4、許可權驗證

 

如果主節點設定了 requirepass 引數,則需要密碼驗證,從節點必須配置 masterauth 引數保證與主節點相同的密碼才能透過驗證。如果驗證失敗複製將終止,從節點重新發起複制流程。

 

5、同步資料集

 

主從複製連線正常通訊後,對於首次建立複製的場景,主節點會把持有的資料全部傳送給從節點,這部分操作是耗時最長的步驟。

 

6、命令持續複製

 

當主節點把當前的資料同步給從節點後,便完成了複製的建立流程。接下來主節點會持續地把寫命令傳送給從節點,保證主從資料一致性。

贊(0)

分享創造快樂