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

相关推荐

  • 模块式LAMP和fpm式LAMP实现wordpress

           Linux+Apache+Mysql/MariaDB+Perl/PHP/Python这一组合常用来搭建动态网站或者服务器的开源软件,随着开源潮流的蓬勃发展,开源的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件平台在软件方面的投资成本较低,,LAMP平台已经成为最强…

    Linux干货 2016-04-22
  • 文件权限

           文件权限 一.文件属性   如下图所示:rw- 属于所属主root。中间r–属于所属组root的。r–属于其他的(other)   文件属性的操作: 1.chown 设置文件的所有者 例:chown  li(用户)   f1(文件)…

    Linux干货 2016-08-08
  • 软件包管理

    1.程序包管理器 源代码–>目标二进制格式–>组织称为一个或有限几个“包”文件;     安装、升级、卸载、查询、校验 程序包管理器: debian(Ubuntu):dpt,工具:dpkg,程序包以“.deb”结尾 redhat:redhat package manager&nbsp…

    Linux干货 2016-08-21
  • CentOS6.7上编译安装php

    环境:CentOS6.7,minimal安装。 前提条件:安装了编译环境,安装了Apache/Nginx,安装了MySQL/MariaDB。具体安装见:http://www.178linux.com/16583    http://www.178linux.com/17497  1、解决依赖关系: 请配置好yum源(系统安装源及…

    Linux干货 2016-06-03
  • 马哥教育网络班20期 第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:工作于数据链路层,实现多个lan之间数据的转发,隔离冲突域,类似二层交换机。 集线器:工作于物理层,实现设备的接入,数据信号放大、中转,共享信道。把一个端口接收的所有信号向所有端口分发出去 二层交换机:工作于数据链路层,可连接多个lan,根据帧的mac来转发数据,隔离冲突域…

    Linux干货 2016-08-15
  • 计算机的组成及其功能

    计算机由运算器,控制器、存储器及输入、输出装置五部分组成。 第一,运算器(Arithmetical and Logical Unit),也称作算术逻辑单元,主要是对数据进行各种运算。 第二,控制器(Control Unit)是计算机的控制中心,协调各计算机各部分按照预先的目标和步骤有序的工作。控制器从存储器中逐条取出指令,分析每条指令规定的操作和所需数据的存…

    Linux干货 2016-09-17