redis主從復制(2)— replication buffer與replication backlog

1、redis主從復制過程
先不解釋replication buffer和replication backlog,而先看看redis主從復制的過程。

redis的主從復制分為兩個階段:

1)同步(sync rdb snapshot):slave復制master的某時間點(t)的全量數據,t為master接收到slave的sync命令后執行rdb bgsave的時間點。2.8增加psync,支持full resync和partial resync命令。master發送rdb文件到slave,slave讀取rdb把數據加載到內存。

2)命令傳播(commands propagation):同步時間點t后master上的數據更新到slave上, 發送的數據是redis的命令。

2、replication buffer的作用
redis的slave buffer(replication buffer,master端上)存放的數據是下面三個時間內所有的master數據更新操作。

1)master執行rdb bgsave產生snapshot的時間

2)master發送rdb到slave網絡傳輸時間

3)slave load rdb文件把數據恢復到內存的時間

replication buffer太小會引發的問題:

replication buffer由client-output-buffer-limit slave設置,當這個值太小會導致主從復制鏈接斷開。

1)當master-slave復制連接斷開,server端會釋放連接相關的數據結構。replication buffer中的數據也就丟失了,此時主從之間重新開始復制過程。

2)還有個更嚴重的問題,主從復制連接斷開,導致主從上出現rdb bgsave和rdb重傳操作無限循環。
查看[top redis headaches for devops – replication buffer]
因而推薦把slave replication buffer的hard/soft limit設置成512M

config set client-output-buffer-limit "slave 536870912 536870912 0"

3、replication backlog的出現

在2.8版本,redis使用了新的復制方式,引入了復制積壓緩沖(replication backlog)。
查看[Designing Redis replication partial resync]
1.png

上圖來自《redis設計與實現》
當主服務器進行命令傳播的時候,maser不僅將所有的數據更新命令發送到所有slave的replication buffer,還會寫入replication backlog。當斷開的slave重新連接上master的時候,slave將會發送psync命令(包含復制的偏移量offset),請求partial resync。如果請求的offset不存在,那么執行全量的sync操作,相當于重新建立主從復制。

4、區分replication buffer 和 replication backlog

1) replication buffer對應于每個slave,通過config set client-output-buffer-limit slave 設置。

2) replication backlog是一個環形緩沖區,整個master進程中只會存在一個,所有的slave公用。backlog的大小通過repl-backlog-size參數設置,默認大小是1M,其大小可以根據每秒產生的命令、(master執行rdb bgsave) +( master發送rdb到slave) + (slave load rdb文件)時間之和來估算積壓緩沖區的大小,repl-backlog-size值不小于這兩者的乘積。

參考資料:

[1] redis設計與實現(黃健宏)

[2] redis replication(http://redis.io/topics/replication)

[3] [Designing Redis replication partial resync](http://antirez.com/news/31)

轉自:http://mdba.cn/?p=804

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2478

(1)
s19930811s19930811
上一篇 2016-04-05
下一篇 2016-04-05

相關推薦

  • linux常用網絡配置

    網卡名稱:  網絡接口識別并命名相關的udev配置文件:    /etc/udev/rules.d/70-persistent-net.rules  卸載網卡驅動:    modprobe  -r e1000  裝載網卡驅動:    modprobe &nbs…

    Linux干貨 2016-09-06
  • Linux常見小知識點

    什么是Linux? Linux是一款支持多任務,多線程,多用戶的類Unix系統 Linux常見的發行版本 Redhat  Linux   Linux發行版中比較重要的一個版本,多用于企業,由Redhat公司提供收費技術支持和更新,其衍生版本有centos為免費版本 Debain linux      系統分為…

    Linux干貨 2017-03-26
  • bash功能特性五 重定向和管道

    一、管道     使用“|”符號來實現管道功能;管道可以實現在一行中處理使用管道符號連接的多個命令,后面的命令使用前面命令的輸出結果做為處理對象。 二、數據流重定向     數據輸入和輸出的類型:         標準輸入(std…

    Linux干貨 2015-04-21
  • bash中的算術運算及條件測試

    bash的算術運算 +, -, *, /, %取模(取余), **(乘方) 實現算術運算: (1) let var=算術表達式 (2) var=$[算術表達式] (3) var=$((算術表達式)) (4) var=$(expr arg1 arg2 arg3 …) (5) declare –i var = 數值 (6) echo ‘算術表達式’ …

    Linux干貨 2017-04-17
  • Linux Basics-Linux Bash歷史和其概念名詞解釋part1

    Linux Basics-Linux Bash歷史和其概念名詞解釋part1 閱讀本文你將知道:查看更多BashFAQ.pdf   Bash的歷史及其特性   Bash的如何工作   Bash的概念解釋   前提知識:      對linux有一定基礎而且了解Bash的…

    Linux干貨 2016-10-29
  • 02day-Linux基礎入門及簡單的命令了解

    Linux哲學思想: 1、一切皆文件;          把幾乎所有資源,包括硬件設備都組織為文件格式; 2、由眾多單一目的小程序組成;一個程序只實現一個功能,而且要做好;          組合小程…

    Linux干貨 2016-06-29
欧美性久久久久