Plaid | 数据库切换历程:从 AWS Aurora MySQL 到 TiDB 的迁移之旅
原文来源: https://tidb.net/blog/231f2752
原文链接: https://plaid.com/blog/switching-to-tidb/ 翻译能力来自:Deepseek (ai.com )
作者:Zander Hill
Zander Hill 是 Plaid 的软件工程师和前工程负责人,曾创立在线存储团队,并在大规模数据库系统领域拥有丰富经验。他擅长减少停机时间、降低成本,并带领团队完成复杂的数据库迁移项目,其执行速度常被供应商称为“过于激进甚至疯狂”。
导言
Plaid 是一家美国的金融科技公司,2024 年 4 月以 920 亿人民币估值入选《2024・胡润全球独角兽榜》,截至 2024 年 3 月,已在全球 17 个国家内为超过 8000 个应用程序和服务提供支持,链接超 12000 家金融机构,拥有超 1 亿活跃用户,每三个美国成年人中就有一个曾使用 Plaid 的服务来连接其金融账户。
更换数据库平台是现代基础设施中最艰巨的挑战之一。它需要严格的规划以确保数据一致性、服务可用性,并保持性能和功能的兼容性。2023 年 1 月,我们启动了“SQL 的未来”项目,旨在为 Plaid 未来 5 到 10 年的增长奠定在线关系型数据库基础。如今,我们已成功将大部分服务从 AWS Aurora MySQL 迁移至 TiDB,几乎未影响业务运行,并开始收获这一投资的成果。
本文分享我们的迁移过程,希望能为面临类似基础设施改造挑战的企业提供参考。
动机
作为 Plaid 存储团队的创始人,我观察到 Aurora MySQL 的投入与自托管系统的局限性。Plaid 存储团队负责为公司的在线数据提供可扩展且可靠的存储平台,覆盖关系型数据库、NoSQL 和缓存系统。
我与架构负责人 Joy Zheng 和数据库技术专家 Mingjian Liu 共同设计了评估替代方案的框架,并制定了雄心勃勃的时间表:
- 1 个季度 :技术调研
- 1 个季度 :原型验证
- 目标 :在 AWS MySQL 5.7 停用前完成新平台迁移!
为确保项目价值,我们设定了一个硬性约束:**全公司迁移周期不超过两年**。
技术背景
- 总在线存储规模 :约 800 台服务器、50 万 QPS、650 TB 数据,内部 SLA 为 99.99%+ 可用性。
- SQL 平台 :约 446 台服务器、14 万 QPS、40 TB 数据,SLA 为 99.99%+。
- TiDB 当前规模 :约 160 台服务器、17 万 QPS、70 TB 数据、700+ 集群虚拟 CPU。
- 团队规模 :存储团队 6 名软件工程师。
为何放弃 Aurora MySQL?
-
可靠性挑战
- Aurora 的单写入架构成为单点故障,配置变更、扩缩容、重启和故障转移期间易引发停机。
- 分散的数据库运维难以规模化,需集中化管理并增强可靠性保障。
-
开发效率低下
- 写入吞吐瓶颈(如高行争用场景下单表写入约 1.2 万次/秒)。
- 在线 Schema 变更困难,团队常通过新增表规避维护窗口。
- 每年需投入 2 人年 解决 Aurora 的限制(尤其是 2–10+ TB 的大表)。
-
高维护成本
- 2023 年耗费 2 个季度 从 MySQL 5.6 升级至 5.7,每次升级或常规操作(如启用 Binlog、调整规格)均需分钟级停机。
-
分片与扩展需求
- Aurora 写入扩展能力有限,TiDB 的自动分片能力可支持持续高性能写入。
-
MySQL 5.7 停用
- 社区支持终止,Aurora 的 EOL 临近。基于 Facebook 的 MySQL 8.0 升级经验,我们决定将升级精力转向平台迁移。
迁移时间线概览
- 2023 Q1 :评估替代 Aurora MySQL 5.7 的方案。
- 2023 Q2 :完成 TiDB 概念验证(PoC)。
- 2023 Q3 :敲定技术方案(RFC),争取资源支持并搭建 TiDB 基础设施。
- 2023 Q4 – 2024 Q1 :首个服务迁移至 TiDB,随后扩展至约 17 个服务。
- 2025 年 1 月 :完成 41 个服务迁移。
- 未来 :计划 2025 年中完成全部迁移。
服务迁移流程
单服务迁移可分解为数百个微步骤,内部操作手册包含约 200 项任务 和 **20 个子手册**。总体分为四阶段:**消除兼容性问题 → 数据复制 → 验证 → 切换**。
1. 消除兼容性问题
- 强制主键 :TiCDC(TiDB 的变更数据捕获机制)依赖主键实现一致性复制,无主键表需服务团队补充。
- 移除外键 :TiDB 生态工具部分不支持外键,需在应用层实现逻辑约束。
- 审核事务隔离级别 :TiDB 不支持 SERIALIZABLE 隔离级别,需调整为 SNAPSHOT ISOLATION(可重复读)。
- 审核自增字段 :TiDB 的自增 ID 非全局单调(因多节点分配范围),依赖严格递增 ID 的服务需改用时间戳排序或重构 ID 生成逻辑。
- 验证兼容性 :在自动化测试中切换至 TiDB,生产环境切换前暂停 Schema 变更。
2. 数据复制
- 使用 TiDB Lightning 快照导入数据至 TiDB。
- 克隆 Aurora 数据至回滚集群,建立原库、TiDB、回滚库的复制链路。
- 集成 **“mysql/tidb/rollback mysql” 切换客户端**,通过功能开关实现数据库端点动态切换。

3. 验证
- 数据一致性检查 :使用 TiDB 的
sync-diff-inspector等工具确保数据完全匹配(曾发现二进制主键和时间戳列的边缘案例,需 PingCAP 提供补丁)。 - 实时查询验证 :通过双写双读对比正确性与性能,优化 TiDB 的查询计划(如索引提示)。
- 性能基准测试 :确保高流量服务(Tier 0/1)的延迟符合预期。
4. 切换
-
通过功能开关实现原子切换:
- 暂停 Aurora 写入,等待复制完全同步。
- 切换读流量至 TiDB。
- 执行安全性与正确性验证。
- 切换写流量至 TiDB。
-
整个过程仅需 **约 60 秒写入停机**,读流量全程可用且一致。若切换后出现问题,可快速回滚至专用 MySQL 集群。

效率提升策略
面对数十个待迁移服务,我们优化策略如下:
原则
- 优先攻克最难的服务
- 始终备有回滚计划
工具创新
-
动态运行手册(Dynamic Runbooks)
- 将 Markdown 指令与 TypeScript 代码嵌入 Jupyter Notebook,实现文档与脚本的深度融合。
- 使用 Deno 语言(团队熟悉 TypeScript、依赖管理简单、无虚拟环境负担)开发 CLI 工具,支持参数输入与执行日志实时上报至 Slack。
- 效率提升:切换阶段提速 **5 倍**,服务迁移整体提速 **3-4 倍**(200 个步骤)。

集中化与自动化
- 任务集中化 :原由客户端团队处理的步骤(如环境切换、Schema 变更)转由存储团队统一执行,减少上下文切换开销。
- 批量处理常规步骤 :通过自动化减少重复劳动。
经验总结
成功之处
- 性能验证准确 :迁移前基准测试结果与实际表现高度一致。
- 零停机升级与扩展 :一周内完成 6 个生产集群升级,TiDB 二次升级仅需 2 天(Aurora 需 6 个月且伴随分钟级停机)。
- 在线 Schema 变更 :无需维护窗口即可修改 5+ TB 表的 Schema。
- 供应商支持 :PingCAP 工程师(特别感谢 Michael Zhang)响应迅速,提供补丁与建议。
改进空间
- 生态工具完善性 :TiCDC、TiDB Lightning 等工具存在边缘案例,需投入时间修复。
- 查询计划差异 :部分查询因 TiDB 执行计划不同导致全表扫描,需通过查询提示优化。
- 资源隔离与配置复杂度 :TiDB 资源控制灵活但配置交互复杂,需结合源码理解最佳实践。
结语
通过动态运行手册、周密规划和团队高效执行,我们的服务切换周期从 3-4 周 缩短至 **约 1 周**,写入停机时间从 5 分钟 降至 **60 秒**。TiDB 的横向扩展能力、无锁 DDL、更优可观测性及简化运维,已为 Plaid 带来显著收益。
数据库迁移绝非易事,但通过以下策略可大幅降低难度:
- 充分规划与早期测试 :覆盖数据正确性与性能验证。
- 自动化重复任务 :标准化流程,减少人工干预,保留回滚路径。
- 优先攻克边缘案例 :长期收益显著。
- 高效沟通 :与客户端团队、管理层及供应商保持紧密协作。
Plaid 存储团队(由赞德·希尔和 Andrew Chen 领导)在 PingCAP 2024 HTAP 峰会上分享了此次迁移经验。我们相信,TiDB 将支撑未来 5 到 10 年的存储需求,助力团队无需维护窗口、灵活应对生产事件,并加速产品创新。
致谢
- 存储团队 :Zander Hill(负责人)、Mingjian Liu(技术主管)、Andrew Chen(工程经理)、Lauren McCarty、Brian Xie、Seyoung Kim、Catherine Shen、Lohit Verma(项目经理)。
- 架构指导 :Joy Zheng(平台架构负责人)提供技术审阅并推动制定运维原则。
相关文章:
Plaid | 数据库切换历程:从 AWS Aurora MySQL 到 TiDB 的迁移之旅
原文来源: https://tidb.net/blog/231f2752 原文链接: https://plaid.com/blog/switching-to-tidb/ 翻译能力来自:Deepseek (ai.com ) 作者:Zander Hill Zander Hill 是 Plaid 的软件工程师和前工…...
MongoDB 扩缩容实战:涵盖节点配置、服务启动与移除操作
#作者:任少近 文章目录 一、扩容在245节点上配置配置config server:配置mongos启动config server安装工具mongosh添加245新节点到副本集配置分片副本集启动路由并分片 二、缩容Conf server上去掉server4shard上去掉server4mongos上去掉server4 一、扩容…...
Python学习心得字符串拼接的几种方法
一、字符串拼接的接种方法: 二、字符串拼接方法的运用: s1hello s2world #使用进行连接 print(s1s2)#使用字符串join()方法 print(.join([s1,s2]))#使用空字符串进行拼接print(*.join([hello,world,python]))#使用*进行拼接#直接拼接 print(helloworld)…...
USB2.03.0摄像头区分UVC相机在linux中的常用命令
这里是引用 一. USB2.0 & 3.0接口支持区分 1.1. 颜色判断 USB接口的颜色并不是判断版本的可靠标准,但根据行业常见规范分析如下: USB接口颜色与版本对照表: 接口颜色常见版本内部触点数量传输速度黑色USB2.04触点480 Mbps (60 MB/s)白…...
electron 学习
文章目录 1.注意项1.1 安装前最好设置一下代理 官网 tutorial https://www.electronjs.org/docs/latest/tutorial/tutorial-prerequisites 1.注意项 1.1 安装前最好设置一下代理 npm config set registry https://registry.npmmirror.com/...
美术教程2025
动画 必看 动画d【Unity初学者教程】如何制作 2D 游戏动画_哔哩哔哩_bilibili 如何在Unity中制作2D游戏动画 - 新手教程 - Blackthornprod_新手教程 可不看序列帧 【简明UNITY教程】2D游戏 动画制作实例详解_哔哩哔哩_bilibili unityspine 【Unity2D游戏开发教程】2D自定…...
CPT205 计算机图形学 OpenGL 3D实践(CW2)
文章目录 1. 介绍2. 设计3. 准备阶段4. 角色构建5. 场景构建6. 交互部分6.1 键盘交互6.2 鼠标交互6.3 鼠标点击出多级菜单进行交互 7. 缺点与问题7.1 程序bug7.2 游戏乐趣不足7.3 画面不够好看 8. 完整代码 1. 介绍 前面已经分享过了关于CPT205的CW1的2D作业,这次C…...
基于单片机的开关电源设计(论文+源码)
本次基于单片机的开关电源节能控制系统的设计中,在功能上设计如下: (1)系统输入220V; (2)系统.输出0-12V可调,步进0.1V; (3)LCD液晶显示实时电压ÿ…...
autogen_core中的DataclassJsonMessageSerializer类
源代码 import json from dataclasses import asdict, dataclass, fields from typing import Any, ClassVar, Dict, List, Protocol, Sequence, TypeVar, cast, get_args, get_origin, runtime_checkable, Union from pydantic import BaseModelfrom types import NoneType, …...
floodfill算法系列一>太平洋大西洋水流问题
目录 题目方法解析:代码设计:代码呈现: 题目方法解析: 代码设计: 代码呈现: class Solution {int m,n;int[] dx {0,0,-1,1};int[] dy {-1,1,0,0};public List<List<Integer>> pacificAtlant…...
DeepSeek 助力 Vue 开发:打造丝滑的无限滚动(Infinite Scroll)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
JavaScript 内置对象-Math对象
在JavaScript中,Math 对象提供了一系列与数学相关的静态方法和属性,帮助开发者执行复杂的计算任务。无论是简单的算术运算还是高级的几何、统计计算,Math 对象都能提供强大的支持。本文将详细介绍 Math 对象的主要功能及其使用方法。 一、简…...
硕成C语言22【一些算法和数组的概念】
1.求水仙花数 #include <stdio.h>int main() {//求水仙花数:1.三位数 2.个位的立方十位的立方百位的立方该数int unit, tens, hundreds;for (int i 100; i < 1000; i)//i表示该水仙花数{unit i / 1 % 10;tens i / 10 % 10;hundreds i / 100 % 10;if (…...
Halcon相机标定
1,前言。 相机的成像过程实质上是坐标系的转换。首先空间中的点由“世界坐标系”转换到“相机坐标系”,然后再将其投影到成像平面(图像物理坐标系),最后再将成像的平面上的数据转换为图像像素坐标系。但是由于透镜的制…...
部门管理(体验,最原始方法来做,Django+mysql)
本人初学,写完代码在此记录和复盘 在创建和注册完APP之后(我的命名是employees),编写models.py文件创建表 手动插入了几条数据 1.部门查询 urls.py和views.py在编写之前,都要注意导入对应的库 urls.py:…...
clickhouse集群搭建
Clickhouse集群搭建 文章目录 Clickhouse集群搭建安装包下载clickhouse单机安装默认安装默认数据库目录更改默认数据目录 2分片-1副本-3节点集群搭建1. 配置hosts2. 修改每个主机的主机名3. 配置文件上传配置文件分布chnode1配置文件chnode2配置文件chnode3配置文件 4. 重启cli…...
250214-java类集框架
单列集合是list和set,list的实现类有ArrayList和LinkedList,前者是数组实现,后者是链表实现。list和set,前者有序、可重复,后者无序不可重复。 1.单列集合 1.1. list java.util.List接口继承自Collection接口&#…...
二叉树(C语言版)
文章目录 二叉树完全二叉树和满二叉树二叉搜索树基本操作实现代码运行结果 分析红黑树2-3-4树(理论模型)红黑树(实际实现) 二叉树 树是一种层次结构,它在现实生活中是广泛存在的,比如:族谱(family tree),组织机构,目录…...
ASP.NET Core 面试宝典【刷题系列】
文章目录 引言1、什么是 dot net core 的 startup class?2、什么是中间件?3、application builder 的 use 和 run 方法有什么区别?4、dot net core 管道里面的map拓展有什么作用?5、dot net core 里面的路径是如何处理的?6、如何在 dot net core 中激活 session 功能?7、…...
案例-02.部门管理-查询
一.查询部门-需求 二.查询部门-思路 API接口文档 三.代码实现 1.controller层:负责与前端进行交互,接收前端所发来的请求 注:Slf4j用于记录日志使用,可以省略private static Logger log LoggerFactory.getLogger(DeptControlle…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
