SQL Server + .Net 是很多早期互联网企业的标配技术栈,虽然 TiDB 是兼容 MySQL 协议和生态的数据库,但是 TiDB 适用的业务场景是通用的。在开源新技术大行其道的今天,如何从 SQL Server 无缝迁移至 TiDB,汽车之家做了一个创新的示范。
本文将从业务背景、迁移方案、同步、业务改造、上线效果、周边建设等多个角度,详细介绍了如何从 SQL Server 数据库迁移至 TiDB 数据库。相信无论你是架构师、业务开发、还是 DBA,都会有不同层面的收获。
一、项目背景
二、使用 SQL Server 遇到的瓶颈
三、分布式数据库调研
3.1 确定方向
TiDB 是一款定位于在线事务处理、在线分析处理(HTAP: Hybrid Transactional/Analytical Processing)的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。同时兼容 MySQL 协议和生态,迁移便捷,运维成本极低。
水平伸缩:在当前集群内可以随时加节点,更换节点也轻而易举。 海量数据支持:基于其特性以及业内使用的经验,十亿乃至百亿级别的数据量轻松搞定。 高可用:相较 SQL Server 的主从模式,TiDB 基于 Raft 协议,可以实现 100% 的数据强一致性,并且多数副本可用的情况下,可实现自动故障恢复。 HTAP:TiDB 自身就支持一定程度的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。对于更深度的 OLAP 应用,我们也已经在实践的路上。
3.2 实践出真知
基于以上理论的支持,我们进行了大量的功能测试、性能测试、异常测试、业务接入测试等。
1. OLTP 测试:2000 万数据,500 并发线程测试,在 OLTP 场景测试下 TiDB 的响应时间 99% 在 16ms 以内,满足业务需求。且在数据量级越来越大的情况下,TiDB 会体现出更大的优势,后续还可以通过添加 TiDB/PD/TiKV 节点来提高读写性能,如下图所示:
四、迁移方案
4.1 迁移前需要解决的问题
在真正的数据迁移之前,我们还有一些实际问题需要解决:
SQL Server 和 TiDB 的部分字段类型是不一样的。通过查阅相关文档,将不同的字段一一对应后再在 TiDB 中建表,例如 DATETIME 的精度问题。
同步时将分库分表的数据合并到一个表里。值得庆幸的是原有设计中,我们除了自增主键 ID,还有一份业务 ID,其在各个表中均不重复,这样省了不少事情。
一次性导入十亿级数据以及后续增量同步的过程中,如何保证数据的一致性。 如果 TiDB 在生产时出现了不可预估的问题,一时无法解决,那我们必须立刻切换到 SQL Server,保证业务不受影响。换句话说,在 TiDB 中产生的数据需要实时同步回 SQL Server。 因为访问量比较大,切换时间必须控制在秒级。 因为 SQL Server 是商业数据库,跟开源数据库进行数据同步的方案较少,所以同步方案、架构设计、研发、测试必须我们自己解决。
4.2 整体迁移架构图

五、全量同步
https://github.com/alibaba/yugong https://github.com/alswl/yugong
#查询表
SELECT name FROM sys.databases WITH (nolock) WHERE state_desc = 'ONLINE'
#查询开启CDC的表
SELECT name FROM %s.sys.tables t WITH (nolock) JOIN %s.[cdc].[change_tables] ct WITH (nolock) ON t.object_id = ct.source_object_id
record.removeColumnByName(config.getDiscardKey());
六、增量同步与实时校验
采用单 partition 的 topic 和单个消费程序,保证增量同步和校验的顺序严格一致,但此种方案性能相对较低,可用性无法保证。 我们将 SQL Server 中的表行加入上版本戳(rowversion),将版本戳一并同步到 TiDB 中。校验时比较该值,如不一致则放弃本次校验。本方案会损失一定的校验样本,但可通过增加 Partition 和消费者提高性能和可用性。
七、回滚方案
通过业务 ID 决定数据写到哪个库表
八、汽车之家社区业务 TiDB 迁移改造
就业务的改造这一环节,因历史积淀,需修改的地方很多,分布于各个项目之中,我们采取通过接口查找实现、搜索代码、DBA 帮助抓取 SQL 的方式,保证涵盖了 100% 的相关业务,只有这样才能保障上线后无故障。
数据访问层增加对 MySQL 语法的支持。 去掉 SQL Server 中的存储过程。 SQL Server 和 TiDB(MySQL)的语句和函数支持不尽相同,逐个改造、测试并优化。 根据 TiDB 索引的原理以及梳理出来的 SQL 语句,重新建索引。
九 、TiDB 周边体系建设
我们建立了完善的 TiDB 开发规范、运维规范、上线规范,并在公司内部对开发同学进行相关的培训。 开发了实时慢 SQL 分析工具——TiSlowSQL,该工具可以提供实时、多维度、全视角的 SQL 报告,帮助我们快速定位慢 SQL 导致的集群级故障。 为解决监控单点问题,我们自己开发了一套监控工具,对 TiDB 核心组件进行监控,后续会将监控系统统一迁移到之家云平台。 定期在汽车之家大学举行技术培训,定期在组内进行技术分享,经验总结。
TiSlowSQL 也是汽车之家运维组参加 TiDB Hackathon 2019 的项目,具体原理与实现内容敬请期待后续的文章~
十、总结与展望
通过不断的优化 SQL,目前线上 TP99 稳定,与迁移之前并无太大差别,跟测试效果相符。对用户和业务都无感知。
随着业务的不断扩大,可以更好的应对数据的暴增,再扩容集群就不需要找昂贵的大存储机器,而且可以在线不停业务随时扩容。 本次迁移我们积累了 SQL Server 转 TiDB 的很多经验,可以为其他团队使用分布式数据库 TiDB 提供技术支持,让其他团队在迁移过程中节省时间。 目前正在与 TiDB 官方沟通,准备把迁移方案和与业务无关的迁移逻辑放到开源社区。
作者介绍:
之家技术架构组由各技术团队核心成员组成,成立跨部门的横向沟通机制(开发、测试、运维等),主要负责分布式数据库、服务网格等前沿技术的研究、测试、落地实施等工作,其目的是用于解决团队在实际生产过程中遇到的技术问题,推进现有系统架构升级,建立学习型社群,最佳实践传播分享。
本文转载自公众号「之家技术」,点击【阅读原文】查看原版。
典型实践
知乎 | 万亿量级业务数据下的实践和挑战
平安科技 | 核心系统的引入及应用
微众银行 | 数据库架构演进及 TiDB 实践经验
华泰证券 | TiDB 在华泰证券的探索与实践
丰巢 | 支付平台百亿级数据
美团点评 | 深度实践之旅
贝壳金服 | 在线跨机房迁移实践
易果生鲜 | 实时数仓
小红书 | 从 0 到 200+ 节点的探索和应用
小米 | TiDB 在小米的应用实践
58 集团 | 应用与实践
爱奇艺 | 边控中心/视频转码/用户登录信息系统
Shopee | 东南亚领先电商 Shopee 业务升级
转转二手交易网 | TiDB 在转转的应用实践
同程艺龙 | 1. 票务项目 2.自研 TiDB 运维工具 Thor
今日头条 | 核心 OLTP 系统
更多:https://pingcap.com/cases-cn/