Redis6.x學習筆記(四)複製

前言

最近學習Redis6.x,特作筆記以備忘,與你們共學。課程是從私塾在線下載的,他們把架構師課程都放出來了,你們能夠去下載學習,不要錢的,地址是http://t.hk.uy/eK7,課程很不錯,值得學習!關鍵是不要錢,嘻嘻!node

複製概述

Redis支持複製的功能,以實現當一臺服務器的數據更新後,自動將新的數據異步同步到其它數據庫。redis

Redis複製實現中,把數據庫分爲主數據庫master和從數據庫slave,主數據庫能夠進行讀寫操做,從數據庫通常是隻讀的,當主數據庫數據變化的時候,會自動同步給從數據庫。數據庫

複製帶來的好處

1:能夠實現讀寫分離
2:利於在主數據庫崩潰時的數據恢復
3:水平擴容支撐高併發

複製基本配置

主數據庫不作配置;
從數據庫須要在配置中設置「replicaof 主數據庫ip 主數據庫端口」

複製的基本操做命令

1:info replication :能夠查看複製節點的相關信息

2:slaveof:可在運行期間修改slave節點的信息,若是該數據庫已是
某個主數據庫的從數據庫,那麼會中止和原主數據庫的同步關係,轉而
和新的主數據庫同步

3:slaveof no one:使當前數據庫中止與其餘數據庫的同步,轉成主數據庫

複製部分的配置詳解

1:replicaof :指定某一個redis做爲另外一個redis的從服務器,經過指定IP
和端口來設置主redis

2:masterauth:若是主redis設置了驗證密碼的話(使用requirepass來設置),
則在從redis的配置中要使用masterauth來設置校驗密碼,不然的話,主redis
會拒絕從redis的訪問請求

3:replica-read-only:設置從Redis爲只讀

4:repl-ping-replica-period:設置從redis會向主redis發出PING包的週期,
默認是10秒

5:replica-serve-stale-data:設置當從redis失去了與主redis的鏈接,
或者主從同步正在進行中時,redis該如何處理外部發來的訪問請求 。

若是設置爲yes(默認),則從redis仍會繼續響應客戶端的請求。
若是設置爲no,則從redis會對客戶端的請求返回「SYNC with master in progress」,
固然也有例外,當客戶端發來INFO請求和SLAVEOF請求,從redis仍是會進行處理。

6:repl-timeout:設置主從同步的超時時間,要確保這個時限比
repl-ping-replica-period的值要大,不然每次主redis都會認爲從redis超時。

7:repl-disable-tcp-nodelay:設置在主從同步時是否禁用TCP_NODELAY,
若是開啓,那麼主redis會使用更少的TCP包和更少的帶寬來向從redis傳輸數據。
可是這可能會增長一些同步的延遲,大概會達到40毫秒左右。若是關閉,
那麼數據同步的延遲時間會下降,可是會消耗更多的帶寬。

8:repl-backlog-size:設置同步隊列長度。隊列長度(backlog)是主redis中的
一個緩衝區,在與從redis斷開鏈接期間,主redis會用這個緩衝區來緩存應該發給
從redis的數據。這樣的話,當從redis從新鏈接上以後,就沒必要從新全量同步數據,
只須要同步這部分增量數據便可

9:repl-backlog-ttl:設置主redis要等待的時間長度,若是主redis等了這麼
長時間以後,仍是沒法鏈接到從redis,那麼緩衝隊列中的數據將被清理掉。
設置爲0,則表示永遠不清理。默認是1個小時。 

10:replica-priority:設置從redis優先級,在主redis持續工做不正常的狀況,
優先級高的從redis將會升級爲主redis。而編號越小,優先級越高。當優先級
被設置爲0時,這個從redis將永遠也不會被選中。默認的優先級爲100

11:min-replicas-to-write:設置執行寫操做所需的最少從服務器數量,若是
至少有這麼多個從服務器, 而且這些服務器的延遲值都少於 min-replicas-max-lag 
秒, 那麼主服務器就會執行客戶端請求的寫操做 

12:min-replicas-max-lag:設置最大鏈接延遲的時間, min-replicas-to-write和
min-replicas-max-lag中有一個被置爲0,則這個特性將被關閉。默認狀況下
min-replicas-to-write爲0,而min-replicas-max-lag爲10 

13: repl-diskless-sync:是否開啓無盤複製,默認是no

14:repl-diskless-sync-delay:設置無盤複製延時開始秒數,默認是5秒,
意思是當PSYNC觸發的時候,master延時多少秒開始向slave傳送數據流,
以便等待更多的slave鏈接能夠同時傳送數據流,由於一旦PSYNC開始後,
若是有新的slave鏈接master,只能等待下次PSYNC。能夠配置爲0取消等待,當即開始

15:repl-diskless-load:是否使用無磁盤加載,這是個實驗性的功能,目前
有三個選項:disabled:不要使用無磁盤加載,先將rdb文件存儲到磁盤
on-empty-db:只有在徹底安全的狀況下才使用無磁盤加載swapdb:
解析時在RAM中保留當前DB內容的副本,直接從套接字獲取數據。

複製的基本原理

1: slave啓動時,會向master發送psync請求,若是這是slave從新鏈接master,那麼master僅僅會複製給slave缺乏的數據; 若是是第一次鏈接master,那麼會觸發一次全量複製緩存

2:主數據庫接到psync請求後,若是是全量複製,會在後臺保存快照,就是實現RDB持久化,並將保存快照期間接收到的命令緩存起來安全

3:快照完成後,主數據庫會將快照文件和全部緩存的命令發送給從數據庫服務器

4:從數據庫接收後,會載入快照文件並執行緩存的命令,從而完成複製的初始化網絡

5:若是是從新鏈接,Master會檢查backlog裏面的offset, master和slave都會保存一個複製的offset還有一個master id,offset是保存在backlog中的。Master只會把已經複製的offset後面的數據複製給Slave,相似斷點續傳。 架構

6:在數據庫使用階段,主數據庫會自動把每次收到的寫命令同步到從服務器併發

7:Slave在複製的時候,不會阻塞Master的正常工做;也不會阻塞對本身的查詢操做,它會用舊的數據集來提供服務; 可是複製完成的時候,須要刪除舊數據集,加載新數據集,這個時候就會暫停對外服務了 less

8:強烈建議:Master必定要持久化

樂觀複製策略

Redis採用樂觀複製的策略,容忍在必定時間內主從數據庫的內容不一樣,固然最終的數據會是同樣的。這個策略保證了性能,在複製的時候,主數據庫並不阻塞,照樣處理客戶端的請求。

Redis提供了配置來限制只有當數據庫至少同步給指定數量的從數據庫時,主數據庫纔可寫,不然返回錯誤。配置是:min-replicas-to-write、min-replicas-max-lag

無硬盤複製

Master直接建立一個子進程,來生成RDB文件的內容,並經過網絡直接傳送給Slave,也就是RDB文件不保存到磁盤上。

之前:當複製發生時,主數據庫會在後臺保存RDB快照,即便你關閉了RDB,它也會這麼作,這樣就會致使:

1:若是主數據庫關閉了RDB,如今強行生成了RDB,那麼下次主數據庫啓動的
時候,可能會從RDB來恢復數據,這多是舊的數據。

2:因爲要生成RDB文件,若是硬盤性能不高的時候,會對性能形成必定影響
所以從2.8.18版本,引入了無硬盤複製的功能。

異步複製致使的數據丟失

在主備切換的過程當中,可能會致使數據丟失。由於數據複製是異步的,可能有部分數據還沒複製到slave,master就宕機了,此時這些部分數據就丟失了

腦裂致使的數據丟失

腦裂:當某個master所在機器忽然脫離了集羣的網絡,跟其餘slave機器不能鏈接,
可是實際上master還運行着,此時哨兵可能會認爲master宕機了,而後開啓選舉,
將其它slave切換成了master,這個時候,集羣裏就會有兩個master,也就是所謂的腦裂。

這種狀況下可能會產生數據丟失:

1:此時雖然某個slave被切換成了master,可是客戶端可能還沒來得及切換到
新的master,還繼續向舊master寫數據,這些數據可能就丟失了

2:當舊master再次恢復的時候,會被做爲一個slave掛到新的master上去,
那麼舊master原來的數據就會清空,從新重新的master複製數據

解決數據丟失的方式

配置min-replicas-to-write和min-replicas-max-lag兩個參數,好比:
min-replicas-to-write 1
min-replicas-max-lag 10
要求至少有1個slave,數據複製和同步的延遲不能超過10秒

若是說一旦全部的slave,數據複製和同步的延遲都超過了10秒鐘,
那麼這個時候,master就不會再接收任何請求了

若是出現了腦裂,一個master跟其它slave丟了鏈接,那麼上面兩個配置能夠確保說,若是不能繼續給指定數量的slave發送數據,並且slave超過10秒沒有給本身應答消息,那麼就直接拒絕客戶端的寫請求

後記

我會持續的把我學習Redis6.x過程的筆記記錄下來,跟你們一塊兒學習。但願能堅持下去!

相關文章
相關標籤/搜索