這篇文章帶給大家的內容是關於Redis主從複製的原理介紹(圖文),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
面臨問題
機器故障。我們部署到一台 Redis 伺服器,當發生機器故障時,需要遷移到另外一台伺服器並且要確保資料是同步的。而數據才是最重要的,如果你不在乎,基本上也就不會使用 Redis 了。
容量瓶頸。當我們有需求需要擴容 Redis 記憶體時,從 16G 的記憶體升到 64G,單機肯定是滿足不了。當然,你可以重新買一台 128G 的新機器。
要實現分散式資料庫的更大的儲存容量和承受高並發存取量,我們會將原先集中式資料庫的資料分別儲存到其他多個網路節點上。
Redis 為了解決這個單一節點的問題,也會把資料複製多個副本部署到其他節點上進行複製,實現Redis的高可用,實現對資料的冗餘備份,從而確保資料和服務的高可用。
#主從複製,是指將一台Redis伺服器的數據,複製到其他的Redis伺服器。前者稱為主節點(master),後者稱為從節點(slave),資料的複製是單向的,只能由主節點到從節點。
預設情況下,每台Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。
資料冗餘:主從複製實現了資料的熱備份,是持久化之外的一種資料冗餘方式。
故障復原:當主節點出現問題時,可以由從節點提供服務,實現快速的故障復原;實際上是一種服務的冗餘。
負載平衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫入服務,由從節點提供讀取服務(即寫Redis資料時應用連接主節點,讀Redis資料時應用連線從節點),分擔伺服器負載;尤其是在寫入少讀多的場景下,透過多個從節點分擔讀取負載,可以大幅提高Redis伺服器的並發量。
讀寫分離:可用於實現讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高伺服器的負載能力,同時可根據需求的變化,改變從庫的數量;
高可用基石:除了上述作用以外,主從複製還是哨兵和集群能夠實施的基礎,因此說主從複製是Redis高可用的基礎。
從節點開啟主從複製,有3種方式:
設定檔: 在從伺服器的設定檔加入:slaveof
啟動指令: redis-server啟動指令後加入--slaveof
客戶端指令: Redis伺服器啟動後,直接透過客戶端執行指令:slaveof
透過 info replication 指令可以看到複製的一些訊息
主從複製過程大體可以分成3個階段:連線建立階段(即準備階段)、資料同步階段、指令傳播階段。
從節點執行slaveof 指令後,複製過程便開始運作,下面圖示大概可以看到,
從圖中可以看出複製過程大致分為6個過程
主從配置之後的日誌記錄也可以看出這個流程
#1)保存主節點(master)資訊。
執行slaveof 後Redis 會列印如下日誌:
2)從節點(slave)內部透過每秒執行的定時任務維護複製相關邏輯,當定時任務發現有新的主節點後,會嘗試與該節點建立網路連線
從節點與主節點建立網路連線
從節點會建立一個socket 套接字,從節點建立了一個連接埠為51234的套接字,專門用於接受主節點發送的複製命令。從節點連線成功後列印如下日誌:
如果從節點無法建立連接,定時任務會無限重試直到連接成功或執行slaveof no one 取消複製
關於連接失敗,可以在從節點執行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)指令持續複製。當主節點把目前的資料同步給從節點後,便完成了複製的建立流程。接下來主節點會持續地把寫指令傳送給從節點,確保主從資料一致性。
#以上是Redis主從複製的原理介紹(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!