1. 课程概述

本课程聚焦于一个高可用架构中的经典难题:当 Redis 发生故障转移(Failover)时,正在进行的异步导出任务如何安全、无感地切换到新的数据源。本章作为开篇,首先界定三个核心概念:故障转移场景、异步导出任务背景,以及数据源切换面临的主要挑战。

1.1 Redis 故障转移场景

在 Redis 高可用架构中,故障转移通常由哨兵(Sentinel)或集群(Cluster)机制触发。当主节点(Master)不可用时,系统自动将一个从节点(Replica)提升为新的主节点。这一过程虽然保证了服务的持续可用,但对正在执行的数据导出任务却可能造成严重干扰。

典型故障转移触发条件:
  • 主节点宕机或网络分区
  • 主节点响应超时(如哨兵配置的 down-after-milliseconds)
  • 主节点内存或 CPU 资源耗尽
  • 主节点主动下线进行维护

故障转移完成后,客户端需要重新发现新的主节点。对于异步导出任务而言,这意味着:

  • 原有的连接句柄失效
  • 正在进行的扫描游标(Cursor)可能指向旧节点
  • 数据一致性窗口可能被破坏
Redis 故障转移流程示意图 Redis 故障转移流程 主节点 (Master) 从节点 (Replica) 哨兵 (Sentinel) 主节点宕机 选举新主节点 新主节点上线 故障转移期间 导出任务连接中断

1.2 异步导出任务背景

异步导出任务是指从 Redis 中批量读取数据,经过处理后写入外部存储(如数据库、消息队列、对象存储)的后台作业。这类任务通常具有以下特征:

特征维度 说明 对故障转移的敏感度
扫描方式 使用 SCAN 命令分批迭代,维护游标状态 高 — 游标在故障转移后可能失效
数据一致性 弱一致性,允许短暂的数据不一致 中 — 需要保证最终一致性
执行时长 分钟级到小时级,跨越多个连接生命周期 高 — 故障转移可能发生在任务执行中
断点续传 需要记录已导出数据的偏移量或键范围 高 — 故障转移后需要恢复断点
幂等性 目标存储应支持重复写入的幂等处理 中 — 避免数据重复或丢失
典型异步导出任务示例: 从 Redis 缓存中导出用户会话数据到 MySQL 进行离线分析,使用 SCAN 0 MATCH session:* COUNT 1000 分批读取,每批处理后更新断点记录。

1.3 数据源切换的核心挑战

当 Redis 发生故障转移后,异步导出任务需要从旧主节点切换到新主节点。这一过程面临以下核心挑战:

  1. 连接中断与重建 — 旧连接失效,需要快速发现新主节点并建立新连接,同时避免连接风暴。
  2. 游标状态丢失 — SCAN 命令的游标是连接级别的,故障转移后游标无法复用,需要重新开始扫描或从断点恢复。
  3. 数据一致性窗口 — 故障转移期间,旧主节点可能还有未同步到从节点的数据,切换后可能丢失部分数据。
  4. 任务状态管理 — 导出任务的进度、断点、错误计数等状态需要持久化,不能仅保存在内存中。
  5. 切换时机与策略 — 是立即切换还是等待当前批次完成?是全部任务一起切换还是逐个切换?
数据源切换核心挑战示意图 数据源切换核心挑战 异步导出任务 数据源切换 连接中断与重建 旧连接失效,新连接发现 游标状态丢失 SCAN 游标无法复用 数据一致性窗口 未同步数据可能丢失 任务状态管理 进度/断点需要持久化 切换时机与策略 立即切换 vs 批次完成
关键认知: 故障转移后的数据源切换不是简单的连接替换,而是一个涉及状态恢复、一致性保证、任务编排的系统工程。本课程后续章节将逐一深入每个挑战的解决方案。

1.4 课程目标与学习路径

通过本课程,你将掌握:

  • Redis 故障转移的检测与通知机制
  • 异步导出任务的断点设计与持久化方案
  • 数据源切换的原子化操作与回滚策略
  • 生产环境下的高可用导出架构设计

课程从基础概念出发,逐步深入到代码实现与架构设计,适合有一定 Redis 使用经验的后端工程师、架构师及 SRE 人员。