区域宕机时保持在线:为 Python 应用打造的高可用 Redis

区域宕机时保持在线:为 Python 应用打造的高可用 Redis

💡 原文英文,约1400词,阅读约需6分钟。
📝

内容提要

Redis 发布 redis-py 的 MultiDBClient,为 Python 应用提供客户端地理故障转移。它包装普通或集群客户端,监控各区域端点健康,按权重选择主库,故障时自动切换,恢复后可选自动回切。数据同步由 Active-Active 的 CRDT 负责。支持断路器、健康检查、重试与可观测性,参数可按流量调优。

🔎

延伸解读

客户端地理故障转移的职责划分

MultiDBClient 只负责将流量路由到选定的活跃端点,并在端点不健康时按权重切换到其他健康端点。它不会跨端点广播命令或复制数据,数据同步完全由 Active-Active 数据库层的 CRDT 机制处理。这意味着应用无需自行实现健康监控、端点选择、故障转移和回切逻辑,但数据一致性仍依赖底层 Active-Active 的收敛速度。

故障检测的双重机制与权衡

MultiDBClient 结合了主动健康检查和被动 FailureDetector。健康检查定期探测所有端点,适合低流量场景;FailureDetector 基于滑动窗口观察命令成功与失败,适合高流量场景。健康检查策略(HEALTHY_ALL、HEALTHY_ANY、HEALTHY_MAJORITY)影响故障转移速度与误判容忍度,需根据应用对稳定性和快速切换的偏好选择。

参数调优需匹配流量特征

健康检查间隔、故障检测窗口和故障转移尝试次数等参数需按流量调整。高流量系统可让被动检测主导,健康检查作为慢速安全网;低流量系统则需更频繁的健康检查,并延长故障检测窗口以收集足够样本。故障转移尝试次数与延迟的乘积定义了所有端点不可用时的恢复窗口,延迟敏感型 API 应保持较短窗口,后台任务可容忍更长等待。

故障转移时的数据可见性风险

当活跃端点熔断并切换后,已在旧端点上执行中的命令无法重定向。如果这些写入成功,其结果可能不会立即通过新端点可见,直到 Active-Active 复制追上。应用需考虑这种短暂的数据不一致窗口,尤其是在故障转移后立即读取刚写入的数据时。全局重试策略会在每次重试前检查当前活跃端点,允许命令在新端点上重试。

❓

Q&A

MultiDBClient 是什么?它主要解决什么问题?

MultiDBClient 是 redis-py 提供的一个客户端 API,它包装了普通的单机或集群 Redis 客户端,为 Python 应用提供客户端地理故障转移能力。它负责健康监控、端点选择、故障转移和故障恢复,让应用在区域宕机时仍能保持在线。

MultiDBClient 如何实现故障转移和自动回切?

MultiDBClient 通过断路器模式监控各端点健康。当活跃端点被认为不健康时,其断路器打开,客户端根据配置的权重选择最高权重的健康端点并重定向流量。如果启用了自动回切,客户端会定期评估不可用端点,一旦更高权重的端点恢复健康,便将流量切回。

MultiDBClient 负责数据同步吗?

不负责。MultiDBClient 不会跨端点广播命令或复制数据。数据复制由 Active-Active 数据库层负责,使用无冲突复制数据类型(CRDT)来解决并发更新并确保最终一致性。

如何配置 MultiDBClient 的端点?

每个区域数据库实例通过一个 DatabaseConfig 定义,包含端点地址和权重。MultiDbConfig 收集这些端点配置,并定义整体行为,如健康检查、重试、故障转移和回切。可以通过 MultiDbConfig.client_class 全局选择底层客户端类型(Redis 或 RedisCluster),并通过 DatabaseConfig.client_kwargs 传递端点特定的客户端选项。

MultiDBClient 的健康检查策略有哪些?如何选择?

健康检查策略决定多个探测结果如何组合:HEALTHY_ALL 要求所有探测成功,优先端点质量;HEALTHY_ANY 只要任一探测成功即视为健康,优先稳定性,避免不必要的切换;HEALTHY_MAJORITY 要求多数探测成功,平衡两者。例如,运行五个探测,至少三个成功则健康。

如何根据流量调优 MultiDBClient 的参数?

对于高流量系统,让反应式故障检测器主导,健康检查作为较慢的安全网;对于低流量系统,使用更频繁的健康检查,因为反应式检测器可能收不到足够命令。故障检测窗口:高流量适合短窗口以快速反应,低流量需要长窗口以收集足够样本达到 min_num_failures。故障转移尝试:failover_attempts × failover_delay 定义恢复窗口,延迟敏感的 API 应保持短窗口,后台工作器可以等待更久。

MultiDBClient 提供哪些可观测性支持?

MultiDBClient 在故障转移或回切改变活跃数据库时提供运行时通知,应用可以通过 EventDispatcher 注册自定义事件监听器来记录转换、更新指标、触发警报或同步外部状态。当启用 redis-py 可观测性时,还会记录 redis.client.geofailover.failovers 计数器,包含 fail_from、fail_to、reason(automatic 或 manual)等属性。

🏷️

标签

➡️

继续阅读