当前位置: 首页 > news >正文

Redis - 解读三种方案实现Redis跨机房数据同步

文章目录

  • Pre
  • 概述
  • 1. 主从服务器模式
    • 实现原理
    • 优缺点与适用场景
  • 2. 代理服务器模式
    • 实现原理
    • 优缺点与适用场景
  • 3. 多活服务器模式
    • (1)业务层写入模式
    • (2)监听Redis变更事件模式
    • (3)伪装从服务器获取写入命令模式
    • (4)AOF日志信息同步模式
  • 方案选型对比
  • 实践建议
  • 总结

在这里插入图片描述


Pre

Redis-入门到精通

Redis进阶系列

Redis进阶 - Redis主从工作原理详解

Redis-18Redis主从同步

Redis-19Redis哨兵Sentinel模式-Centos6.5上3台主机1主2从3哨兵的配置及通过代码访问哨兵

Redis - 高可用实现方案解析:主从复制与哨兵监控

Redis - 三种Redis集群实现方案之_客户端分片

Redis - 三种Redis集群实现方案之_基于代理的分片


概述

随着业务规模不断扩大,多机房部署成为保障系统高可用性、容灾和低时延访问的重要手段。作为高性能内存数据库的Redis,其跨机房数据同步方案备受关注。本文将详细探讨业界常见的三种数据同步方案:主从服务器模式、代理服务器模式和多活服务器模式,分析各自的实现原理、优缺点以及适用场景,为系统架构设计提供参考。

1. 主从服务器模式

在这里插入图片描述

实现原理

在主从服务器模式中,通过伪装成一个从服务器(即伪从服务器)来利用Redis原生的PSYNC命令完成数据同步。

其基本流程如下:

  • 数据同步:通过实现一个数据同步模块,并且伪装成一个从服务器(伪从服务器),向主服务器发送PSYNC命令,获取全量RDB文件以及增量执行命令,对这些数据进行封装压缩、加密等一系列优化操作,并通过实现自有的数据通信协议进行传输,当另一个机房的同步服务接收到数据之后对其实现解压处理,并且加载到从服务器文件存储路径,同时将增量命令执行写入从服务器。
  • 同步服务高可用:通过一个注册中心来实现同步服务的故障发现,它们有主从备份,如果其中一个同步服务器宕机,可以拉起备用服务节点代替主同步服务。
  • Redis自身高可用:通过主从模式及哨兵模式来实现,哨兵检测到主服务器宕机后,会切换到从服务器来进行替代

种模式只能做到单向数据传输,无法实现数据的双活。

优缺点与适用场景

  • 优点
    • 利用原生PSYNC机制,技术实现相对简单。
    • 可对传输过程进行定制化优化(如压缩与加密)。
  • 缺点
    • 仅支持单向数据传输,无法满足双向数据同步需求。
  • 适用场景
    • 适用于灾备、备份场景或数据传输方向固定的应用。

常见实现包括阿里云Redis&MongoDB团队的 redis-shake 以及携程框架部门的 Xpipe


2. 代理服务器模式

在这里插入图片描述

实现原理

代理服务器模式在每个Redis节点前部署一层代理,该代理层负责拦截所有写入请求并实现数据的转发与同步:

  • 上层业务无需感知数据同步逻辑,所有数据写入同时传递到本地Redis和其他机房的节点。
  • 数据同步通过代理自动完成,保持机房内外数据一致性。

优缺点与适用场景

  • 优点
    • 对业务层完全透明,无需改动应用代码。
    • 自动实现机房内外的数据同步。
  • 缺点
    • 每个节点需要额外部署代理,增加了运维管理复杂性。
    • 写入性能较原生Redis有所下降,尤其是节点数量增加时。
    • 同步策略不够灵活,无法针对性选择部分数据进行同步。
  • 适用场景
    • 适用于对业务透明性要求高、对性能影响可控的场景。

Netflix开源的 Dynomite 是这种模式的代表性实现。


3. 多活服务器模式

多活服务器模式旨在实现跨机房的双向数据写入,即各机房的Redis均可同时读写。常见的实现方式主要有以下几种:

(1)业务层写入模式

在这里插入图片描述

  • 原理:业务在写入Redis的同时,将数据同步写入消息队列,由消息队列自带的机房同步机制实现跨机房数据传递。
  • 优缺点
    • 优点:实现简单、直观。
    • 缺点:对业务有较强侵入性,不同业务间难以共享同步组件。

(2)监听Redis变更事件模式

在这里插入图片描述

  • 原理:利用Redis的数据变更监听机制捕捉写操作,通过消息队列完成数据同步。为防止循环复制,通常在数据中加入标记字段(如source)来区分数据来源。

在这种模式下,数据同步监听Redis的变更操作事件,机房1到机房2有同步,同时机房2到机房1也有同步,这样就会出现双向同步下数据循环复制的问题。那么如何解决这个问题呢?

可以采取添加数据源标记的方式来解决,例如添加source字段,通过该字段标记数据从哪个机房同步过来,如果机房1发现数据是从机房2同步过来的则接收,如果数据标记字段是机房1,说明产生了循环复制,则丢弃此次同步的数据。Redis 监听事件的模式的最大弊端在于处理的性能有限。由于Redis监听事件通知性能有限,因此使用这种模式需要谨慎评估线上数据对时延的容忍度,如果业务对时延的容忍度很低,那么这种模式不太适合。

  • 优缺点
    • 优点:独立于业务层,减少业务侵入性。
    • 缺点:Redis事件监听机制在高并发下性能有限,可能无法满足极低延时要求。

(3)伪装从服务器获取写入命令模式

在这里插入图片描述

  • 原理:与主从模式类似,通过伪装成从服务器获取全量RDB及增量命令。解析后,通过消息队列传递到目标机房,写入时可利用时间戳确保顺序正确,同时通过数据标记避免循环复制问题。

基于伪从服务器的Redis多活同步过程包含以下几点。

  • 拉取服务:伪装成一个Redis的从服务器(图3-17中的伪从服务器),并对主服务器发送PSYNC命令,发送这个命令之后,伪从服务器首先会获取到一个全量同步的RDB(Redis DataBase)文件,之后就依据runid offset获取增量操作的命令进行增量同步。

  • 解析服务:解析服务主要是解析RDB文件,RDB文件是以二进制格式存储的,按照文件存储的格式进行读取,RDB的文件格式以及解析在这里限于篇幅不详述,可以参考开源工具,推荐通过redis-rdb-tools来了解具体的解析逻辑。

  • 回放服务:回放服务是将已经解析的Redis命令写入目的Redis集群,这里有一个问题,由于采取消息队列(message queue,MQ)进行传输,并且是多活写入,因此存在数据回放的顺序问题,可以在写入消息队列的时候带上时间戳,通过时间戳的先后顺序进行覆盖。

  • 发送/接收服务:将解析后的数据写入消息队列,以及从消息队列接收数据传递给回放服务。另外消息队列多向同步仍然会遇到数据循环复制的问题,解决方案和前面介绍的一致,这里不赘述。

  • 优缺点

    • 优点:借助PSYNC机制,可以较容易实现数据同步。
    • 缺点:数据解析和命令回放流程较为复杂,存在性能瓶颈风险。

(4)AOF日志信息同步模式

在这里插入图片描述

  • 原理:利用Redis的AOF日志,每条操作日志扩展为包含全局唯一ID和逻辑时钟信息的操作记录。通过消息队列传递后,在目标机房利用CRDT(无冲突复制数据类型)策略进行数据合并,确保“exactly once”同步及数据最终一致性。

基于AOF的Redis多活实现方案要解决的一些核心问题如下。

  • 日志同步:把每一条AOF格式日志信息扩展为操作日志,以方便对操作信息的写入、对操作日志的同步,并保障同步操作是exactly once。-

  • 唯一标识:每条oplog包含一个全局唯一ID,ID又包含两部分,一部分是Redis实例ID,用于解决循环同步的问题,另一部分是递增数字,保证有序和唯一。

  • 数据最终一致性:操作日志包含逻辑时钟信息,在目标端Redis执行合并时,使用无冲突复制数据类型(conflict-free replicated data type,CRDT)策略解决数据一致性问题。

  • 优缺点

    • 优点:能有效保证数据一致性,适用于复杂的多活场景。
    • 缺点:实现过程较为复杂,对系统性能和设计要求较高。

阿里云ApsaraDB for Redis的多活实现便采用了类似方案。


方案选型对比

方案数据方向性能影响运维复杂度典型场景
主从模式单向灾备、读写分离
代理模式双向小规模多活
多活-伪从双向通用多活场景
多活-AOF同步双向强一致性要求场景

实践建议

  1. 防循环复制:所有方案需通过标记字段(如机房ID)过滤本地数据。
  2. 数据一致性:优先选择支持CRDT或时间戳覆盖的同步策略。
  3. 性能优化
    • 批量压缩传输降低网络开销
    • 异步回放减少写入延迟
  4. 监控体系:需建设同步延迟、数据差异等核心指标监控。

总结

  • 主从服务器模式:利用PSYNC实现数据单向传输,技术实现简单,适用于备份与灾备场景,但不支持双向数据同步。
  • 代理服务器模式:通过部署代理层实现数据透明同步,适合对业务无侵入要求的场景,但运维和性能上存在一定挑战。
  • 多活服务器模式:提供双向写入能力,通过业务层写入、事件监听、伪从服务器模式及AOF日志同步等多种方式实现数据同步,各有优缺点,需根据具体业务需求进行权衡。

以上各种模式的解决方案可以相互借鉴,例如消息的唯一标识、数据防止循环复制、数据最终一致性处理等。数据同步通道也不一定是消息队列,本节只是为了大家理解和使用方便,因此以消息队列来说明,原则上任意数据传输服务(data transmission service,DTS)都是可行的

随着Redis 7.0推出的ACL增强和复制协议优化,未来跨机房同步将朝着更安全、更高效的方向持续演进。

在这里插入图片描述

相关文章:

  • QT-绘画事件
  • AutoGen学习笔记系列(七)Tutorial - Managing State
  • JAVA编程【jvm垃圾回收的差异】
  • PHP之特性
  • LLM-ESR实验代码讲解
  • 蓝桥与力扣刷题(蓝桥 旋转)
  • 学习笔记-AMD CPU 命名
  • 分库分表 MyBatis的拦截器(Interceptor)在 SQL 执行前动态修改表名
  • 系统架构评估中的重要概念
  • java数据结构_再谈String_10
  • 索引(MySQL)
  • C# iText 抽取PDF页特定区域文本内容
  • MySQL:MySQL的数据类型
  • Autojs无线连接vscode方法
  • 【JAVA架构师成长之路】【持久层】第2集:SQL常用优化手段
  • 高精算法的用法及其优势
  • PHP之数组
  • Java 多线程
  • 初识Qt · 信号与槽 · 基础知识
  • 计算机视觉算法实战——图像分割(主页有源码)
  • 重庆无障碍网站建设/政府免费培训面点班
  • 王爷请休了我/厦门seo蜘蛛屯
  • 巫山做网站那家好/舆情分析网站
  • asp手机网站/在线网站seo诊断
  • 做JSP网站买什么书/搜索引擎排名优化seo课后题
  • 做网站的难点是什么/西安网络公司