Redis 主从复制

Redis 的主从复制是指一个 Redis 实例(即主节点)可以将数据复制到一个或多个从节点,从节点从主节点获取数据并保持数据同步的过程。

简单来说,复制的流程为:

  • 开始同步:从节点通过向主节点发送 PSYNC 命令发起同步请求;
  • 全量复制:如果是第一次连接或者是之前的连接失效,从节点会请求全量复制,主节点将当前数据快照(即RDB文件)发送给从节点;
  • 增量复制:全量复制完成后,主从节点之间会保持一个长连接,主节点会通过这个连接将后续的写操作传递给从节点执行,来保证数据的一致。

Redis 的主从架构图可表示为:

主从架构可以实现读写分离。写操作可以请求主节点,而读操作只请求从节点,这样就减轻了主节点的压力。

整个主从集群仅主节点可以写入,其他从节点都是通过复制来同步数据,这样就能保证数据的一致性。并且把读请求分散到多个节点,提高了 Redis 的吞吐量,从一定程度上也提高了 Redis 的可用性。

Redis 节点之间主从复制主要有两种数据同步方式,分别是全量同步和增量同步。

全量同步

  • 从节点发送 psync ? -1 命令,触发同步(命令格式为 psync runid offset,runid 指 Redis 朱服务器的 run ID,由于从节点第一次同步是不知道主节点的 id,所以传递 ? ;offset 为复制进度,第一次同步值为 -1);
  • 主节点收到从节点的 psync 命令之后,发现 runid 值为 ?,判断是全量同步,此时返回给从节点 fullresync 命令并带上主服务器的 runid 和当前复制进度 offset,从服务器会存储这两个值;
  • 直接点执行 bgsave 命令生成 RDB 文件,在 RDB 文件生成过程中,主节点将新接收到的写入数据的命令会存储到 replication buffer 中;
  • RDB 文件生成之后,主节点将其发送给从节点,从节点清空旧数据,加载收到的 RDB 文件,同步数据;
  • 等到从节点将 RDB 文件加载完成之后,主节点会将 replication buffer 中缓存的数据发送给从节点,从节点执行命令,加载新的数据。

待同步完成之后,主从节点之间会保持一个长连接,主节点会通过这个连接将后续的写入操作传递给从节点来执行,从而保证数据的一致性。

增量同步

主从节点之间的网络可能会不稳定,如果连接断开,主节点的部分写操作未传递给从节点执行的话,就会导致主从数据不一致。此时有一种选择是再次发起全量同步,到那时由于全量同步的话数据量比较大,非常耗时,所以后来引入了增量同步,此时仅需采用增量同步的方法,把连接断开期间的数据同步给从节点就行。

基本过程为:服务器网络恢复后,会向主服务器再发送 psync 命令,此时 offset 不为 1,主服务器收到命令后,用 continue 响应命令告知从服务器采用增量复制同步数据。

增量复制时会使用到一个名为 repl_backlog_buffer 的缓冲区,主节点在将写请求发送给从节点的同时,会将其写入到 repl_backlog_buffer 缓冲区内。该缓冲区为一个环形缓冲区,默认大小为 1m。主节点在往该缓冲区内缓存写请求时,如果超过了 1m,会覆盖之前的数据。增量复制时如果从节点发送的 runid 和主节点一致,且 offset 还在 repl_backlog_buffer 中,则可以进行增量同步,于是就去 repl_backlog_buffer 中查找对应的 offset 之后的数据,写入到 replication buffer 中将其发送给从节点。从节点收到指令之后执行对应的命令,一次增量同步的过程就完成了。如果根据 offset 判断数据已经被覆盖了,此时只能触发全量同步,因此可以通过调整 repl_backlog_buffer 的大小,来尽量避免全量同步。

replication buffer 与 repl_backlog_buffer 的区别

因为不同的节点同步数据的速度不一样,主节点会为每个从节点都创建一个 replication buffer,它用于实时传输写命令,且大小是动态的,因为对于同步速度较慢的服务器,需要更多的内存来缓存数据。

repl_backlog_buffer 在主节点上只有一个,存储的是最近的写命令,用于从服务器重新连接时进行增量数据同步。

主从复制的优点:

  1. 降低数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式;
  2. 提供故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;
  3. 支持负载均衡:主从复制配合读写分离,主节点用于写命令,从节点用于读命令,写数据连接主节点,读数据连接从节点,可分担服务器负载。写少读多的场景下,多个节点分担读负载,提高 Redis 服务并发量。
  4. 高可用:主从复制是 Redis 高可用的基础,也是哨兵和集群实施的基础。
相关推荐
我们从未走散11 小时前
Redis学习笔记-----Redis内存回收
java·redis·笔记·学习
小小工匠13 小时前
Redis - 使用 Redis HyperLogLog 进行高效基数统计
redis·hyperloglog
@Jackasher15 小时前
Redis如何实现一个分布式锁?
redis·分布式·wpf
Volunteer Technology16 小时前
openresty-lua-redis案例
redis·lua·openresty
小李同学_LHY18 小时前
Redis一站式指南二:主从模式高效解决分布式系统“单点问题”
java·数据库·redis·缓存
JAVA学习通18 小时前
【redis初阶】------List 列表类型
数据库·redis·缓存
程序员JerrySUN1 天前
基于 RAUC 的 Jetson OTA 升级全攻略
java·数据库·redis
还是大剑师兰特1 天前
Redis面试题及详细答案100道(01-15) --- 基础认知篇
redis·大剑师·redis面试