(十)高并发redis学习笔记:redis主从复制原理、断点续传、无磁盘化复制、过期key处理
  TEZNKK3IfmPf 2023年11月13日 17 0

1、主从架构的核心原理

主从架构的复制同步主要有两种,一种是全量复制,一种是增量复制。

(1)slave node启动,仅仅保存master node的信息,包括master node的host和ip,但是复制流程没开始
master host和ip是从哪儿来的,redis.conf里面的slaveof配置的
(2)slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现,就跟master node建立socket网络连接
(3)slave node发送ping命令给master node
(4)口令认证,如果master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证
(5)master node第一次执行全量复制,将所有数据发给slave node,到这里才是开始全量复制
(6)master node后续持续将写命令,异步复制给slave node

1.1 全量复制

一般发生在slave初始化的时候,也就是刚刚连接上master,这个时候需要同步所有数据。

  • 1.slave启动的时候,第一次请求全量复制,会给master 发送一个PSNYC
  • 2.msater接收到PSYNC命令之后,由于是全量复制,所以是触发一次full resynchronization,使用BGSAVE命令(启动另一个后台线程)生成RDB文件,同时也会接收新的命令,把之后所有的写命令都放到缓冲区,也就是内存中。
  • 3.master执行完BGSAVE命令之后,会将这个RDB快照文件发送给slave,如果rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,可以适当调节大这个参数,对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s。发送期间继续接收数据,也是写到缓冲区。
  • 4.slave接收到快照文件之后,会丢掉之前的旧数据,加载新的快照文件到内存中。
  • 5.master发送完快照之后,会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
  • 6.slave加载完RDB快照文件之后,开始接收命令请求,同时会执行master缓存区的写命令。如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。

master node有一个backlog,默认是1MB大小
master node给slave node复制数据时,也会将数据在backlog中同步写一份
backlog主要是用来做全量复制中断的增量复制的

1.2 增量复制

增量复制一般指slave和master已经稳定正常工作了,master会不断把自己的写操作,同步到slave上。
slave node如果跟master node有网络故障,断开了连接,会自动重连。重连会接着之前的地方继续复制,master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB,msater就是根据slave发送的psync中的offset来从backlog中获取数据的。

2、主从复制的断点续传

从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

master node会在内存中常见一个内存缓冲区(in-memory backlog),master和slave都会保存一个复制偏移量(replication offset)和master run id,当连接断开时,slave会重新连接上master,然后请求继续复制,假如主从服务器的两个master run id相同,并且指定的偏移量在内存缓冲区中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步(在2.8版本之前就是直接进行完全重新同步)。
因为主运行id不保存在磁盘中,如果从服务器重启了的话就只能进行完全同步了。

master会在自身不断累加offset,slave也会在自身不断累加offset
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset

3、无磁盘化复制

2.8.18版本以及之后,支持无磁盘复制,主要考虑有些磁盘速度比较慢,复制会给master造成很大压力,所以master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了。

repl-diskless-sync
repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来

4、过期key处理

slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。

5、heartbeat和异步复制

主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。
master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   27   0   0 redis用户
  TEZNKK3IfmPf   2024年05月31日   30   0   0 dataredis
  TEZNKK3IfmPf   2024年05月31日   27   0   0 awkredis
  TEZNKK3IfmPf   2024年04月19日   39   0   0 javarediskey
TEZNKK3IfmPf