0
点赞
收藏
分享

微信扫一扫

redis夺命连环问5--主从库如何实现数据一致?谈谈你对主从复制的理解

编程练习生J 2022-02-04 阅读 41
redis

目录

主从库如何实现数据一致?谈谈你对主从复制的理解

redis 主从复制是啥?-What

主从复制:指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), 数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)。Redis的主从复制是异步复制,异步分为两个方面,一个是master服务器在将数据同步到slave时是异步的,因此master服务器在这里仍然可以接收其他请求,一个是slave在接收同步数据也是异步的。

读写分离保证高可用 Redis 提供了主从库模式,以保证数据副本的一致,
读操作:主库、从库都可以接收;
写操作:首先到主库执行,然后,主库将写操作同步给从库。
在这里插入图片描述

  • 为什么要采用读写分离的方式呢?
    如果不采用读写分离的方式,对于数据一致性的维护需要涉及到加锁、实例间协商是否完成修改等一系列操作的巨额的开销。

  • 主从库模式一旦采用了读写分离,所有数据的修改只会在主库上进行,不用协调三个实例。主库有了最新的数据后,会同步给从库,这样,主从库的数据就是一致的。

那主从库同步是如何完成的呢?-How

主从库间如何进行第一次同步?
在这里插入图片描述

  • 第一阶段是主从库间建立连接、协商同步的过程,主要是为全量复制做准备。在这一步,从库和主库建立起连接,并告诉主库即将进行同步,主库确认回复后,主从库间就可以开始同步了。
    psync 命令包含了主库的 runID 和复制进度 offset 两个参数。
  • 在第二阶段,主库将所有数据同步给从库。从库收到数据后,在本地完成数据加载。过程依赖于内存快照 RDB 。主库不会被阻塞,仍然可以正常接收请求。为了保证主从库的数据一致性,主库会在内存中用专门的 replication buffer,记录 RDB 文件生成后收到的所有写操作。
  • 第三个阶段,主库会把第二阶段执行过程中新收到的写命令,再发送给从库。

主从级联模式分担全量复制时的主库压力
两个耗时的操作:生成 RDB 文件和传输 RDB 文件。如果从库数量很多,而且都要和主库进行全量复制的话,就会导致主库忙于 fork 子进程生成 RDB 文件,进行数据全量同步。可以通过“主 - 从 - 从”模式将主库生成 RDB 和传输 RDB 的压力,以级联的方式分散到从库上。
在这里插入图片描述

要是主从库间的网络断连了,数据还能保持一致吗?

主从库会采用增量复制的方式继续同步。
全量复制是同步所有数据,而增量复制只会把主从库网络断连期间主库收到的命令,同步给从库。

  • 当主从库断连后,主库会把断连期间收到的写操作命令,写入 replication buffer,同时也会把这些操作命令也写入 repl_backlog_buffer 这个缓冲区。
    repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置。恢复时主库和从库之间相差的操作,在增量复制时,主库会把它们同步给从库。
    在这里插入图片描述
    在这里插入图片描述
    问题因为repl_backlog_buffer 是一个环形缓冲区,所以在缓冲区写满后,主库会继续写入,此时,就会覆盖掉之前写入的操作。
    如果从库的读取速度比较慢,就有可能导致从库还未读取的操作被主库新写的操作覆盖了,这会导致主从库间的数据不一致。
    解决可以根据 Redis 所在服务器的内存资源再适当增加 repl_backlog_size 值,比如说设置成缓冲空间大小的 4 倍,另一方面,你可以考虑使用切片集群来分担单个主库的请求压力。
举报

相关推荐

0 条评论