Redis 数据同步机制 -- 主从模式
开篇问题:
1.主从模式是什么
2.主从模式解决什么问题
大家都知道 Redis是具有高可靠性的 k-v数据库,那么什么是高可用性呢,主要有两点,1⃣️是尽量减少数据丢失,这个持久化中 AOF 和 RDB的已经对此做了保证,2⃣️是服务尽量少中断,这个就是今天我们要学习的主从 模式,增加副本冗余量来保证服务尽可能少中断。
Redis 提供了主从库模式,以保证数据副本的一致性,主从库读写分离。
主从库进行第一次同步步骤:
从库和主库建立链接,并告诉主库即将进行同步,向主库发送 psync runID offset 命令,由于第一次连接,并不知道主库的 runID,且为第一次复制,没有偏移量,因此发送 psync ? -1
主库收到 psync命令后会用 FULLRESYNC runID offset 发送作为响应, 此时的 offset表示目前复制进度,于是主库开始全量复制数据给从库(使用 bgsave 生成 RDB文件,并将文件发送给从库),此时从库先清除自身数据库,然后再加载 RDB文件。但是,在加载 RDB文件的过程中,客户端也还是可以对主库进行写操作,不然会造成一定时间对阻塞,那主库怎么保证从库数据的一致性呢。
为了保证主库在全量复制数据给从库的过程中,主库可以正常接受客户端请求,并保证主从库的数据一致性,主库会在内存中专门的 replication buffer记录生成 RDB文件后收到的所有写操作。主库会把第二阶段执行过程中新收到的写命令再次发送给从库。
主从级联模式
一次从库同步主库的整个过程中,我们可以分析出来,主要影响主库性能的操作为 生成 RDB文件(fork 瞬间会造成阻塞) 和 传输 RDB文件。如果从库数据很多,那主库大部分压力来源于自身的 fork 和网络带宽。于是诞生出 “主-从-从”模式。
主从库间网络断开
当主从库断开连接后,主库会把断连期间收到的写操作命令,写入 replication buffer,同时也会把这些操作命令写入到 repl_backlog_buffer 这个缓冲区。repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置,若在增量复制阶段, repl_backlog_size 参数配置过小,导致从库的复制进度赶不上主库,偏移量已经超过环形的总量,从库则需要进行全量复制来保证数据的一致性。
评论