【Redis主从架构】Redis replication详细流程及原理深度解析

文章目录

  • 一、Redis replication复制的完整流程
  • 二、Redis的断点续传和无磁盘化复制,全量复制
    • 1.断点续传
      • 1.1 offset
      • 1.2 backlog
      • 1.3 Master run idheartbeat
      • 1.4 heartbeat
    • 2.无磁盘化复制
    • 3. 全量复制
    • 4. 增量复制


一、Redis replication复制的完整流程

1 slave node启动之后,仅仅只会保存master node的信息,包括master node的host 和ip,但是复制流程还没有开始。
2 salve node 内部有个定时任务,每秒检查是否有master node要连接和复制,如果发现, slave node 就跟 master node 建立socket网络连接。
3 slave node 发送ping命令给master node。
4 口令认证,如果master 设置了 requiress,那么 salve node必须发送masterauth的口令过去进行认证。
5 slave node第一次连接到master,会执行全量复制,将所有数据发送给slave node
6 master node后续持续写命令,异步复制到slave node。
【Redis主从架构】Redis replication详细流程及原理深度解析_第1张图片

二、Redis的断点续传和无磁盘化复制,全量复制

1.断点续传

其实redis从2.8开始就支持主从复制的断点续传,即如果主从复制过程中,由于网络等原因断掉,那么可以接着上次复制的地方,继续复制下去。
而底层实现的机制就是通过在master 和slave中都保存的replica offset,offset是保存在backlog中的,如果master和slave网络连接断掉,slave会让master从上次的replica offset开始继续复制,但是如果没有找到offset,就会执行一次全量复制

1.1 offset

1)master和slave都会维护一个offset,两者都会在自身不断累加offset,
2)slave每秒都会上传offset给master,同时master也会保存每个slave的offset

1.2 backlog

master有一个backlog文件,默认是1mb,offset就是保存在backlog中的,backlog文件主要是用来做全量复制断开的增量复制

1.3 Master run idheartbeat

如果根据ip+host来定位master是不靠谱的,尤其当master重启或者数据发生变化的时候,那么slave应根据不同的run id区分,run id 不同就做全量复制

1.4 heartbeat

1)主从节点互相都会发送heartbeat信息
2)master 默认每隔10秒发送一次heartbeat,slave node每秒发送一个heartbeat。

2.无磁盘化复制

master在内存中直接创建rdb,然后发送给slave,不会再自己本地落地磁盘

3. 全量复制

1)master 执行 bgsave 命令,在本地生成一份rdb快照文件。
2)master node 将rdb快照文件发送到 salve node,如果rdb复制事件超过60s(repl-timeout),那么 slave node 就会认为复制失败,可以适当的调大这个参数。
3)对于千兆网卡的机器,一般一秒传输100MB文件,6G文件很可能超过60s秒,导致复制失败
4)master node 生成rdb时,会将所有新增的命令存储到内存中,在slave node 保存了rdb之后,再讲新的写命令复制给 slave node。
5)client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,新增的数据超过内存缓存区大小64MB,或者一次性到达256MB,那么停止复制,复制失败
6)如果slave node 开启了AOF,那么会立即执行BGRWRITEAOF,重新AOF。

4. 增量复制

1)如果复制过程中,master-slave网络连接中断,那么salve重新连接到master,是进行增量复制
2)master 直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog的大小是1MB
3) master 会根据salve发送的psync中的offset来从backlog中获取数据。

你可能感兴趣的:(#,分布式缓存,redis,分布式,java,网络,缓存)