作者: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、命令持續複製
當主節點把當前的資料同步給從節點後,便完成了複製的建立流程。接下來主節點會持續地把寫命令傳送給從節點,保證主從資料一致性。