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.178linux.com/2478

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

相关推荐

  • Linux基础知识(三)

     本文的主要内容是:  1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  2、取出最后登录到当前系统的用户的相关信息。  3、取出当前系统上被用户当作其默认shell的最多的那个shell。  4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全…

    Linux干货 2016-10-03
  • heartbeat实现高可用集群(2)

    [[ heartbeat v2 + crm ]] 环境 node1 192.168.1.35 node2 192.168.1.36 fip 192.168.1.81 daemon httpd ha web service ip httpd node1&2 # vim ha.cf crm on # cd # rpm -ivh heartbeat-gui…

    Linux干货 2017-11-03
  • iptables学习笔记   Netfilter:是Linux操作系统核心层内部的一个数据包处理模块。   Hook point:数据包在Netfilter中的挂载点。(PRE_ROUTIN   ,INPUT,OUTPUT,FORWARD,POST_ROUTING)   iptables 规则组成:四张表+五条链(Ho…

    Linux干货 2016-12-05
  • Linux磁盘管理(一)之分区、格式化、挂载使用

    磁盘管理(一)   本章节内容: 磁盘结构 分区类型   管理分区   管理文件系统   挂载设备   一、磁盘结构: 1、设备号码:  主设备号:major number, 标识设备类型 次设备号:minor number, 标识同一类型下的不同设备  &n…

    Linux干货 2016-08-26
  • Centos启动过程

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。 启动第二步--读取MBR 众所周知,硬盘上第0磁道第一…

    Linux干货 2017-03-30
  • 配额-and-RAID

    配置配额系统 控制单个用户,或组在某磁盘上所能占的最大空间大小 配额是基于磁盘分区的,不基于文件 如何基于软件控制配额:          1、设置分区挂载选项          &nbsp…

    Linux干货 2016-08-29