Redis跨机房集群怎么实现?有什么最佳方案和新进展?

文章导读
Redis 跨机房集群主要通过主从复制、代理模式或多活架构实现。最佳方案需结合业务场景,通常采用主从 + 哨兵或 Cluster 跨可用区部署,配合数据同步工具如 redis-shake、Xpipe 或自研双向同步方案。新进展包括基于原生 PSYNC 优化的双向同步工具及运维层强制约束主从节点分布,以保障容灾能力。关键在于平衡数据一致性、延迟与成本,避免单机房故障导致服务不可用,同时需解决跨机房网
📋 目录
  1. A Redis - 解读三种方案实现 Redis 跨机房数据同步
  2. B Redis 如何实现跨可用区的集群部署_合理打散同一分片的主从节点至不同机房提升容灾能力
  3. C 跨机房 redis 集群 redis 跨机房方案_cnolnic 的技术博客_51CTO 博客
  4. D redis 跨机房集群方案 redis 跨机房
  5. E FAQ
A A

Redis 跨机房集群主要通过主从复制、代理模式或多活架构实现。最佳方案需结合业务场景,通常采用主从 + 哨兵或 Cluster 跨可用区部署,配合数据同步工具如 redis-shake、Xpipe 或自研双向同步方案。新进展包括基于原生 PSYNC 优化的双向同步工具及运维层强制约束主从节点分布,以保障容灾能力。关键在于平衡数据一致性、延迟与成本,避免单机房故障导致服务不可用,同时需解决跨机房网络延迟带来的读写性能问题。

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

Redis - 三种 Redis 集群实现方案之_客户端分片 Redis - 三种 Redis 集群实现方案之_基于代理的分片 概述 随着业务规模不断扩大,多机房部署成为保障系统高可用性、容灾和低时延访问的重要手段。作为高性能内存数据库的 Redis,其跨机房数据同步方案备受关注。本文将详细探讨业界常见的三种数据同步方案:主从服务器模式、代理服务器模式和多活服务器模式,分析各自的实现原理、优缺点以及适用场景,为系统架构设计提供参考。1. 主从服务器模式衷 在主从服务器模式中,通过伪装成一个从服务器 (即伪从服务器) 来利用 Redis 原生的 PSYNC 命令完成数据同步。其基本流程如下:数据同步:通过实现一个数据同步模块,并且伪装成一个从服务器 (伪从服务器),向主服务器发送 PSYNC 命令,获取全量 RDB 文件以及增量执行命令,对这些数据进行封装压缩、加密等一系列优化操作,并通过实现自有的数据通信协议进行传输,当另一个机房的同步服务接收到数据之后对其实现解压处理,并且加载到从服务器文件存储路径,同时将增量命令执行写入从服务器。同步服务高可用:通过一个注册中心来实现同步服务的故障发现,它们有主从备份,如果其中一个同步服务器宕机,可以拉起备用服务节点代替主同步服务。Redis 自身高可用:通过主从模式及哨兵模式来实现,哨兵检测到主服务器宕机后,会切换到从服务器来进行替代 种模式只能做到单向数据传输,无法实现数据的双活。优缺点与适用场景 优点:利用原生 PSYNC 机制,技术实现相对简单。可对传输过程进行定制化优化 (如压缩与加密)。缺点:仅支持单向数据传输,无法满足双向数据同步需求。适用场景:适用于灾备、备份场景或数据传输方向固定的应用。常见实现包括阿里云 Redis&MongoDB 团队的 redis-shake 以及携程框架部门的 Xpipe。

Redis 如何实现跨可用区的集群部署_合理打散同一分片的主从节点至不同机房提升容灾能力

Redis 如何实现跨可用区的集群部署_合理打散同一分片的主从节点至不同机房提升容灾能力 不是必须跨机房部署,但不跨机房等于无容灾;主节点与其直属从节点绝不能同属一个可用区,需通过运维打标、DNS 域名映射、部署脚本校验 IP 归属等手段强制约束。Redis 集群主从节点必须跨机房部署吗?不是“必须”,但不跨机房就等于没做容灾。当整个机房断电或网络隔离时,如果主从都在同一个机房,redis-cli --cluster check 看起来健康,实际已完全不可用。关键判断依据是:主节点和它直属的从节点 (即 replica-of 指向它的那个)**绝不能共享同一可用区标签**。Redis 本身不识别“机房”概念,靠运维层打标 + 集群配置策略来约束。真实场景中,用 redis.conf 的 cluster-announce-ip 配合 DNS 或服务发现,把节点 IP 映射到带区域信息的域名 (如 redis-usw2a-01.example.com) 部署脚本里检查 CLUSTER NODES 输出,过滤出 master 行,再对每个 master 的 slave 节点查其 IP 归属——若同属 usw2-a 子网,立刻拒绝加入集群 别依赖 cluster-require-full-coverage no 来掩盖问题;它只影响读写拒绝逻辑,不解决脑裂风险 如何让 Redis 集群自动避开同机房选主?Redis 原生不支持基于机房的故障转移权重。所谓“自动”,其实是通过 cluster-node-timeout 和人工干预组合实现的妥协方案。真正起作用的是:在发生主节点宕机后,由运维系统 (非 Redis 自身) 扫描剩余从节点的机房标签,优先向跨机房的从节点发 CLUSTER FAILOVER TAKEOVER 指令。cluster-slave-validity-factor 设为 0 可跳过复制延迟校验,但会增加数据丢失风险;生产环境建议保留默认值 10,靠缩短 cluster-node-timeout(如设为 5000) 加速感知 从节点所在机器需预装轻量级探测脚本,定时上报自身所在机房 ID 到 Consul/Etcd;failover 触发器读这个值做决策 避免使用 redis-cli --cluster rebalance 自动均衡——它只看 slot 数量,完全无视物理位置 跨机房部署后延迟飙升、超时频发怎么办?跨机房带来的 RT 增加是刚性事实,不是配置能抹平的。重点不是“压低延迟”,而是让业务接受并适配这种延迟特征。SophNet 专业的 AI 开发工具平台,让 AI 集成变得简单高效。下载 典型表现是客户端报 READONLY You can't write against a read only replica 或 Connection refused,本质是客户端缓存了过期的拓扑,连到了刚升主但尚未完成 slot 迁移的节点。客户端必须开启 refreshPeriod(Lettuce) 或 refreshTriggersReconnect(Jedis),间隔建议 ≤cluster-node-timeout / 2 禁止在应用层做

跨机房 redis 集群 redis 跨机房方案_cnolnic 的技术博客_51CTO 博客

一、项目介绍 Rotter 是禧云自主研发的跨机房 Redis 双向同步解决方案 (下文简称为方案),具有零侵入、高吞吐量、低延时、高堆积能力等特点。当前版本支持 Sentinel 模式和单点模式 Redis 架构。从 2019 年 Q2 上线至今,服务于三个独立业务线,线上运行稳定,同步延时基本在 50ms 以内。1.1 系统架构 整个 Redis 跨机房双向同步系统分为三层:控制台 Manager 节点发现和数据传输层 (ZK+Redis) 数据同步层 Rotter 系统架构如图 1-1 图 1-1 其中,Manager 负责任务配置、数据展示、监控报警等,各机房独立部署;ZK 为跨机房集群,A 机房为 Leader 节点,B 机房为 Follow 节点。ZK 在方案中负责 Rotter 节点的注册发现和任务调度。多活 Redis 在方案中扮演数据队列的角色,降低了 Manager 和 Rotter 节点之间的耦合度。Rotter 是 Redis 同步任务的执行者,包含 replicator 和 sync 两个角色。replicator 是国人开源的基于 java 语言的 redis 主从协议实现者 redis-replicator,负责解析 redis 节点指令。sync 负责 redis 指令跨机房写入,处理同步回环,同步指令监控等。1.2 同步流程 Rotter 中采用链式处理同步数据,任何一个 Filter 返回失败,该指令将不会同步。链式流程如图 1-2 图 1-2 ParseEventFilter:格式化同步指令;生成指令回环校验 key;赋值指令所属 DB;过滤 Rotter 自身产生的指令 DBFilter:过滤掉不需要同步的 DB KeyFilter:过滤掉不需要同步的 KEY CircleSyncFilter:过滤掉回环指令和删除保护指令 MultiThreadFilter:多线程分发,提高同步效率 OvertimeFilter:经过队列积压,判断该指令是否已经过期 DeleteKeyFilter:生成删除保护 KEY RateLimitFilter:限流,包括带宽和指令数 SendTargetFilter:执行目标 redis 写入 MonitorFilter:监控和上报正在同步的指令 ComputeRateFilter:计算同步速率、带宽、队列积压长度等

Redis跨机房集群怎么实现?有什么最佳方案和新进展?

redis 跨机房集群方案 redis 跨机房

1、复制 通过执行 slaveof 让一个服务器去复制另一个服务器。1.1、旧版复制功能的实现 分为同步和命令传播两个操作:同步操作将从服务器数据库状态更新至主服务器当前所处的数据库状态;命令传播操作则用于在主服务器的状态被修改时导致主从服务器的状态出现不一致时,让主从服务器数据库重新回到一致状态。同步步骤 从服务器向主服务器发送 SYNC 命令;收到 SYNC 命令的主服务器执行 BGSAVE,在后台生成一个 RDB 文件,并使用一个缓冲区记录出现在开始执行的所有写命令 当主服务器的 BGSAVE 命令执行完毕,主服务器将 RDB 文件发送给从服务器,从服务器接收并载入这个 RDB 文件,将自己的数据库状态更新至主服务器执行 BGSAVE 命令时的数据库状态;主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器接收并执行写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态;命令传播 在同步操作执行之后,主从服务器的数据库将达到一致,但是这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能会被修改,导致主从服务器状态不再一致。主服务器会将自己执行的写命令发送给从服务器执行。旧版复制功能的缺点 初次复制;从服务器从来没有复制过任何主服务器,或者当前要复制的主服务器跟上一次复制的主服务器不一样;断线后重复制:命令传播阶段由于网络原因中断了复制,但是从服务器通过自动重连连上了主服务器,并继续复制主服务器;  在主从服务器断线期间,主服务器会执行少量写命令,这个数据量一般比整个数据库的数据量要少的多,为了让从服务器补足一小部分缺失的数据却要重新执行一次 SYNC 命令,做法非常低效;每次执行 SYNC 命令,主从服务器需要以下操作:主服务器需要执行 BGSAVE 来生成 RDB 文件,耗费大量的 CPU、内存、和磁盘 IO 资源;主服务器需要将自己的 RDB 文件发送给从服务器,会耗费从服务器大量的网络资源 (带宽和流量)。接收到 RDB 文件的从服务器需要载入 RDB 文件,在载入期间,从服务器会因为阻塞没办法处理命令请求;1.2、新版复制功能的实现 为了解决旧版复制功能在处理断线复制时的问题,redis 从 2.8 版本开始,使用 PSYNC 代替 SYNC 执行复制时的同步操作。PSYNC 具有完整重同步和部分重同步;完整重同步用于处理初次复制:和 SYNC 命令的执行步骤基本一致。部分重同步用于处理断线后重复制情况:断线后当从服务器重新连接主服务器时,主服务器将断开期间执行的写命令发送给从服务器。

FAQ

问:跨机房部署 Redis 最大的挑战是什么?

Redis跨机房集群怎么实现?有什么最佳方案和新进展?

答:最大的挑战是网络延迟增加导致读写性能下降,以及跨机房数据一致性的保障。跨机房带来的 RT 增加是刚性事实,需要业务适配这种延迟特征,同时需防止脑裂风险。

问:原生 Redis Cluster 是否支持跨机房容灾?

答:原生支持但需运维约束。Redis 本身不识别“机房”概念,需靠运维层打标 + 集群配置策略来约束主节点和从节点绝不能共享同一可用区标签,否则单机房故障会导致服务不可用。

Redis跨机房集群怎么实现?有什么最佳方案和新进展?

问:有哪些推荐的跨机房数据同步工具?

答:常见的实现包括阿里云 Redis 团队的 redis-shake、携程框架部门的 Xpipe 以及禧云自主研发的 Rotter 双向同步解决方案,它们支持基于 PSYNC 的优化和双向同步。