redis主從復制淺析

主從同步簡介

redis集群的搭建方式有一主一從粘都,一主多從寨典,多主多從等方式联予,目前我們介紹主從的方式瓣履,就從一主一從開始切入率翅。

主從復制的作用如下:

  1. 數(shù)據(jù)備份:主從同步實現(xiàn)了redis數(shù)據(jù)的熱備份,是持久化之外的另一種數(shù)據(jù)冗余方式袖迎。增強了數(shù)據(jù)安全性。
  2. 故障恢復:從節(jié)點備份了主節(jié)點數(shù)據(jù)的所有數(shù)據(jù)腺晾,當主節(jié)點宕機時燕锥,從節(jié)點可以即刻頂上,無縫銜接悯蝉,實現(xiàn)故障的快速恢復归形,也算是一種服務冗余。
  3. 讀寫分離:在主從復制的基礎上上鼻由,通過負載均衡等方式暇榴,可以由主節(jié)點負責寫入,從節(jié)點提供讀服務蕉世。在讀多寫少的場景下蔼紧,選擇一主多從的集群方式,大大提高redis的服務器的并發(fā)量狠轻。
  4. 高可用奸例、高并發(fā)基石:主從復制,主從通信是redis集群和哨兵模式的實現(xiàn)的基礎向楼。

redis集群搭建

主從復制的開啟查吊,完全是從節(jié)點上的發(fā)起的,無需主節(jié)點做任何操作湖蜕。

開啟主從復制的方式

  1. 配置文件:在redis的配置文件中增加配置:slaveof 主節(jié)點ip:port
  2. redis啟動命令:redis-server 啟動命令加入 -- slaveof
  3. 客戶端發(fā)送命令:slaveof ip port

總結(jié):上邊三種方式是等效的逻卖,只是后兩種方式在從節(jié)點重啟后需再次執(zhí)行。

客戶端命令主從復制示例

準備工作:啟動兩個redis節(jié)點

端口規(guī)劃:6379 6380

啟動時兩個都是主節(jié)點昭抒,啟動后計劃6379實例為主節(jié)點评也,6380設置為從節(jié)點虚茶。

6379為默認端口。6380端口實例需要在配置文件中修改端口號仇参。

# Accept connections on the specified port,default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

建立主從復制關系

從節(jié)點執(zhí)行命令:

redis-cli 6380 #連接客戶端
127.0.0.1:6380> slaveof 127.0.0.1 63729 #建立主從復制關系

主從同步演示效果

  1. 從節(jié)點查詢一個不存在的key(mykey)
    1. mykey不存在
  2. 主節(jié)點增加mykey
  3. 從節(jié)點查詢mykey
    1. 從節(jié)點同樣可以查詢到mykey的值嘹叫,說明數(shù)據(jù)已經(jīng)從主節(jié)點同步過來了。
  4. 主節(jié)點刪除mykey
  5. 從節(jié)點查詢mykey
    1. 從節(jié)點數(shù)據(jù)也不存在了诈乒,說明從節(jié)點刪除數(shù)據(jù)也同步成功了罩扇。

斷開復制

通過slaveof命令建立的主從同步關系,可以通過slaveof no one 命令斷開怕磨。

:::color5
?? 從節(jié)點與主節(jié)點斷開以后喂饥,從節(jié)點的已存在數(shù)據(jù)不會被刪除,只是不再接收主節(jié)點同步的數(shù)據(jù)肠鲫。

:::

主從復制的核心原理

redis主從同步方式

redis集群可以使用主從同步和從從同步员帮,主要的同步方式有全量復制和部分復制。

  1. <font style="color:rgb(51,51,51);">全量復制:</font><font style="color:rgb(51,51,51);">用于初次復制或其他無法進行部分復制的情況导饲,將主節(jié)點中的所有數(shù)據(jù)都發(fā)送給從節(jié)點捞高,是一個非常重型的操作。 </font>
  2. <font style="color:rgb(51,51,51);">部分復制:</font><font style="color:rgb(51,51,51);">用于網(wǎng)絡中斷等情況后的復制渣锦,只將中斷期間主節(jié)點執(zhí)行的寫命令發(fā)送給從節(jié)點硝岗,與全量復制相比更加高效。需要注意的是袋毙,如果網(wǎng)絡中斷時間過長型檀,導致主節(jié)點沒有能夠完整地保存中斷期間執(zhí)行的寫命令,則無法進行部分復制听盖,仍要使用全量復制胀溺。</font>

初次建立主從復制關系(全量復制):

  1. 從節(jié)點發(fā)送slaveof命令旅择,主節(jié)點接收到命令辨宠,做一次bgsave,將全量數(shù)據(jù)寫入到rdb文件,同時把后續(xù)的操作記錄寫到復制緩沖區(qū)中西轩。
  2. rdb寫入完成后全量同步到從節(jié)點悬蔽。從節(jié)點接受完成后將rdb文件全量加載到內(nèi)存中扯躺。
  3. 加載完成后,再通知主節(jié)點將操作記錄緩沖區(qū)中的數(shù)據(jù)也同步到從節(jié)點蝎困,進行重放就完成了同步過程录语。
  4. 后續(xù)的增量數(shù)據(jù)都是通過同步數(shù)據(jù)的操作記錄完成的,類似mysql的binlog日志禾乘。

建立主從同步關系后異常斷開(部分復制):

  1. 從節(jié)點每秒嘗試與主節(jié)點建立socker連接澎埠。
  2. 建立連接時發(fā)送命令 psync {runId} {offset},需要帶上runid和offser信息始藕。
  3. 主節(jié)點接收到offset信息后蒲稳,判斷offset是否在復制積壓緩沖區(qū)內(nèi)氮趋?
  4. 在緩沖區(qū)內(nèi)則將緩沖區(qū)中的數(shù)據(jù)發(fā)送到從節(jié)點,從節(jié)點完成增量數(shù)據(jù)同步江耀。
  5. 不在緩沖區(qū)內(nèi)剩胁,則執(zhí)行全量復制步驟。

名詞解釋

:::color2
?? redis sever的runId

每個redis實例啟動時祥国,都會生成一個隨機ID(每次啟動都是不同的)昵观,由40個隨機的十六進制字符組成,runId用來標識唯一的redis節(jié)點舌稀。

:::

# 通過info server命令查詢run_id
redis-cli info server | grep run_id

<font style="color:rgb(51,51,51);">主從節(jié)點初次復制時啊犬,主節(jié)點將自己的runid發(fā)送給從節(jié)點,從節(jié)點將這個runid保存起來壁查;當斷線重連時觉至,從節(jié)點會將這個runid發(fā)送給主節(jié)點;主節(jié)點根據(jù)runid判斷能否進行部分復制: </font>

  1. <font style="color:rgb(51,51,51);">如果從節(jié)點保存的runid與主節(jié)點現(xiàn)在的runid相同睡腿,說明主從節(jié)點之前同步過语御,主節(jié)點會繼續(xù)嘗試使用部分復制(到底能不能部分復制還要看offset和復制積壓緩沖區(qū)的情況); </font>
  2. <font style="color:rgb(51,51,51);">如果從節(jié)點保存的runid與主節(jié)點現(xiàn)在的runid不同嫉到,說明從節(jié)點在斷線前同步的Redis節(jié)點并不是當前的主節(jié)點沃暗,只能進行全量復制。</font>

:::color2
?? 復制偏移量offset

  1. 主節(jié)點和從節(jié)點分別維護一個復制偏移量(offset)何恶,代表的是主節(jié)點向從節(jié)點傳遞的字節(jié)數(shù)。
  2. 主節(jié)點每次向從節(jié)點傳輸N個字節(jié)數(shù)據(jù)時嚼黔,主節(jié)點的offset就增加N细层。
  3. 從節(jié)點每次從主節(jié)點接收到N個字節(jié)數(shù)據(jù)時,從節(jié)點的offset就增加N唬涧。

:::

offset的復制偏移量用途

offset用于判斷主從節(jié)點的數(shù)據(jù)是否一致疫赎,如果兩者offset相同,則數(shù)據(jù)相同碎节;如果不同捧搞,則不一致,此時則可以依據(jù)offset判斷兩者數(shù)據(jù)相差的部分狮荔。

例如:如果主節(jié)點的offset是1000胎撇,從節(jié)點的offset是500,則部分復制就可以將501-100字節(jié)的數(shù)據(jù)傳輸?shù)阶止?jié)點即可同步不一致的數(shù)據(jù)殖氏。

:::color2
?? 復制積壓緩沖區(qū)(repl-backlog-buffer)

復制積壓緩沖區(qū)是由主節(jié)點進行維護的晚树、固定隊列的、先進先出的隊列雅采,默認為1MB爵憎;

當主從關系建立時慨亲,master創(chuàng)建一個積壓緩沖區(qū),其作用是備份主節(jié)點最近接收到的redis命令,后續(xù)會發(fā)送給從節(jié)點的數(shù)據(jù)宝鼓。

無論主節(jié)點有一個從節(jié)點還是有多個從節(jié)點刑棵,主節(jié)點都只需要一個復制緩沖區(qū)。

:::

在命令傳輸階段愚铡,主節(jié)點除了將寫命令發(fā)送給從節(jié)點之外蛉签,還會在復制緩沖區(qū)內(nèi)備份寫命令。

除了儲存寫命令茂附,復制緩沖區(qū)中還存儲了其中的每個命令對應的復制偏移量(offset)正蛙。

由于復制緩沖區(qū)長度是固定有限的,因此可以備份的寫命令也十分有限营曼,當主從節(jié)點offset的差距超過緩沖區(qū)的長度時乒验,將無法執(zhí)行部分復制,只能執(zhí)行全量復制蒂阱。

主從同步流程

slaveof命令執(zhí)行流程

主節(jié)點接收到的從節(jié)點發(fā)送的slaveof命令后锻全,首先決定是使用全量復制還是部分復制。

  1. 從節(jié)點根據(jù)當前狀態(tài)录煤,決定如何調(diào)用 psync命令:
    1. 如果從節(jié)點從未執(zhí)行過 slaveof 或者 執(zhí)行過 slaveof no one ,從節(jié)點發(fā)送命令為 psync ? -1;使用全量復制鳄厌。
    2. 如果從節(jié)點執(zhí)行slaveof,則發(fā)送命令為 psync {runId} {offset} ,其中 runid為上次復制的主節(jié)點的 runid妈踊,offset 為從節(jié)點保存的復制偏移量了嚎。
  2. 主節(jié)點接收到從節(jié)點發(fā)送的 psync 命令后,根據(jù)命令數(shù)據(jù)和當前服務狀態(tài)廊营,判斷執(zhí)行全量復制還是部分復制歪泳。
    1. 主要主節(jié)點版本低于 Redis2.8 ,則回復 -ERR 露筒,此時從節(jié)點重新發(fā)送 psync命令執(zhí)行全量復制呐伞,因為 Redis2.8 版本之前只有全量復制的模式,沒有部分復制的模式慎式。
    2. 如果主節(jié)點在2.8版本之后伶氢,且判斷runid和主節(jié)點的runid是否相同,且判斷offset是否在主節(jié)點的復制緩沖區(qū)內(nèi)瘪吏,如果都滿足癣防,則回復+COUTINUE,表示使用部分復制模式肪虎,從主節(jié)點發(fā)送部分未同步數(shù)據(jù)即可劣砍。
    3. 如果上述條件存在未滿足的,則回復+FULLRESYNC {runid} {offset},表示進行全量復制扇救,runid為主節(jié)點的runid刑枝,offset為主節(jié)點的當前offset香嗓。從節(jié)點需要存儲這兩個值,供同步數(shù)據(jù)使用装畅。
畫板

主從復制流程

主從復制大致可以分三個流程

  1. 主從連接建立階段
  2. 數(shù)據(jù)同步階段
  3. 命令傳輸階段

連接建立階段

  1. 保存主節(jié)點信息
    1. 從節(jié)點執(zhí)行slaveof命令后靠娱,先將主節(jié)點的host 和 port信息保存,用于之后到主從節(jié)點通信掠兄,然后既返回OK像云,復制操作是異步執(zhí)行的。
  2. 建立socket連接
    1. <font style="color:rgb(51,51,51);">slaveof 命令執(zhí)行后蚂夕,從節(jié)點每秒1次調(diào)用復制定時函數(shù)replicationCron()迅诬,如果發(fā)現(xiàn)了有主節(jié)點可信息,便會根據(jù)主節(jié)點的ip和port婿牍,創(chuàng)建socket連接侈贷。</font>
    2. <font style="color:rgb(51,51,51);">創(chuàng)建socket連接時,如果主節(jié)點存在密碼等脂,則需要從節(jié)點中設置masterauth選項俏蛮,從節(jié)點需要向主節(jié)點進行身證;沒有配置該選項上遥,則不需要驗證搏屑。如果身份驗證通過,復制過程繼續(xù)粉楚;如果不一致辣恋,則從節(jié)點斷開socket連接,并重連模软。</font>
    3. <font style="color:rgb(51,51,51);">socket連接創(chuàng)建成功</font>
      1. <font style="color:rgb(51,51,51);">從節(jié)點</font><font style="color:rgb(51,51,51);">: 為該socket建立一個專門處理復制工作的文件事件處理器抑党,負責后續(xù)的復制工作,如接收RDB文件撵摆、接收主節(jié)點傳輸?shù)拿畹取?lt;/font>
      2. 主節(jié)點:socket建立連接(即完成accept操作)后,主節(jié)點會為這個連接創(chuàng)建一個專門的客戶端狀態(tài)害晦。此時特铝,從節(jié)點就是連接至主節(jié)點的一個客戶端。后續(xù)交互都是以從節(jié)點向主節(jié)點發(fā)送命令請求的方式進行壹瘟。
    4. <font style="color:rgb(51,51,51);">從節(jié)點成為主節(jié)點的客戶端之后鲫剿,發(fā)送ping命令進行首次請求,目的是:檢查socket連接是否可用稻轨,以及主節(jié)點當前能否處理請求灵莲。 </font>
      1. <font style="color:rgb(51,51,51);">從節(jié)點發(fā)送ping命令后,可能出現(xiàn)3種情況: </font>
        1. <font style="color:rgb(51,51,51);">返回pong:說明socket連接正常殴俱,且主節(jié)點當前可以處理請求政冻,復制過程繼續(xù)枚抵。</font>
        2. <font style="color:rgb(51,51,51);">超時:一定時間后從節(jié)點仍未收到主節(jié)點的回復,說明socket連接不可用明场,則從節(jié)點斷開socket連接汽摹,并重連。 </font>
        3. <font style="color:rgb(51,51,51);">返回pong以外的結(jié)果:如果主節(jié)點返回其他結(jié)果苦锨,如正在處理超時運行的腳本逼泣,說明主節(jié)點當前無法處理命令,則從節(jié)點斷開socket連接舟舒,并重連拉庶。</font>
  3. 發(fā)送從節(jié)點端口信息

<font style="color:rgb(51,51,51);">socket成功建立之后,從節(jié)點會向主節(jié)點發(fā)送其監(jiān)聽的端口號(前述例子中為6380)秃励,主節(jié)點將該信息保存到從節(jié)點對應的客戶端的slave_listening_port字段中氏仗; </font>

:::tips
??<font style="color:rgb(51,51,51);">該端口信息除了在主節(jié)點中執(zhí)行info Replication時顯示以外,沒有其他作用莺治。</font>

:::

數(shù)據(jù)同步階段

<font style="color:rgb(51,51,51);">主從節(jié)點之間的連接建立以后廓鞠,便可以開始進行數(shù)據(jù)同步,該階段可以理解為從節(jié)點數(shù)據(jù)的初始化谣旁。同步方式需要判斷全量復制還是部分復制床佳,判斷過程見4.1所示。下邊詳細介紹全量復制過程和部分復制過程榄审。</font>

全量復制過程

<font style="color:rgb(51,51,51);">Redis通過psync命令進行全量復制的過程如下: </font>

  1. <font style="color:rgb(51,51,51);">從節(jié)點判斷無法進行部分復制砌们,向主節(jié)點發(fā)送全量復制的請求;或從節(jié)點發(fā)送部分復制的請求搁进, 但主節(jié)點判斷無法進行部分復制浪感; </font>
  2. <font style="color:rgb(51,51,51);">主節(jié)點收到全量復制的命令后,執(zhí)行bgsave饼问,在后臺生成RDB文件影兽,并使用一個緩沖區(qū)(稱為復制緩沖區(qū))記錄從現(xiàn)在開始執(zhí)行的所有寫命令。</font>
  3. <font style="color:rgb(51,51,51);">主節(jié)點的bgsave執(zhí)行完成后莱革,將RDB文件發(fā)送給從節(jié)點峻堰;</font><font style="color:rgb(51,51,51);">從節(jié)點接收完成之后,首先清除自己的舊數(shù)據(jù)盅视,然后載入接收的RDB</font><font style="color:rgb(51,51,51);">文件捐名,將數(shù)據(jù)庫狀態(tài)更新至主節(jié)點執(zhí)行bgsave時的數(shù)據(jù)庫狀態(tài) </font>
  4. <font style="color:rgb(51,51,51);">主節(jié)點將前述復制緩沖區(qū)中的所有寫命令發(fā)送給從節(jié)點,從節(jié)點執(zhí)行這些寫命令闹击,將數(shù)據(jù)庫狀態(tài)更新至主節(jié)點的最新狀態(tài) </font>
  5. <font style="color:rgb(51,51,51);">如果從節(jié)點開啟了AOF镶蹋,則會觸發(fā)bgrewriteaof的執(zhí)行,從而保證AOF文件更新至主節(jié)點的最新狀態(tài) </font>

<font style="color:rgb(51,51,51);">下面是執(zhí)行全量復制時,主從節(jié)點打印的日志贺归;可以看出日志內(nèi)容與上述步驟是完全對應的淆两。 </font>

<font style="color:rgb(51,51,51);">主節(jié)點的打印日志如下: </font>

<font style="color:rgb(51,51,51);">從節(jié)點打印日志如下圖所示: </font>

:::warning
?? <font style="color:rgb(51,51,51);">從節(jié)點接收了來自主節(jié)點的89260個字節(jié)的數(shù)據(jù),在載入主節(jié)點的數(shù)據(jù)之前要先將老數(shù)據(jù)清除牧氮; </font>

:::

:::color1
?? <font style="color:rgb(51,51,51);">從節(jié)點在同步完數(shù)據(jù)后琼腔,調(diào)用了bgrewriteaof。通過全量復制的過程可以看出踱葛,全量復制是非常重型的操作: </font>

  1. <font style="color:rgb(51,51,51);">性能損耗</font><font style="color:rgb(51,51,51);">:主節(jié)點通過bgsave命令fork子進程進行RDB持久化丹莲,該過程是非常消耗CPU、內(nèi)存(頁 表復制)尸诽、硬盤IO的甥材。</font>
  2. <font style="color:rgb(51,51,51);">帶寬占用:</font><font style="color:rgb(51,51,51);">主節(jié)點通過網(wǎng)絡將RDB文件發(fā)送給從節(jié)點,對主從節(jié)點的帶寬都會帶來很大的消耗性含。</font>
  3. <font style="color:rgb(51,51,51);">停服載入:</font><font style="color:rgb(51,51,51);">從節(jié)點清空老數(shù)據(jù)洲赵、載入新RDB文件的過程是阻塞的,無法響應客戶端的命令商蕴;如果從節(jié)點執(zhí)行bgrewriteaof叠萍,也會帶來額外的消耗。</font>

:::

:::danger
?? <font style="color:rgb(51,51,51);">全量復制的弊端:</font>

<font style="color:rgb(51,51,51);">觸發(fā)場景:</font>

  1. <font style="color:rgb(51,51,51);">新創(chuàng)建的slave绪商,從主機master同步數(shù)據(jù)苛谷。</font>
  2. <font style="color:rgb(51,51,51);">剛宕機一小會的slave,從主機master同步數(shù)據(jù)格郁。 </font>

<font style="color:#117CEE;">前者新建的slave則從主機master全量同步數(shù)據(jù)腹殿,這沒啥問題。但是后者slave可能只與master存在小量的數(shù)據(jù)差異例书,要是全量同步肯定沒有只同步差異(部分復制)少量數(shù)據(jù)的性能高锣尉。</font>

:::

部分復制過程

部分復制是Redis為了降低全量復制高成本而采取的優(yōu)化方法,通過使用psync {runId} {offset}命令來實現(xiàn)决采。當從節(jié)點復制主節(jié)點數(shù)據(jù)期間發(fā)生網(wǎng)絡中斷或命令丟失等異常自沧,從節(jié)點會請求主節(jié)點補充丟失的數(shù)據(jù)。如果主節(jié)點的復制緩沖區(qū)保存了這些丟失的數(shù)據(jù)树瞭,它將直接傳送至從節(jié)點暂幼,確保主從數(shù)據(jù)一致性。相比全量復制移迫,這種只補充差異數(shù)據(jù)的方式大大減少了數(shù)據(jù)傳輸量,從而降低了開銷管行。

部分復制步驟:

  1. 出現(xiàn)網(wǎng)絡中斷超時(超過repl-timeout)厨埋,主節(jié)點與從節(jié)點的復制連接斷開,視為從節(jié)點故障捐顷。
  2. socket連接中斷期間荡陷,主節(jié)點正常服務雨效,但命令無法傳至從節(jié)點。主節(jié)點最近寫操作可暫存在復制積壓緩沖區(qū)<font style="color:rgb(51,51,51);">( repl-backlog-buffer )</font>中废赞,默認大小1MB徽龟,以備連接恢復后進行部分復制。
  3. 網(wǎng)絡恢復后唉地,從節(jié)點主動重連主節(jié)點据悔。
  4. 主從節(jié)點重新建立連接后,從節(jié)點用之前記錄的偏移量和主節(jié)點runId作為psync指令耘沼,請求缺失數(shù)據(jù)補發(fā)极颓。
  5. 主節(jié)點確認psync指令中的runId匹配且所需偏移量后的數(shù)據(jù)仍在其緩沖區(qū)中,則同意部分復制群嗤,發(fā)送+CONTINUE響應菠隆。
  6. 主節(jié)點依據(jù)偏移量提供緩沖區(qū)數(shù)據(jù)給從節(jié)點,確保主從節(jié)點數(shù)據(jù)一致狂秘,主從復制流程恢復正常骇径。

命令傳輸階段

<font style="color:rgb(51,51,51);">數(shù)據(jù)同步階段完成后,主從節(jié)點進入命令傳輸階段者春;</font>

<font style="color:rgb(51,51,51);">在這個階段主節(jié)點將自己執(zhí)行的寫命令發(fā)送給從節(jié)點破衔,從節(jié)點接收命令并執(zhí)行,從而保證主從節(jié)點數(shù)據(jù)的一致性碧查。 </font>

<font style="color:rgb(51,51,51);">在命令傳輸階段运敢,除了發(fā)送寫命令,主從節(jié)點還維持著心跳機制:PING和REPLCONF ACK忠售。 心跳機制對于主從復制的超時判斷传惠、數(shù)據(jù)安全等有作用。</font>

  1. 主節(jié)點向從節(jié)點發(fā)送ping命令

<font style="color:rgb(51,51,51);">每隔指定的時間稻扬,</font><font style="color:rgb(51,51,51);">主節(jié)點會向從節(jié)點發(fā)送PING命令</font><font style="color:rgb(51,51,51);">卦方,這個PING命令的作用,主要是為了讓從節(jié)點進行網(wǎng)絡超時判斷泰佳。 PING發(fā)送的頻率由 repl-ping-slave-period 參數(shù)控制盼砍,單位是秒,默認值是10s逝她。 </font>

:::tips
?? 關于該PING命令究竟是由主節(jié)點發(fā)給從節(jié)點浇坐,還是從節(jié)點發(fā)到主節(jié)點,有一些爭議黔宛;

因為在Redis的官方文檔中近刘,對該參數(shù)的注釋中說明是從節(jié)點向主節(jié)點發(fā)送PING命令,如下所

示:

:::

# Slaves send PINGs to server in a predefined innterval.It'spossibletochange
#this interval with the repl_ping_slave_period option.Thedefault value is 10
#seconds.
#
# repl-ping-slave-period 10

:::tips
但是通過源碼可以看到, PING命令是主節(jié)點會向從節(jié)點發(fā)送.

可能的原因是:代碼的迭代和注釋的迭代觉渴,沒有完全同步介劫。 可能早期是從發(fā)給主,后面改成了主

發(fā)從案淋,而并沒有配套修改注釋座韵。

從理論層面看,大部份組件的集群模式都是一主多副本踢京,通信方式也是從節(jié)點請求主節(jié)點誉碴,主從節(jié)點耦合度更低,是否同步漱挚、何時同步都由從節(jié)點控制翔烁。

從實際效果來看,應該主節(jié)點發(fā)到從節(jié)點這種方案更好一些旨涝,因為命令延遲更低蹬屹,同步速度更快。

:::

  1. 從節(jié)點向主節(jié)點發(fā)送REPLCONF ACK命令

<font style="color:rgb(51,51,51);">在命令傳播階段白华,</font><font style="color:rgb(51,51,51);">從節(jié)點會向主節(jié)點發(fā)送REPLCONF ACK命令慨默,</font><font style="color:rgb(51,51,51);">頻率是每秒1次; 命令格式為:REPLCONF ACK {offset}弧腥,其中offset指從節(jié)點保存的復制偏移量厦取。 </font>

<font style="color:rgb(51,51,51);">REPLCONF ACK命令的作用包括: </font>

  1. <font style="color:rgb(51,51,51);">實時監(jiān)測主從節(jié)點網(wǎng)絡狀態(tài):該命令會被主節(jié)點用于復制超時的判斷。此外管搪,在主節(jié)點中使用info Replication虾攻,可以看到其從節(jié)點的狀態(tài)中的lag值,代表的是主節(jié)點上次收到該REPLCONF ACK命令的時間間隔更鲁,在正常情況下霎箍,該值應該是0或1,: </font>
  2. <font style="color:rgb(51,51,51);">檢測命令丟失:從節(jié)點發(fā)送了自身的offset澡为,主節(jié)點會與自己的offset對比漂坏,如果從節(jié)點數(shù)據(jù)缺失 (如網(wǎng)絡丟包),主節(jié)點會推送缺失的數(shù)據(jù)(這里也會利用復制積壓緩沖區(qū))媒至。 </font>

:::tips
?? <font style="color:rgb(119,119,119);"> </font>**offset和復制積壓緩沖區(qū)顶别,不僅可以用于部分復制,也可以用于處理命令丟失等情形拒啰;區(qū)別在于前者是在斷線重連后進行的驯绎,而后者是在主從節(jié)點沒有斷線的情況下進行的。 **

:::

  1. <font style="color:rgb(51,51,51);">輔助保證從節(jié)點的數(shù)量和延遲:Redis主節(jié)點中使用min-slaves-to-write和min-slaves-max-lag參 數(shù)谋旦,來保證主節(jié)點在不安全的情況下不會執(zhí)行寫命令条篷;所謂不安全骗随,是指從節(jié)點數(shù)量太少,或延遲過 高赴叹。</font>

:::tips
?? 例如min-slaves-to-write和min-slaves-max-lag分別是3和10,含義是如果從節(jié)點數(shù)量小于3個指蚜,或所有從節(jié)點的延遲值都大于10s乞巧,則主節(jié)點拒絕執(zhí)行寫命令。而這里從節(jié)點延遲值的獲取摊鸡,就是通過主節(jié)點接收到REPLCONF ACK命令的時間來判斷的绽媒,即前面所說的info Replication中的lag值。

:::

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布免猾!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是辕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猎提,更是在濱河造成了極大的恐慌获三,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锨苏,死亡現(xiàn)場離奇詭異疙教,居然都是意外死亡,警方通過查閱死者的電腦和手機伞租,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門贞谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葵诈,你說我怎么就攤上這事裸弦。” “怎么了作喘?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵理疙,是天一觀的道長。 經(jīng)常有香客問我徊都,道長沪斟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任暇矫,我火速辦了婚禮主之,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘李根。我一直安慰自己槽奕,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布房轿。 她就那樣靜靜地躺著粤攒,像睡著了一般所森。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夯接,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天焕济,我揣著相機與錄音,去河邊找鬼盔几。 笑死晴弃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逊拍。 我是一名探鬼主播上鞠,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芯丧!你這毒婦竟也來了芍阎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缨恒,失蹤者是張志新(化名)和其女友劉穎谴咸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肿轨,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寿冕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椒袍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驼唱。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驹暑,靈堂內(nèi)的尸體忽然破棺而出玫恳,到底是詐尸還是另有隱情,我是刑警寧澤优俘,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布京办,位于F島的核電站,受9級特大地震影響帆焕,放射性物質(zhì)發(fā)生泄漏惭婿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一叶雹、第九天 我趴在偏房一處隱蔽的房頂上張望财饥。 院中可真熱鬧,春花似錦折晦、人聲如沸钥星。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谦炒。三九已至贯莺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宁改,已是汗流浹背缕探。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留还蹲,地道東北人撕蔼。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秽誊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子琳骡,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本篇主要分三部分討論Redis主從復制的實現(xiàn)原理:主從復制過程锅论、狀態(tài)機、源碼解析楣号。Redis從節(jié)點使用了狀態(tài)機機制...
    JBryan閱讀 779評論 0 0
  • 一最易、Redis主從復制 主從復制:主節(jié)點負責寫數(shù)據(jù),從節(jié)點負責讀數(shù)據(jù)炫狱,主節(jié)點定期把數(shù)據(jù)同步到從節(jié)點保證數(shù)據(jù)的一致性...
    愛情小傻蛋閱讀 946評論 0 0
  • 在Redis的持久化中曾提到藻懒,Redis高可用的方案包括持久化、主從復制(及讀寫分離)视译、哨兵和集群嬉荆。其中持久化側(cè)重...
    不變甄心閱讀 1,494評論 0 5
  • 什么是Redis的主從復制 主從復制,是指將一臺Redis服務器的數(shù)據(jù)酷含,復制到其他的Redis服務器鄙早。前者稱為主節(jié)...
    莫小鵬閱讀 557評論 0 1
  • 1 主從復制概述 主從復制,是指將一臺Redis服務器的數(shù)據(jù)椅亚,復制到其他的Redis服務器限番。前者稱為主節(jié)點(mas...
    MiniSoulBigBang閱讀 296評論 0 0