redis主從複製

 

 

 

 

 

 

 

 

redis主從復

概述

一、redis的複製功能是支持多個數據庫之間的數據同步。一類是主數據庫(master)一類是從數據庫(slave),主數據庫能夠進行讀寫操做,當發生寫操做的時候自動將數據同步到從數據庫,而從數據庫通常是隻讀的,並接收主數據庫同步過來的數據,一個主數據庫能夠有多個從數據庫,而一個從數據庫只能有一個主數據庫。python

二、經過redis的複製功能能夠很好的實現數據庫的讀寫分離,提升服務器的負載能力。主數據庫主要進行寫操做,而從數據庫負責讀操做。redis

 

 

過程:數據庫

1:當一個從數據庫啓動時,會向主數據庫發送sync命令,緩存

2:主數據庫接收到sync命令後會開始在後臺保存快照(執行rdb操做),並將保存期間接收到的命令緩存起來服務器

3:當快照完成後,redis會將快照文件和全部緩存的命令發送給從數據庫。網絡

4:從數據庫收到後,會載入快照文件並執行收到的緩存的命令。架構

 

注意:redis2.8以前的版本:當主從數據庫同步的時候從數據庫由於網絡緣由斷開重連後會從新執行上述操做,不支持斷點續傳。異步

redis2.8以後支持斷點續傳。分佈式

配置

 VM 虛擬主機性能

Redis主從結構支持一主多從

主節點:192.168.33.130

從節點:192.168.33.131

注意:全部從節點的配置都同樣

方式1:手動修改配置文件

只須要額外修改從節點中redis的配置文件中的slaveof屬性便可

 

 

方式2:動態設置

經過redis-cli 鏈接到從節點服務器,執行下面命令便可。

slaveof 192.168.33.130 6379

演示結果和手動方式一致。

 

注意事項

若是你使用主從複製,那麼要確保你的master激活了持久化,或者確保它不會在當掉後自動重啓。緣由:

slave是master的完整備份,所以若是master經過一個空數據集重啓,slave也會被清掉。

在配置redis複製功能的時候若是主數據庫設置了密碼,須要在從數據的配置文件中經過masterauth參數設置主數據庫的密碼,這樣從數據庫在鏈接主數據庫時就會自動使用auth命令認證了。至關於作了一個免密碼登陸。

 

redis的Sentinel

 

sentinel功能

redis的sentinel系統用於管理多個redis服務器,該系統主要執行三個任務:監控、提醒、自動故障轉移。

 

一、監控(Monitoring): Redis Sentinel實時監控主服務器和從服務器運行狀態,而且實現自動切換。

二、提醒(Notification):當被監控的某個 Redis 服務器出現問題時, Redis Sentinel 能夠向系統管理員發送通知, 也能夠經過 API 向其餘程序發送通知。

三、自動故障轉移(Automatic failover): 當一個主服務器不能正常工做時,Redis Sentinel 能夠將一個從服務器升級爲主服務器, 並對其餘從服務器進行配置,讓它們使用新的主服務器。當應用程序鏈接Redis 服務器時, Redis Sentinel會告之新的主服務器地址和端口。

 

注意:在使用sentinel監控主從節點的時候,從節點須要是使用動態方式配置的,若是直接修改配置文件,後期sentinel實現故障轉移的時候會出問題。

 

 

主觀下線和客觀下線:

一、主觀下線狀態:當一個sentinel認爲一個redis服務鏈接不上的時候,會給這個服務打個標記爲下線狀態。

二、客觀下線狀態:當多個sentinel認爲一個redids鏈接不上的時候,則認爲這個redis服務確實下線了。這裏的多個sentinel的個數能夠在配置文件中設置。

 

主節點:主觀下線和客觀下線

從節點:主觀下線狀態

 

sentinel配置

修改sentinel.conf文件

 

 

 

 

示例

下面將演示怎麼實現一個簡單的複製系統。咱們在一臺機器上起兩個Redis實例,監聽不一樣的端口,其中一個做爲主庫,另一個做爲從庫。首先不加任何參數來啓動一個Redis實例做爲主數據庫:

能夠看到,主庫監聽的是6379端口。

而後加上slaveof參數啓動另外一個Redis實例做爲從庫,而且監聽6380端口:

 

 

 從控制檯輸出中能夠看到,從庫已經鏈接到主庫:126.0.0.1:6379了,看樣子主從複製系統配置成功。咱們能夠分別在主庫和從庫中使用以下命令看一看當前實例在複製系統中的相關信息:

 

接下來驗證一把。

首先在主庫中設置一個鍵值:

 

如今到從庫中檢查該值是否已經自動同步到了從庫:

能夠看到,數據確實從主庫同步到了從庫.

在默認狀況下,從庫是隻讀的,若是在從庫中寫數據將會報錯:

 

 

可是能夠在從庫的配置文件中加上以下的配置項容許從庫寫數據:

可是,由於從庫中修改的數據不會被同步到任何其餘數據庫,而且一旦主庫修改了數據,從庫的數據就會由於自動同步被覆蓋,因此通常狀況下,不建議將從庫設置爲可寫。

相同的道理,配置多臺從庫也使用相同的方法,都在從庫的配置文件中加上slaveof參數便可。

 

原理

上面說了配置主從複製系統的方法,而且舉例例子詳細說明,本節將介紹Redis主從複製的實現原理。

當一個從數據庫啓動時,會向主數據庫發送SYNC命令,主數據庫收到命令後會開始在後臺保存快照(即RDB持久化過程),並將保存快照期間接收到的命令緩存起來。當快照完成後,Redis會將快照文件和緩存的命令發給從數據庫,從數據庫收到數據後,會載入快照文件並執行緩存的命令。以上過程稱爲複製初始化。複製初始化之結束後,主數據庫每收到寫命令時就會將命令同步給從數據庫,從而保證主從數據庫數據一致,這一過程稱爲複製同步階段

有兩點須要注意:

  1. 當主從數據庫之間的鏈接斷開後,Redis2.8以前的版本會從新進行復制初始化過程,這樣就使得主從數據庫斷開鏈接後數據恢復的過程的效率很低下。Redis2.8版本的一個重要改進就是斷線支持有條件的增量數據傳輸,當從數據庫再次鏈接到主數據庫時,主數據庫只須要將斷線期間執行的命令發給從數據庫便可,大大提升了Redis主從複製的實用性。
  2. 複製同步階段貫穿整個主從同步過程的始終,直到主從關係終止爲止。在複製過程當中,即便關閉了RDB方式的持久化(刪除全部save參數),依舊會執行快照操做。

樂觀複製

Redis採用了複製的策略。容忍在必定時間內主從數據庫的內容是不一樣的,可是二者的數據最終會保持一致。具體來講,Redis主從數據庫之間的複製數據的過程自己是異步的,這意味着,主數據庫執行完客戶端的寫請求後會當即將命令在主數據庫的執行結果返回給客戶端,而不會等待從數據庫收到該命令後再返回給客戶端。這一特性保證了複製後主從數據庫的性能不會受到影響,但另外一方面也會產生一個主從數據庫數據不一致的時間窗口,當主數據庫執行一條寫命令以後,主數據庫的數據已經發生變更,然而在主數據庫將該命令傳送給從數據庫以前,若是兩個數據庫之間的鏈接斷開了,此時兩者間的數據就不一致了。從這個角度看,主數據庫沒法得知命令最終同步給了幾個從數據庫,不過Redis提供了兩個配置選項來限制只有至少同步給指定數量的數據庫時,主數據庫纔是可寫的

第一個參數表示只有當3個或3個以上的從數據庫鏈接到主庫時,主數據庫纔是可寫的,不然返回錯誤。
第二個參數表示容許從數據庫失去鏈接的最長時間,該選項默認是關閉的,在分佈式系統中,打開併合理配置該選項能夠下降主從架構由於網絡分區致使的數據不一致問題。

圖結構

從數據庫不只能夠接收主數據庫的數據,同時也能夠做爲主數據庫存在,造成相似圖的結構,以下圖:
A中的數據會同步到B,C中,C中的數據會同步到D,E中。

相關文章
相關標籤/搜索