【Redis进阶】主从复制

目录

概念

主从复制架构

主从保证数据一致性

主从复制原理

全量复制

图解

执行步骤

增量复制

[repl_backlog_buffer 缓冲区从什么时候写入?](#repl_backlog_buffer 缓冲区从什么时候写入?)

图解

步骤

主从复制的配置

主从复制的优缺点

优点:

缺点:

主从复制的应用场景

读写分离:

数据备份:

高可用性:


概念

我们知道Redis的AOF和RDB数据持久化技术保证了在服务器重启的情况下也不会丢失数据(或者少丢)。但是如果数据是存储在单点服务器上,当服务器出现宕机情况下,由于数据恢复是需要时间,这个时间无法处理请求或者更严重的情况下,如果服务器硬盘出问题,那么会造成数据的无法恢复。因此为了避免这种单点故障带来的一系列问题,有了主从复制,就是把数据备份到不同的服务器上。

主从复制架构

  • 一主一从
  • 一主多从

主从保证数据一致性

有了架构,那么多个服务器之间是如何保证数据一致性的,对此,Redis提供了主从复制模式。

  • 主服务器可以读写
  • 从服务器一般都是读
  • 接受主服务器同步来的写操作命令

主从复制原理

先来认识一下几个概念

runid

每个 Redis 服务器在启动时都会自动生产一个随机的 ID 来唯一标识自己。

offset(偏移量)

当前数据的偏移量,例如执行一条指令后,产生一条数据后,会增大偏移量,从节点请求复制主节点的时候,会带上这个信息,让主节点从这个偏移量之后的数据返回给我。

全量复制

图解

执行步骤

  • 执行了 replicaof 命令后,从服务器就会给主服务器发送 psync 命令,表示要进行数据同步。psync携带runid和offset,如果第一次同步,传 ?和 -1
  • 主服务器收到 psync 命令后,会用 FULLRESYNC 作为响应命令返回给对方。并且这个响应命令会带上两个参数:主服务器的 runID 和主服务器目前的复制进度 offset。从服务器收到响应后,会记录这两个值。
  • 主服务器执行bgsave,生成RDB文件,在此期间生成的命令全部放到buffer中
  • 主服务器将生成的rdb文件,传输给从服务器
  • 从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件。
  • 在主服务器生成的 RDB 文件发送后,然后将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,然后从服务器重新执行这些操作。

增量复制

主从服务器在完成第一次同步后,就会基于长连接进行命令传播。

但是如果由于网络问题出现抖动或连接断开,则会导致主从复制不同步,所以当网络连接正常时,则主从之间将发生增量复制。

先来了解一下几个概念

  • repl_backlog_buffer ,是一个「环形」缓冲区,用于主从服务器断连后,从中找到差异的数据;
  • replication offset ,标记上面那个缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器使用 master_repl_offset 来记录自己「 」到的位置,从服务器使用 slave_repl_offset 来记录自己「」到的位置。

repl_backlog_buffer 缓冲区从什么时候写入?

在主服务器进行命令传播时,不仅会将写命令发送给从服务器,还会将写命令写入到 repl_backlog_buffer 缓冲区里,因此 这个缓冲区里会保存着最近传播的写命令。

网络断开后,当从服务器重新连上主服务器时,从服务器会通过 psync 命令将自己的复制偏移量 slave_repl_offset 发送给主服务器,主服务器根据自己的 master_repl_offset 和 slave_repl_offset 之间的差距,然后来决定对从服务器执行哪种同步操作:

  • 如果判断出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将采用增量同步的方式;
  • 相反,如果判断出从服务器要读取的数据已经不存在repl_backlog_buffer 缓冲区里,那么主服务器将采用全量同步的方式。

图解

步骤

  • 从节点向主节点发送psync命令携带已保存的runid和offset
  • 主节点判断runid是否和自己的id一致,如果不一致则执行全量同步
  • 主节点判断offset是否在环形缓冲区内,如果不在则执行全量同步
  • offset如果在环形缓冲区内,则执行增量同步

repl_backlog_buffer 缓行缓冲区的默认大小是 1M,并且由于它是一个环形缓冲区,所以当缓冲区写满后,主服务器继续写入的话,就会覆盖之前的数据。因此,为了避免在网络恢复时,主服务器频繁地使用全量同步的方式,我们应该调整下 repl_backlog_buffer 缓冲区大小,尽可能的大一些,减少出现从服务器要读取的数据被覆盖的概率,从而使得主服务器采用增量同步的方式。

主从复制的配置

配置 Redis 主从复制非常简单,只需要在从服务器的配置文件中指定主服务器的地址和端口即可。

XML 复制代码
# 从服务器的配置文件
replicaof 127.0.0.1 6379

主从复制的优缺点

优点

  1. 提高系统可用性:通过将数据复制到多个从服务器,系统能够在主服务器故障时继续提供服务,提升了整体的可靠性和可用性。

  2. 扩展读性能:从服务器可以处理读请求,这样可以扩展系统的读性能,尤其在读多写少的场景中。

  3. 简化数据备份:从服务器可以作为数据的热备份,简化了数据备份和恢复操作。

缺点

  1. 一致性问题:由于复制是异步的,可能会出现短暂的数据不一致性(主服务器和从服务器之间的数据延迟)。

  2. 延迟问题:从服务器的数据同步存在一定的延迟,尤其在高写入量的场景中,这种延迟可能会加剧。

  3. 无法分担写操作:写操作仍然需要通过主服务器来处理,因此主服务器的写入能力可能成为瓶颈。

主从复制的应用场景

读写分离

  • 主从复制允许将写操作定向到主服务器,而将读操作分散到多个从服务器上,从而实现读写分离,缓解主服务器的读压力。

数据备份

  • 从服务器保存着主服务器的数据副本,可以作为数据备份。当主服务器出现故障时,从服务器的数据可以用来恢复。

高可用性

  • 主从复制是 Redis 高可用性架构(如 Redis Sentinel 和 Redis Cluster)的基础。通过监控和自动故障转移,可以在主服务器故障时快速切换到从服务器。

Redis 的主从复制机制通过数据同步和读写分离,增强了系统的可用性和扩展性。它是 Redis 实现高可用性和读性能扩展的基础,也是构建复杂 Redis 集群的重要组件。在使用主从复制时,需要权衡数据一致性和系统性能之间的关系,并根据具体业务需求进行优化和配置。

相关推荐
爱吃烤鸡翅的酸菜鱼6 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
超奇电子11 分钟前
阿里云OSS预签名URL上传与临时凭证上传的技术对比分析
数据库·阿里云·云计算
惊涛骇浪、12 分钟前
SpringMVC + Tomcat10
java·tomcat·springmvc
神仙别闹23 分钟前
基于C#+SQL Server实现(Web)学生选课管理系统
前端·数据库·c#
墨染点香25 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
m0_6530313639 分钟前
PostgreSQL技术大讲堂 - 第97讲:PG数据库编码和区域(locale)答疑解惑
数据库·postgresql
ldj20201 小时前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿1 小时前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
会编程的林俊杰1 小时前
MySQL中的锁有哪些
数据库·mysql
cts6181 小时前
Milvus分布式数据库工作职责
数据库·分布式·milvus