Redis 数据同步机制 -- 主从模式

用户头像
是老郭啊
关注
发布于: 2020 年 09 月 07 日

开篇问题:

1.主从模式是什么

2.主从模式解决什么问题



大家都知道 Redis是具有高可靠性的 k-v数据库,那么什么是高可用性呢,主要有两点,1⃣️是尽量减少数据丢失,这个持久化中 AOF 和 RDB的已经对此做了保证,2⃣️是服务尽量少中断,这个就是今天我们要学习的主从 模式,增加副本冗余量来保证服务尽可能少中断。

Redis 提供了主从库模式,以保证数据副本的一致性,主从库读写分离。



主从库进行第一次同步步骤:



  1. 从库和主库建立链接,并告诉主库即将进行同步,向主库发送 psync runID offset 命令,由于第一次连接,并不知道主库的 runID,且为第一次复制,没有偏移量,因此发送 psync ? -1

  2. 主库收到 psync命令后会用 FULLRESYNC runID offset 发送作为响应, 此时的 offset表示目前复制进度,于是主库开始全量复制数据给从库(使用 bgsave 生成 RDB文件,并将文件发送给从库),此时从库先清除自身数据库,然后再加载 RDB文件。但是,在加载 RDB文件的过程中,客户端也还是可以对主库进行写操作,不然会造成一定时间对阻塞,那主库怎么保证从库数据的一致性呢。

  3. 为了保证主库在全量复制数据给从库的过程中,主库可以正常接受客户端请求,并保证主从库的数据一致性,主库会在内存中专门的 replication buffer记录生成 RDB文件后收到的所有写操作。主库会把第二阶段执行过程中新收到的写命令再次发送给从库。

主从级联模式

一次从库同步主库的整个过程中,我们可以分析出来,主要影响主库性能的操作为 生成 RDB文件(fork 瞬间会造成阻塞) 和 传输 RDB文件。如果从库数据很多,那主库大部分压力来源于自身的 fork 和网络带宽。于是诞生出 “主-从-从”模式。



主从库间网络断开

当主从库断开连接后,主库会把断连期间收到的写操作命令,写入 replication buffer,同时也会把这些操作命令写入到 repl_backlog_buffer 这个缓冲区。repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置,若在增量复制阶段, repl_backlog_size 参数配置过小,导致从库的复制进度赶不上主库,偏移量已经超过环形的总量,从库则需要进行全量复制来保证数据的一致性。

用户头像

是老郭啊

关注

一位头发日渐稀疏的 90后 IT男 2020.04.07 加入

当你焦虑大于努力时,你将沦为焦虑本身。

评论

发布
暂无评论
Redis 数据同步机制--主从模式