Redis学习笔记-主从库如何实现数据同步一致

文章目录

  • Redis学习笔记-主从库如何实现数据同步一致
      • 1.笔记图
      • 2.读写分离
      • 3.第一次同步
        • 3.1 replicaof 命令
        • 3.2 三个阶段
      • 4.主-从-从模式
      • 5.主从库之间断网解决方案
        • 5.1 repl_back_buffer 记录失联后数据
        • 5.2 网络恢复后
        • 5.3 环形缓冲区(repl_backlog_buffer)大小设置

Redis学习笔记-主从库如何实现数据同步一致

通常说 Redis 具有高可靠性,主要是指 数据尽量少丢失服务尽量少中断,其中 数据尽量少丢失 可以由 AOF 日志和 RDB 内存快快照来解决,而服务尽量减少中断就需要使用 备库了,这篇文章学习一下 主从数据一致性 原理。

1.笔记图

Redis学习笔记-主从库如何实现数据同步一致_第1张图片

2.读写分离

Redis学习笔记-主从库如何实现数据同步一致_第2张图片

  • 读操作:主库、从库都可以读数据
  • 写操作:首先到主库执行,主库再将写操作同步给从库
  • 所有数据的修改只会在主库上进行,不用协调其他实例

3.第一次同步

3.1 replicaof 命令
# 实例1(ip:192.168.19.13) 实例2(ip:192.168.19.14)
replicaof 192.168.19.13

Tips:实例 2 就变成实例 1 的从库。

3.2 三个阶段

Redis学习笔记-主从库如何实现数据同步一致_第3张图片

  • 第一阶段:从库和主库建立起连接,并告诉主库即将进行同步,主库确认后会回复,主从库之间就可以开始同步了。
  • 第二阶段:主库将所有数据同步给从库,从库收到数据后,在本地完成数据加载,这个过程依赖于 RDB 快照文件,主库执行 bgsave 命令,生成 RDB 文件,接着将文件发送给从库,从库接收到 RDB 文件后,会先清空当前数据库,然后加载 RDB 文件。为了保证主从数据一致性,同步期间主从库会在内存中用专门的 replication buffer,记录 RDB 文件生成后收到的所有写操作。
  • 第三阶段:主库会把第二阶段执行过程中新收到的写命令,再发送给从库,从库再重新执行这些操作。

4.主-从-从模式

Redis学习笔记-主从库如何实现数据同步一致_第4张图片

  • 通过主-从-从模式将主库生成 RDB 和传输 RDB 的压力,以级联的方式分散到从库上
  • 基于长连接的命令传播,一旦主库完成了全量复制,它们之间就会一直维护一个网络连接,主库会通过这个连接将后续收到的命令操作再同步给从库

5.主从库之间断网解决方案

5.1 repl_back_buffer 记录失联后数据

Redis学习笔记-主从库如何实现数据同步一致_第5张图片

  • 当主从库断连后,主库会把断连期间收到的写操作命令,写入 replication buffer,同时也会把这些操作命令也写入 repl_backlog_buffer 这个缓冲区
  • repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置
  • master_repl_offset:在缓冲区中的写位置会逐步偏离起始位置
  • slave_repl_offset:从库已复制的偏移量
5.2 网络恢复后

Redis学习笔记-主从库如何实现数据同步一致_第6张图片

  • 从库首先会给主库发送 psync 命令,并把自己当前的 slave_repl_offset 发给主库
  • 主库会判断自己的 master_repl_offsetslave_repl_offset 之间的差距
  • 主库只用把 master_repl_offsetslave_repl_offset 之间的命令操作同步给从库就行
  • 若主库的写位置已经覆盖了从库读位置,从库就会进行全量备份
5.3 环形缓冲区(repl_backlog_buffer)大小设置
  • 如果从库的读取速度比较慢,就有可能导致从库还未读取的操作被主库新写的操作覆盖了,这会导致主从库间的数据不一致。
  • repl_backlog_size
  • 缓冲空间大小 = 主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小
  • 在实际应用中,考虑到可能存在一些突发的请求压力,即 repl_backlog_size = 缓冲空间大小 * 2
  • 举例:如果主库每秒写入 2000 个操作,每个操作的大小为 2KB,网络每秒能传输 1000 个操作,那么,有 1000 个操作需要缓冲起来,这就至少需要 2MB 的缓冲空间,为了应对可能的突发压力,最终把 repl_backlog_size 设为 4MB
  • 如果并发请求量非常大,连两倍的缓冲空间都存不下新操作请求的话,你可以根据 Redis 所在服务器的内存资源再适当增加 repl_backlog_size
  • 使用切片集群

扫码关注
在这里插入图片描述

你可能感兴趣的:(Redis,redis,nosql,mysql)