Redis 集群中的数据同步

86 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

集群中的数据同步

Redis通常以集群的方式搭建,集群中有一个master节点和若干slave节点,主从节点需要进行数据同步。同步方式分为全量同步和增量同步,slave节点请求同步发送replicaof命令,该命令中包含了 replication idoffset 两个标识

  • replication id:每个master有唯一的id,以它为主节点的集群中,slave会继承这个master的replication id
  • offset:表示同步数据的偏移量,如果slave中的offset小于master中的offset,就需要同步数据

如果是刚加入集群的slave节点,请求中的replication id和master的不同,那么执行的是第一次同步(全量同步)

简述全量同步的流程

  1. slave向master发送同步请求

    1. slave节点请求同步,master节点判断replid不一致,返回主节点的replid和offset
  2. master生成RDB文件发送给slave

    1. master节点执行BGSAVE命令生成RDB,将RDB发送给slave
    2. slave清空本地数据,加载master的RDB
  3. 发送生成RDB期间的命令日志给slave

    1. master将生成RDB期间的命令记录在repl_baklog,发送给slave
    2. slave执行接收到的命令,保持与master的同步

image.png

如果是slave节点重启,那么执行增量同步

  1. slave向master请求同步

    1. slave请求同步,master判断replid和offset一致
  2. 发送命令日志给slave

    1. 根据offset获取需要同步的命令发送给slave

image.png

  • 关于repl_baklog日志的覆盖

    repl_baklog日志中新写入的数据会覆盖最早的数据,因此如果offset标记的数据已经被覆盖,无法进行增量同步,会进行全量同步

优化主从集群的方式

  • 在master中配置 repl-diskless-sync yes ,生成的RDB文件不会落入磁盘,直接放到网络IO流

  • redis单节点的内存上限不要太高,减少RDB文件的大小

  • 适当提高repl-baklog的大小,尽量避免全量同步

  • 采用主-从-从链式结构,减少master数据同步的压力

image.png