ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis主从数据同步原理

2022-08-28 11:32:36  阅读:213  来源: 互联网

标签:同步 slave buffer redis 复制 master RDB 从库 主从


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有