Redis 主从模式

主从模式

Redis高可用之服务,运行期间需要保证Redis服务尽量少中断。可以通过增加Redis实例的方式,将一份数据保存在多个实例上,一台实例出现故障,仍然有其他实例提高服务,维持了服务的高可用。
Redis提供了主从模式,并且采用读写分离的方式:

  • 写操作只能在主库,避免实例间的锁争夺,在主库操作之后再同步到从库即可。
  • 读操作可以在任意库进行。

主从同步过程

在Redis.conf中需要表明主从库,如果是从库的话,配置replicaof 、masterauth ,Redis 5.0 之前使用 slaveof。在主从实例启动后,从库会向主库发送创建连接请求,创建连接之后,会进行数据的同步。

  • 第一阶段,主从库建立连接,协商同步的过程。runId是每个Redis实例启动时随机生成的,用于唯一标识。offset为复制进度,-1表示第一次复制。FullReSync响应offset=-1,即第一次复制,为全量复制。
  • 第二阶段,主库将所有数据同步至从库。主库生成RDB文件,然后发送给从库,从库收到后,清空当前数据,将其载入内存。
  • 第三阶段,主库发送RDB文件生成后的收到的所有写操作。在生成RDB文件期间收到的写命令先存储在replication buffer中,之后再将其发送至从库,主从库之间维持一个长连接,用于新的写操作同步。

主从断连恢复

从Redis 2.8开始,主从断连之后再连接,会采用增量复制的方式继续同步。当主从库断连后,主库会把断连期间收到的写操作命令,写入replication buffer,同时也会把这些操作命令也写入 repl_backlog_buffer。 repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置。刚开始的时候,主从库读写位置在一起,为起始位置,随着主库不断接收新的写操作、从库不断接收主库同步命令,主从库读写位置会不断变化,对主库来说对应的偏移量为master_repl_offset,对从库来说为slave_repl_offset。

主从库连接恢复之后,从库向主库发起psync命令,并携带自己的slave_repl_offset。主库将两个偏移量之间的命令同步至从库即可。

主从问题

数据过期:Redis存在两种删除策略,一是惰性删除,当客户端查询对应的数据时,Redis应该判断该数据是否过期,过期则删除。二是定期删除,通过一个定时任务删除过期数据。
Redis3.2开始,通过从节点读取数据时,先判断数据是否过期,过期则不返回并且删除数据。

主从复制压力:如果数据量过大,全量复制阶段主节点 fork + 保存 RDB 文件耗时过大,从节点长时间接收不到数据触发超时,主从节点的数据同步同样可能陷入全量复制->超时导致复制中断->重连->全量复制->超时导致复制中断……的循环。此外,主节点单机内存除了绝对量不能太大,其占用主机内存的比例也不应过大:最好只使用 50% - 65% 的内存,留下 30%-45% 的内存用于执行 bgsave 命令和创建复制缓冲区等。

参考:https://time.geekbang.org/column/intro/100056701

posted @   cd_along  阅读(1075)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示