千锤百炼,稳如磐石:阿里云Tair无感切换技术保障业务持续在线

简介: Tair基于15年技术沉淀,创新实现主从无感切换,通过内核、SDK与网络协同优化,大幅降低实例切换时的不可用时间至1秒内,提升业务连续性体验。

Tair 作为一款在阿里巴巴和阿里云开发超过15年的数据库系统,凭借高性能、低延迟、分布式和高可靠等核心优势,已广泛应用于AI、电商、游戏、交通、教育、医疗等多个行业。本文将重点解析 Tair 在无感切换技术领域的创新实践,通过无感切换技术,可以将实例在切换过程的不可用时长大幅缩减。

所谓无感切换技术,是指客户实例在小版本升级、高可用切换等运维操作时,客户端不会感知到明显的性能波动,具体表现为无报错、无连接中断及响应时间(RT)无显著变化。

一、从 Redis®/Valkey 社区的高可用架构谈起

对于开源数据库 Valkey 或者 Redis®,目前支持的两种架构如下所示:

Standalone:在标准的主备架构中,通常由主库对外提供读写服务,备库仅作为故障时的接替节点。对于 Standalone 模式,社区主流的高可用方案就是在主从复制的基础上引入 Sentinel 组件。Sentinel 会作为一个独立的监控与仲裁层,持续探测主库和从库的存活状态及复制健康状况,一旦发现主库在设定时间内持续不可达,并且多数 Sentinel 实例达成一致判断,便会自动发起故障转移。

Cluster:Cluster 架构在设计上将分片和高可用整合在一起,集群将全部键空间划分为 16384个槽(slot),由多台 master 节点分担存储与流量,每个 master 可以配置一个或多个 replica 作为副本。当某个 master 出现故障时,其对应的 replica 会在集群内部通过投票选举机制自动提升为新的 master,并接管该 master 负责的所有槽位,从而实现自动主从切换。集群节点之间通过 gossip 协议持续交换心跳和状态信息,分布式维护槽位到节点的映射,客户端在收到 MOVED/ASK 重定向时即可根据最新拓扑重新路由请求。                    

                        Sentinel与集群架构.png

图1. Sentinel与集群架构

二、集群架构无感切换与生态支持

根据 Redis® 的标准协议 RESP 的实现,在开源集群架构中,主备切换之后,备库会给已经存在的请求返回 MOVED 指令,客户端收到对应的MOVED 指令之后,会重新刷新路由表,并且重试命令,从而实现无感切换。

Tair 在实现直连集群架构(非 Proxy 集群架构)时候也不是简单的对开源架构进行全盘接收,而是进行了改造。一方面为了实现无感切换,在链路上对主备节点均配置了 VIP,从而保证 MOVED 之后的访问可以畅通无阻;其次并没有采用 gossip 传播协议,而是由中心化的 config server 作为集群的single source of truth,对集群中所有节点进行路由表的分发和链路切换,大大提升集群的稳定性。  

                                                                                    阿里云Tair直连集群架构示意.png

图2. 阿里云Tair直连集群架构示意

key1: 100 表示key1位于slot 100中,访问VIP1-1的master节点会直接被接受。

key1: 100 访问VIP1-2的replica节点,会返回MOVED。

key2: 200 访问VIP2-1的master节点,由于其负责的slot范围为8192~16383,不包括key所在的slot

三、主从架构下无感切换的实施

和集群架构下天然存在无感切换的基础不同,主从架构下实现无感切换存在比较大的障碍。

主从和集群协议不兼容:首先是协议层面,Redis® 社区最先创造了主从架构,非常简洁。从 3.0 版本开始才支持集群架构,集群架构设计的路由表和 slot 机制是主从架构完全没有的,即这部分是割裂而非统一的。这就也导致了从主从架构变配到集群架构本身是不兼容的,需要客户端修改代码从主从模式到集群模式,对用户造成较高的改造成本。

Sentinel 方案无法做到完全无感:其次是开源社区的主从高可用方案是 Sentinel,基于 Sentinel 实现无感方案是行不通的,因为 Sentinel 实际上是个外部组件,无法控制内核连接维度的命令行为,并且受限于部署难度和成本,Sentinel 组件并非是所有的开源用户都会使用的。例如阿里云的主从版本是由独自的高可用组件负责实例的生命周期探活,并不依赖 Sentinel。

在上述的条件约束下,实现主从无感切换就需要联合内核、客户端、链路层面来重新的协同完成。Tair团队基于此,开始在社区提出主从无感切换的提案,并推动无感切换的进行。

3.1 社区标准协议的推动

内核层面主从无感协议的支持[1]最开始提交在了 Redis® 社区、经过超过百次的交流,也经历了 Redis® 社区的闭源、最终在新的 Valkey 社区被合并接受[2],在整个讨论过程中,遇到的主要问题是:

  • 海外的用户大部分使用的集群版,因此社区对主从的优化愿望不是很强烈,但是阿里云上存在大量的标准版客户,因为标准版使用起来更加自由,例如多 key 命令不受 slot 的限制。
  • 关于无感体验,一些客户业务并不重要,认为中断可以接受,但从实际来看,我们的客户对 RT 和体验的要求是日益增加的。
  • 社区对于引入新的协议本身比较抗拒,因为意味着需要客户端重新适配,担心落地性不强。Redis® 的客户端生态相对处于一种较为松散的状态,客户端的开发都是由一些爱好者在用爱发电。但是这里社区的考虑是有缺位的,无论客户端的生态是否由 Redis® 社区强控制,引擎都应该为其制定标准。为了打消这个担忧,Tair 也是直接打入 Redis® 客户端生态,目前是 valkey-java[2] 客户端的 owner。

最终,尽管期间遭遇了 Redis 闭源,但秉持开源精神,阿里云 Tair 团队联合前 Redis 社区多名核心贡献者和各大厂商,组建了 Valkey 社区,并在Valkey 社区中成功推动无感技术的开发与合并,让无感切换成为了Valkey数据库的标准能力,新的协议格式为:REDIRECT HOST PORT,其中 REDIRECT 表示客户端需要将请求重定向到目标节点。

图3. Valkey无感切换的支持PR

3.2 SDK技术的跟进

Redis® 闭源之后,Tair 团队之前的 Jedis 社区核心贡献者将 Jedis Fork 创建了 Valkey-Java 客户端,为客户提供了延续的客户端服务,在 Valkey-Java 上,实现了主从无感切换的支持。客户只需要将客户端升级到下列版本便可以享受主从无感切换的能力支持:

<dependency>
    <groupId>io.valkey</groupId>
    <artifactId>valkey-java</artifactId>
    <version>5.3.0</version>
</dependency>

在支持无感切换的过程中,特别解释下如何处理 in flight 的连接:即对于连接池中同时并发访问的链接,如果某条或者多条同时遇到了-REDIRECT之后,通过一个二段锁来控制重新初始化连接池的过程:

  1. 第一层锁使用ReentrantLock的tryLock,当tryLock成功时候才可以进入候选Renew连接池的可能。
  2. 第二层锁使用ReentrantReadWriteLock,主要用来控制连接池的的读写,但加入写锁之后,将会block外部API请求,直到更新完毕连接池,从而实现并发安全访问。

图4. Valkey-Java处理in flight的连接代码

目前无感切换已经成为了 Valkey 客户端社区的标准能力。除了 Valkey-Java 客户端,社区其余的客户端对于无感切换的支持也在陆续进行:

客户端

地址

无感切换支持的情况

开始版本

Valkey-Java

https://github.com/valkey-io/valkey-java

已支持

5.3.0

Valkey-Go

https://github.com/valkey-io/valkey-go

已支持

1.0.67

Valkey-py

https://github.com/valkey-io/valkey-py

支持中

\

Glide

https://github.com/valkey-io/valkey-glide

支持中

\

3.3 网络技术之 Connection Draining

顾名思义,为连接排空能力,作为优雅关闭使用。优雅关闭的前提是后端服务器可用,如下图中一个ALB后面挂有4个 Server,如果做一个缩容操作移除Server4,对于即将要发给这个Server的Request4和6,在draining配置的时间内(0-900s),Server4还是会对Request做出响应,等到draining时间到达之后才断开连接,注意:draining之后后续的7,8,9等请求都不会再发给Server4了,这也是能排空的前提。在 draining时间之后,剩余连接也会收到RST。

image.png

图5. Conncetion Draining功能示意图

云数据库和自建数据库除了内核层面的改动和优化不同之外,网络环境的不同也是非常重要的方面,用户需要从VPC能访问通云数据的原理实际上是通过 LB(Load Balancer)组件在用户 VPC 中申请可用 IP,然后负责打通用户 VPC 内网络到云数据 VPC 的网络,从而让访问服务达成。除此之外,在发生高可用切换时候,只需要切换后端的服务节点,VIP 保持不变,可以降级客户端的接入成本。阿里云 Tair 标准版的架构如下所示。

那主从无感的实现为什么需要依赖 Connection Draining 呢?其在此过程又发挥了什么作用呢?此技术可以在切换后对切换前节点保持流量转发,做到优雅下线。从无感切换细节流程来看,当我们对 master 执行了禁写操作,等待 replica 追平数据切换 VIP 的时候,原始行为切换掉之后对于旧的 master 的链接会回复 RST,导致链接断开重连,这就使得内核的 REDIRECT 没有机会被回复给客户端;而 Connection Draining 则可以对旧的 master 上的链接保持转发一段时间(可配置),转发结束之后才回复 RST,从而实现无感切换。

image.png

图6. 阿里云Tair标准版架构的主从无感切换

四、无感切换的测试效果

在无感切换上线之后,使用 Tair-pulse[3](一款开源的,可以评测切换期间客户端报错和 RT 的工具)对实例切换期间进行对比测试,可以看到此功能带来两部分的提升:

  1. 原始切换方案会遇到 readonly、connection reset等5种报错,但新的切换方案不会遇到任何报错。
  2. 原始切换方案切换过程约有5s的不可用,新的切换方案影响为1s的RT上升。需要注意的是,新的切换方案使用pause write会阻塞实例写入,可能导致命令超时,最长约1s左右,如果您希望切换不处理任何报错,则可以适当调大超时时间。

图7. 旧方案切换过程有5种报错,不可用时间5s

图8. 无感切换方案0报错,不可用时间1s左右

五、总结及展望

本文从 Redis® 开源社区的高可用架构谈起,详细解释了无感切换的定义、集群和主从实现无感切换的过程,遇到的难点。目前 Tair 云上架构的主从无感切换仍旧存在优化空间,我们后续也会继续联合网络团队将切换耗时进一步降低,为客户提供高质量的服务,欢迎大家对 Tair 主从无感切换的能力试用体验并提出宝贵意见。

附:Tair无感切换实操指引:

Tair 从 7.0 大版本开始支持主从无感切换能力,如果您的大版本低于 7.0,需要将版本升级到 7.0;如果您已经是 7.0 版本,将小版本升级至 0.2.9 版本即可。注意,您需要配合使用 Valkey-Java 5.3.0 版本及以上才可以体验到完整的无感切换能力。

附:

  1. https://github.com/redis/redis/pull/12192
  2. https://github.com/valkey-io/valkey/pull/325
  3. https://github.com/valkey-io/valkey-java
  4. https://github.com/tair-opensource/tair-tools/tree/main/tair-pulse

目录
相关文章
|
23天前
|
存储 人工智能 测试技术
基于 VectorDBBench 的性能评测与架构解析:Lindorm 向量引擎的优化实践
阿里云Lindorm向量检索服务重磅升级,依托CBO/RBO混合优化器与自适应混合索引,实测QPS达5.6万(百万级)、2.4万+(千万级),P99延迟低至2ms,融合检索性能行业领先,全面支撑AI时代高并发、低延迟、强一致的生产级向量应用。
180 4
|
7天前
|
存储 NoSQL 数据库
【上海站】SGLang和ta的朋友们:共探大模型推理新范式
本次Meetup聚焦大模型推理性能突破,SGLang、阿里云Tair KVCache、NVIDIA与千问APP团队联合分享:SGLang路线图、Tair分层存储重构、低延迟优化及投机采样等实战方案,共探无限上下文与降本增效新路径。除了技术干货,现场参与还可获得定制的开工礼包,快来提前预定席位吧!
143 2
|
存储 缓存 NoSQL
阿里云 Tair 联手 SGLang 共建 HiCache,构建面向“智能体式推理”的缓存新范式
本文系统剖析面向智能体推理的 KVCache 技术演进,针对传统机制在长上下文、多轮决策与多智能体协同中的状态膨胀、持久化缺失和缓存孤立三大瓶颈,介绍阿里云 Tair KVCache 团队联合 SGLang 社区推出的 HiCache 分层缓存体系。该方案通过显存-内存-3FS 多级卸载与全局共享,实现缓存命中率提升至80%,TTFT 降低56%,推理 QPS 翻倍,支撑智能体时代的大模型高效推理。
|
存储 缓存 NoSQL
开源 | 阿里云 Tair KVCache Manager:企业级全局 KVCache 管理服务的架构设计与实现
阿里云 Tair 联合团队推出企业级全局 KVCache 管理服务 Tair KVCache Manager,通过中心化元数据管理与多后端存储池化,实现 KVCache 的跨实例共享与智能调度。该服务解耦算力与存储,支持弹性伸缩、多租户隔离及高可用保障,显著提升缓存命中率与资源利用率,重构大模型推理成本模型,支撑智能体时代的规模化推理需求。
|
2月前
|
运维 监控 NoSQL
阿里云MongoDB数据库支撑心动公司《心动小镇》全球稳定发行
心动自研生活模拟手游《心动小镇》全球上线即火爆。面对全球数千万玩家带来的海量高频存档压力与复杂的跨国运维挑战,心动借助阿里云MongoDB强大的弹性伸缩与秒级回档能力,成功保障了全球玩家极致稳定的游戏体验。
209 0
|
AliSQL 关系型数据库 MySQL
AI时代,当 MySQL 遇见列式存储引擎 DuckDB
国内首场《2026 AliSQL Innovate 用户大会暨 AliSQL DuckDB 开源发布会》将于2月3日在杭州开启!席位有限,快来报名吧:https://page.aliyun.com/form/act1162737496/index.htm
AI时代,当 MySQL 遇见列式存储引擎 DuckDB
|
存储 弹性计算 关系型数据库
阿里云服务器ESSD云盘性能等级PL0、PL1、PL2、PL3区别,云盘性能级别PL知识点参考
在我们选择阿里云服务器系统盘和数据盘时,如果是选择ESSD云盘,还需要选择云盘的云盘性能级别PL,PL性能级别有PL3、PL2、PL1、PL0四个性能级别的云盘规格,如果是通过阿里云的活动来购买云服务器的话,由于系统盘默认一般为20G或40G容量,可选的PL性能级别通常只有PL0(单盘IOPS性能上限1万)和PL1(单盘IOPS性能上限5万)可选择,有的用户肯能并不清楚ESSD云盘的性能等级之间有何区别,单盘IOPS性能指的是什么,本文为大家介绍一下ESSD云盘的云盘性能级别PL3、PL2、PL1、PL0相关知识点。
阿里云服务器ESSD云盘性能等级PL0、PL1、PL2、PL3区别,云盘性能级别PL知识点参考
|
16天前
|
人工智能 运维 API
阿里云OpenClaw汉化版零门槛部署指南:全中文界面+代码命令详解
在AI自动化办公全面普及的2026年,OpenClaw(前身为Clawdbot、Moltbot)凭借自然语言指令操控、多任务自动化执行、多平台适配的核心优势,成为个人与中小企业搭建专属AI助手的首选开源轻量级工具。它不仅能完成文档生成、文件解析、服务器运维等基础工作,更可通过阿里云一键部署实现7×24小时稳定运行。尤其适配的汉化版,以全中文界面彻底解决了原版英文操作门槛高的痛点,搭配零配置适配设计,让零基础用户也能快速上手,真正实现“零技术门槛解锁中文AI办公”。
2010 6
|
2月前
|
存储 缓存 算法
SGLang Hierarchical Sparse Attention 技术深度解析
阿里云 Tair 联合 SGLang 推出分层稀疏化框架,通过“稀疏+分层”协同优化,将 KVCache 从 GPU 显存扩展至 CPU 与远端存储,实现计算与存储效率双突破,为百万级超长上下文推理提供新路径。