您的位置:首页 > 数据库 > Redis

(十)高并发redis学习笔记:redis主从复制原理、断点续传、无磁盘化复制、过期key处理

2021-04-24 23:33 585 查看


文章目录

  • 2、主从复制的断点续传
  • 3、无磁盘化复制
  • 4、过期key处理
  • 5、heartbeat和异步复制
  • [/ul]


    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。

    此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

    技术之路不在一时,山高水长,纵使缓慢,驰而不息。

    公众号:秦怀杂货店

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: