只有光頭才能變強git
好的,今天咱們要上鉑金段位了,若是還沒經歷過青銅和白銀和黃金階段的,能夠先去蹭蹭經驗再回來:github
這篇文章主要講的是Redis主從複製。由於Redis集羣的知識點有點多,因此鉑金上分得要好幾篇~數據庫
文本力求簡單講清每一個知識點,但願你們看完能有所收穫服務器
Redis也跟關係型數據(MySQL)同樣,若是有過多請求仍是撐不住的。網絡
由於Redis若是隻有一臺服務器的話,那隨着請求愈來愈多:架構
顯然,出現的上述問題是由於一臺Redis服務器不夠,因此多搞幾臺Redis服務器就能夠了併發
爲了實現咱們服務的高可用性,能夠將這幾臺Redis服務器作成是主從來進行管理設計
tip:Redis做者已將Master/Slave架構更名爲Master/Replica3d
下面咱們來看看Redis的主從架構特色:code
主從架構的好處:
主從架構除了上面的形式,也有下面這種的(只不過用得比較少):
主從架構的特色之一:主服務器和從服務器的數據是一致的。
由於主服務器是能接收寫請求的,主服務器處理完寫請求,會作什麼來保證主從數據的一致性呢?若是主從服務器斷開了,過一陣子才重連,又會怎麼處理呢?下面將會了解到這些細節~
在Redis中,用戶能夠經過執行SALVEOF命令或者設置salveof選項,讓一個服務器去複製(replicate)另外一個服務器,咱們稱呼被複制的服務器爲主服務器(master),而對主服務器進行復制的服務器則被稱爲從服務器(salve)
複製功能分爲兩個操做:
從服務器對主服務器的同步又能夠分爲兩種狀況:
在Redis2.8之前,斷線後複製這部分其實缺乏的只是部分的數據,可是要讓主從服務器從新執行SYNC命令,這樣的作法是很是低效的。(由於執行SYNC命令是把全部的數據再次同步,而不是隻同步丟失的數據)
接下來咱們來詳細看看Redis2.8之後複製功能是怎麼實現的:
首先咱們來看一下前置的工做:
前面也提到了,Redis2.8以前,斷線後同步會從新執行SYNC命令,這是很是低效的。下面咱們來看一下Redis2.8以後是怎麼進行同步的。
Redis從2.8版本開始,使用PSYNC命令來替代SYNC命令執行復制時同步的操做。
PSYNC命令具備完整重同步和部分重同步兩種模式(其實就跟上面所說的初次複製和斷線後複製差很少個意思)。
下面先來看看完整重同步是怎麼實現的:
接下來咱們來看看部分重同步,部分重同步可讓咱們斷線後重連只須要同步缺失的數據(而不是Redis2.8以前的同步所有數據),這是符合邏輯的!
部分重同步功能由如下部分組成:
首先咱們來解釋一下上面的名詞:
複製偏移量:執行復制的雙方都會分別維護一個複製偏移量
經過對比主從複製的偏移量,就很容易知道主從服務器的數據是否處於一致性的狀態!
那斷線重連之後,從服務器向主服務器發送PSYNC命令,報告如今的偏移量是36,那麼主服務器該對從服務器執行完整重同步仍是部分重同步呢??這就交由複製積壓緩衝區來決定。
當主服務器進行命令傳播時,不只僅會將寫命令發送給全部的從服務器,還會將寫命令入隊到複製積壓緩衝區裏面(這個大小能夠調的)。若是複製積壓緩衝區存在丟失的偏移量的數據,那就執行部分重同步,不然執行完整重同步。
服務器運行的ID(run ID)實際上就是用來比對ID是否相同。若是不相同,則說明從服務器斷線以前複製的主服務器和當前鏈接的主服務器是兩臺服務器,這就會進行完整重同步。
因此流程大概如此:
當完成了同步以後,主從服務器就會進入命令傳播階段。這時主服務器只要將本身的寫命令發送給從服務器,而從服務器接收並執行主服務器發送過來的寫命令,就能夠保證主從服務器一直保持數據一致了!
在命令傳播階段,從服務器默認會以每秒一次的頻率,向服務器發送命令REPLCONF ACK <replication_offset>
其中replication_offset是從服務器當前的複製偏移量
發送這個命令主要有三個做用:
畫了很久很久的圖,終於寫完啦。
拋個問題:若是從服務器掛了,不要緊,咱們通常會有多個從服務器,其餘的請求能夠交由沒有掛的從服務器繼續處理。若是主服務器掛了,怎麼辦?由於咱們的寫請求由主服務器處理,只有一臺主服務器,那就沒法處理寫請求了?
問題留到下篇解決~~
參考資料:
若是你以爲我寫得還不錯,瞭解一下: