数据库
首页 > 数据库> > redis主从数据同步原理

redis主从数据同步原理

作者:互联网

what:

  redis高可用

    1、数据尽量不丢失;

    2、尽可能的提供服务;

    栗子:AOF 和 RDB 保证了数据持久化尽量不丢失;

      主从复制就是增加副本,一份数据保存到多个实例上。即使有一个实例宕机,其他实例依然可以持续服务;

 

  主从

    复制——为单向的,即:只能从主复制到从;

    读写指责——读:主从都可以读。 写:主库先执行,之后将些操作同步到从库。一般master提供写,slave提供读。

 

  client buffer

    Redis 和客户端通信也好,和从库通信也好,Redis 都分配一个内存 buffer 进行数据交互,客户端就是一个 client,从库也是一个 client,我们每个 client 连上 Redis 后,Redis 都会分配一个专有 client buffer,所有数据交互都是通过这个 buffer 进行的。

 

  RDB和AOF文件对比:

    a、RDB 文件是二进制文件,网络传输 RDB 和写入磁盘的 IO 效率都要比 AOF 高。
    b、从库进行数据恢复的时候,RDB 的恢复效率也要高于 AOF。

  

how:

  第一次全量复制

    分3个阶段:连接建立阶段(即准备阶段)-> 主库同步数据到从库阶段 -> 发送同步期间新写命令到从库阶段

 

     连接建立阶段:从库执行 replicaof(之前是slave of) 并发送 psync 命令,表示要执行数据同步,主库收到命令后根据参数启动复制。命令参数包含了:主库的 runID 和 复制进度 offset 。主库FULLRESYNC 响应表示第一次复制采用的全量复制,也就是说,主库会把当前所有的数据都复制给从库。

      runID:每个Redis 实例启动都会自动生成一个 唯一标识 ID(runID),第一次主从复制,还不知道主库 runID,参数设置为空;
      offset:记录复制进度偏移量,第一次复制为-1;

 

    数据同步:master 执行 bgsave命令生成 RDB 文件,并将文件发送给从库,同时主库为每一个 slave 开辟一块 replication buffer 缓冲区记录从生成 RDB 文件开始收到的所有写命令; slave收到 RDB 文件后保存到磁盘,并清空当前数据库的数据,再加载 RDB 文件数据到内存中;

 

    发送同步期间新写命令到从库:从节点加载 RDB 完成后,主节点将 replication buffer 缓冲区的数据发送到从节点,Slave 接收并执行,从节点同步至主节点相同的状态;

      replication buffer 缓冲区的数据:
        1)master 执行 bgsave 产生 RDB 的期间的写操作;
        2)master 发送 rdb 到 slave 网络传输期间的写操作;
        3)slave load rdb 文件把数据恢复到内存的期间的写操作;

      replication buffer注意:太小会导致主从复制连接断开,由 client-output-buffer-limit slave 设置。

 

  增量复制

    用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效(redis 2.8之后增加)。

    原理:repl_backlog_buffer。不管在什么时候 master 都会将写指令操作记录在 repl_backlog_buffer 中。因为内存有限, repl_backlog_buffer 是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容。master 使用 master_repl_offset记录自己写到的位置偏移量,slave 则使用 slave_repl_offset记录已经读取到的偏移量。

 

     

    增量同步如下:master 只需要把 master_repl_offset与 slave_repl_offset之间的命令同步给从库即可

      注意:一旦被覆盖就会执行全量复制-

+

 

标签:同步,slave,buffer,redis,复制,master,RDB,从库,主从
来源: https://www.cnblogs.com/sfzlstudy/p/16632435.html