redis主从复制和无限同步问题

一 主从复制

    主从复制,又称主从同步,分为增量同步和全量同步。增量同步slave会从master的复制积压缓存去中读取偏移数据,而全量同步,master会生成一个rdb文件,并传输给slave,slave会清空数据库,并从这个rdb文件重新导入数据。

二 全量同步的条件

以下情况从节点会做全量同步:

1. 备节点第一次连到主节点。

2. 节点重启,主节点runid会变,备节点runid会丢失,redis <4.0 会发生全量复制。

3. 复制积压未同步数据被部分冲掉,导致全量同步。

三 影响主从复制的两个参数

1 client-output-buffer-limit

有的client请求redis数据的时候,redis要返回给client的数据都会先被存储在output-buffer中,等所有信息都被传送完毕之后,再清除output-buffer中的数据。redis为了保护做了限制,这个配置可以查看redis的配置文件,或者通过config命令查看。

client-output-buffer-limit slave 256mb 64mb 60

这里对是客户端是slave的做限制

256mb 是一个硬性限制,当output-buffer的大小大于256mb之后就会断开连接

64mb 60 是一个软限制,当output-buffer的大小大于64mb并且超过了60秒的时候就会断开连接

2 repl-backlog-size(复制积压大小)

复制积压缓冲区是redis维护的固定长度环形缓冲队列(由参数repl-backlog-size设置,默认1MB),master的写入命令在同步给slaves的同时,会在缓冲区中写入一份(master只有1个积压缓冲区,所有slaves共享)。当redis复制中断后,slave会尝试采用psync, 上报原master runid + 当前已同步master的offset(复制偏移量,类似mysql的binlog file和position);如果runid与master的一致,且复制偏移量在master的复制积压缓冲区中还有(即offset >= min(backlog值),master就认为部分重同步成功,不再进行全量同步,否则进行全量同步。

四 全量同步流程

1、Redis 内部会发出一个同步命令,刚开始是 Psync 命令,Psync 表示要求 master 主机同步数据

2、主节点会向从机发送 runid 和 offset,因为 slave 并没有对应的 offset,所以是全量复制

3、从节点slave 会保存 主节点master 的基本信息 save masterInfo

4、主节点收到全量复制的命令后,执行bgsave(异步执行),在后台生成RDB文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令

5、主节点send RDB 发送 RDB 文件给从节点

6、发送缓冲区数据

7、刷新旧的数据,从节点在载入主节点的数据之前要先将老数据清除

8、加载 RDB 文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据的加载。

五 无限同步

当master和slave进行全量同步时,tps较高,对master进行大量的写操作,导致client-output-buffer-limit达到了设置的限制(超过缓存区大小或者达到大小并超时了),master和slave的长连接就会别强行断开。连接断开后从节点又再次请求master同步数据,但问题仍然存在,就会导致反复全量同步。

还有一种情况时写的tps较高,slave在加载rdb文件,slave会被阻塞,无法执行master同步过来的命令,复制积压缓冲区数据被冲掉,当加载完数据之后,slave向master发送 Psync 命令,由于复制积压数据被冲掉了,slave会再次请求同步数据。如此反复,导致无限同步。

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值