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

圖片描述

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

概述

在現有企業中80%公司大部分使用的是redis單機服務,在實際的場景當中單一節點的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 <masterip> <masterport>
  2. 啓動命令: redis-server啓動命令後加入 --slaveof <masterip> <masterport>
  3. 客戶端命令: Redis服務器啓動後,直接經過客戶端執行命令:slaveof <masterip>
    <masterport>,則該Redis實例成爲從節點。
經過  info replication 命令能夠看到複製的一些信息

主從複製原理

主從複製過程大致能夠分爲3個階段:鏈接創建階段(即準備階段)、數據同步階段、命令傳播階段。負載均衡

在從節點執行 slaveof 命令後,複製過程便開始運做,下面圖示大概能夠看到,
從圖中能夠看出複製過程大體分爲6個過程
圖片描述socket

主從配置以後的日誌記錄也能夠看出這個流程

1)保存主節點(master)信息。
執行 slaveof 後 Redis 會打印以下日誌:分佈式

圖片描述

2)從節點(slave)內部經過每秒運行的定時任務維護複製相關邏輯,當定時任務發現存在新的主節點後,會嘗試與該節點創建網絡鏈接
圖片描述
從節點與主節點創建網絡鏈接高併發

從節點會創建一個 socket 套接字,從節點創建了一個端口爲51234的套接字,專門用於接受主節點發送的複製命令。從節點鏈接成功後打印以下日誌:ui

圖片描述

若是從節點沒法創建鏈接,定時任務會無限重試直到鏈接成功或者執行 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)命令持續複製。當主節點把當前的數據同步給從節點後,便完成了複製的創建流程。接下來主節點會持續地把寫命令發送給從節點,保證主從數據一致性。

相關文章
相關標籤/搜索