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 高可用的基础,也是哨兵和集群实施的基础。
相关推荐
摇滚侠2 小时前
2025最新 SpringCloud 教程,熔断规则-熔断策略-异常比例,笔记45
redis·笔记·spring cloud
姓蔡小朋友2 小时前
Redis内存回收
前端·数据库·redis
所得皆惊喜2 小时前
REDIS04_管道的概念、案列演示、管道总结
redis·缓存
爬山算法3 小时前
Redis(166)如何使用Redis实现实时统计?
java·redis·bootstrap
羑悻的小杀马特3 小时前
Stream消息队列+地理空间计算+HyperLogLog去重,SCAN安全遍历+RESP协议全解析,一文把它啃透!
数据库·redis·安全·缓存·空间计算·resp
JIAWAP3 小时前
Redis数据安全性分析之RDB详解
数据库·redis·分布式·缓存
黛琳ghz4 小时前
极速云原生:openEuler之Redis与Nginx部署性能实战
redis·nginx·云原生·操作系统·压力测试·openeuler·服务器部署
此生只爱蛋4 小时前
【Redis】浅谈数据结构和内部编码和单线程架构
数据结构·数据库·redis
奶油松果15 小时前
Springboot自动装配 - redis和redission
java·spring boot·redis
siriuuus16 小时前
Redis 安装、多实例部署、主从复制及 Cluster 实践
数据库·redis·centos