首页 / 资讯中心 / 文章详情

TiDB国产化落地实践:从迁移到分行业避坑指南

TiDB国产化落地实践:从迁移到分行业避坑指南 ★ FEATURED ARTICLE
3月14日TiDB社群在长沙搞了一场线下聚会主题叫“数智湖南”。我本来以为就是一场普通的技术沙龙结果到了现场才发现来的几乎都是各行业正在做数据库国产化升级的一线团队——零售、医疗、金融、交通、智能制造一个不落。大家聊的内容也很实在不是“国产化该不该做”这种务虚话题而是“存量Oracle怎么迁”“大促峰值怎么扛”“TiDB和MySQL语法差异怎么处理”这种能直接带回公司落地的经验。这篇文章我就以这场活动为引子把现场聊到的、会后复盘的技术点系统地梳理一遍。核心围绕TiDB这个开源分布式数据库在国产化升级中的定位、分行业落地打法、迁移实操路径以及几个我在生产环境里踩过的坑。不管你是正在做数据库选型评估还是已经进入迁移阶段这篇都应该能给你一些可以直接抄作业的东西。1. 为什么偏偏是长沙一场社群聚会让国产化不再是口号先聊聊这场聚会本身的氛围。活动场地不算大但来得人很齐。我旁边坐的是某连锁零售品牌的数据库负责人他们正在把会员系统和订单系统从Oracle往TiDB上搬对面是一位做智慧交通的架构师聊的是卡口数据和轨迹查询的存储改造还有几位来自本地三甲医院信息科的老师关心的是电子病历系统的高可用和容灾。这和湖南本地的产业结构高度相关。零售连锁、工程机械制造、医疗资源、交通物流这些行业在湖南都很密集而这些行业恰恰是传统数据库存量最深、国产化升级需求最迫切的地方。大家在一个屋子里聊同一件事就是存量系统怎么平稳地换到国产分布式数据库上。为什么大家不约而同在关注TiDB活动现场有一个共识数据库国产化升级最难的不是数据库本身而是“换了之后业务还能不能正常跑”。TiDB之所以被反复提起根本原因是它对MySQL生态的高度兼容——应用层改动小、DBA上手快、周边工具能复用。这意味着迁移的边际成本被大幅压缩不像以前那种从Oracle迁到新平台要重写SQL、重做报表甚至整个研发团队重新培训。现场让我印象很深的一段对话是一位做金融系统的工程师讲的他们内部做国产化选型测评把TiDB和另一款国产数据库放在同样的硬件上跑同一套压测脚本结果TiDB在并发写入和弹性扩容两个维度上优势非常明显。但他也强调了一句大实话——跑分只是一部分真正决定选型的是团队有没有能力接得住这套分布式架构。这话说到了根子上。TiDB不是简单的“MySQL换皮”它的分布式内核决定了运维方式、故障处理方式、容量规划方式都跟单机数据库不一样。所以这篇文章我不会只吹优点也会把运维层面的代价和踩坑细节讲透。这样你评估的时候心里才有一本完整的账。2. 数据库国产化的本质换引擎不是换皮肤2.1 TiDB到底是什么样的数据库很多人第一次接触TiDB会把它当成一个“能水平扩展的MySQL”。这个说法方向对但不完全准确。TiDB的架构是由多个组件协同工作的TiDB Server负责SQL解析和优化是无状态的可以随便扩TiKV负责真正的数据存储数据按照Region切片分布在多个节点上每个Region默认有多副本通过Raft协议保证强一致PDPlacement Driver是整个集群的调度中心负责Region的分布、负载均衡和故障恢复还有一个TiFlash是列式存储的副本专门跑分析型查询。这个架构带来的能力是单机数据库很难给的扩容就是加节点数据会自动重分布不需要手工分库分表副本挂掉一个Raft会自动选主恢复应用侧基本无感在线事务和分析查询可以跑在同一套数据上不需要像传统架构那样弄一套ETL把数据搬到数仓。活动现场有一位老DBA用了一个很贴切的比喻TiDB像一个“自带调度中心的大型仓库”货物数据自动分布在多个货架TiKV节点上哪个货架满了调度中心会自动把货挪到空的货架上。你要扩容就多租一个货架调度中心会自动安排。这个比喻虽然粗糙但对于理解TiDB的核心价值——弹性伸缩和自动化运维——非常到位。2.2 兼容性红利保住团队十年积累聊国产化最容易被低估的是“团队技术资产的保值”。一家公司用了十年MySQL积累的是无数SQL写法、监控脚本、备份方案、排查经验。如果换一个完全不兼容的国产数据库这些资产全部作废团队要重新学一套新东西这个隐性成本比买软件的钱高得多。TiDB在这方面占了很大的便宜。它兼容MySQL协议意味着你现有的MySQL驱动、连接池、ORM框架基本不用改常用的SQL语法包括JOIN、子查询、窗口函数、公共表表达式TiDB都能跑。更关键的是团队里那些写了多年MySQL的工程师看TiDB的慢查询日志、执行计划、系统表会感觉非常亲切上手成本被压到了最低。现场有位做医疗系统的工程师分享了他们实测的结果一个存量的业务系统大概几千条SQL语句在TiDB上做兼容性测试直接能跑通的比例超过95%剩下那不到5%基本都是Oracle语法遗留比如ROWNUM、CONNECT BY这类MySQL系本就罕见的东西改造成本也可控。2.3 一套库干两件事HTAP的独特价值传统架构里在线事务OLTP和在线分析OLAP通常是两套系统。业务库负责写入和查询数据通过定时同步流入数据仓库或专门的分析库。这套架构稳定但有一个绕不开的痛点时效性。T1的同步意味着今天的报表看不到今天上午的数据。你在零售行业会发现“实时报表”和“高峰期的在线交易”这两个需求放在一起时传统架构很难同时满足。TiDB的HTAP能力就是冲着这个痛点去的。同一份数据TiKV处理高并发的事务读写TiFlash列式副本负责分析查询。应用层不需要改任何SQL只需要把分析类查询路由到TiFlash就能在毫秒级拿到聚合结果数据实时性跟业务完全同步。活动现场一个做零售的企业分享了一个很具体的场景大促期间运营要随时看实时销售额、库存水位、门店Top10商品排名。以前他们靠业务库加定时任务算一算就锁表影响正常下单。迁移到TiDB之后订单数据直接落在TiKV分析查询走TiFlash两边互不干扰。运营要看的实时大屏直接从TiDB出数中间省掉了一整套数据同步链路。2.4 什么样的系统适合纳入TiDB替换范围这也是现场被问得最多的问题。我的判断标准很简单四条数据量或并发到了单机数据库的瓶颈。比如单表过亿或者峰值QPS持续走高MySQL已经要靠分库分表撑着了。对高可用、数据强一致有硬要求。业务不允许丢数据宕机恢复时间要分钟级。业务具备分布式改造的接受度。不是说完全不改但改动量要可控最多是SQL语句级的小改而不是架构级重写。团队有基本的分布式系统认知。哪怕DBA以前只玩过MySQL只要愿意学习Region、Raft、PD这些核心概念TiDB是能接住的。反过来如果系统数据量几个GB并发几百高可用要求也不高那完全没必要上TiDB。单机数据库加主从复制成本更低运维更简单。数据库选型最忌讳跟风得先看清楚自己的边界在哪里。3. 零售、医疗、金融、交通、制造五类业务在TiDB上的落地打法活动现场最受欢迎的是分行业交流环节。每个行业的业务模型不一样落到TiDB上的技术打法差异很大。我把现场讨论的要点和我的实践经验合并在一起逐个行业拆一遍。3.1 零售大促峰值弹性扩容是核心诉求零售行业的核心矛盾是流量波动剧烈。日常订单量级和双十一大促的订单量级可能相差几十倍。传统MySQL架构应对这种峰值要么提前扩容硬件要么分库分表但峰值过去了资源就闲置了。TiDB的弹性扩容能力天然契合这个场景。大促前给集群加几个TiKV节点数据自动均衡容量和写入吞吐跟着涨大促结束节点可以缩回去成本跟着业务走。这个操作在TiDB里就是加节点、等待均衡、删节点三步不需要动业务代码。但零售行业容易踩一个坑热点写。用户下单时订单表如果用的是自增主键那么所有写入都会集中在最后一个Region上形成单一热点。现场有位架构师分享了一个很实用的解法——订单表的主键改用AUTO_RANDOM或者用业务订单号直接做主键让TiDB把写入压力打散到不同的Region上。示例建表语句很简单CREATE TABLE orders ( id BIGINT NOT NULL AUTO_RANDOM, order_no VARCHAR(32) NOT NULL, store_id INT NOT NULL, customer_id BIGINT NOT NULL, amount DECIMAL(12,2) NOT NULL, status TINYINT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;另一个零售高频场景是商品和门店维度的实时分析。比如运营要看“华东区今天卖得最好的100个SKU”这种查询很适合让优化器把分析SQL路由到TiFlash列存节点在线交易和分析互不干扰。3.2 医疗7×24高可用与数据强一致是底线医疗行业对数据库的要求最核心的四个字是“不能出事”。电子病历、门诊挂号、药库管理任何一个环节出现长时间不可用影响的不只是业务还有医疗安全。宕机恢复时间、数据零丢失这些都是硬指标。TiDB通过多副本加Raft协议来满足这个要求。数据写入时必须有多数派副本确认才算提交成功。这意味着单副本故障不会丢数据也不会中断服务。如果做两地三中心部署PD支持自定义副本位置可以规定机房A放两副本、机房B放一副本在保证安全的同时控制异地容灾成本。医疗行业还有一个容易被忽略的需求数据生命周期管理。电子病历按规定要保存多年但活跃查询只集中在近期数据。这种场景适合用TiDB的分区表能力按时间维度做Range分区旧数据可以整体归档甚至DROP分区而不影响在线业务。分区表的建表方式如下CREATE TABLE medical_records ( record_id BIGINT NOT NULL, patient_id BIGINT NOT NULL, visit_time DATETIME NOT NULL, diagnosis TEXT, attending_doctor VARCHAR(64), PRIMARY KEY (record_id, visit_time) ) PARTITION BY RANGE (YEAR(visit_time)) ( PARTITION p2020 VALUES LESS THAN (2021), PARTITION p2021 VALUES LESS THAN (2022), PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION pmax VALUES LESS THAN MAXVALUE );3.3 金融核心链路怎么敢用分布式金融行业是对数据一致性要求最苛刻的领域没有之一。账务系统里的一笔转账涉及账户扣减、交易流水、对端入账任意一步出错或者数据丢失后果都很严重。所以金融团队问的第一个问题往往是分布式数据库能保证强一致吗TiDB的答案是能的而且机制上是可以验证的。TiDB的分布式事务模型基于Percolator结合PD分配全局时间戳能保证跨节点、跨表的事务ACID特性。也就是说你在TiDB里执行一个涉及多张表的大事务要么全部成功要么全部回滚不存在中间状态。配合多副本Raft写入一旦返回成功就意味着数据已经在多数派节点落盘不会因为单个节点宕机而丢失。金融行业另一个需求是审计与风控。传统上交易流水和风控分析是两套系统流水进业务库风控跑数仓中间有分钟级到小时级的延迟。在TiDB上做HTAP改造之后风控分析的实时性可以大幅提升大额交易、异常模式识别不再是事后发现而是可以做到近乎实时的行为监控。当然金融业务对过审极其严格现场做分享的工程师也提醒核心账务系统迁移不是一蹴而就的他们的策略是先拿风控、征信查询、报表这类非账务核心系统试点跑稳定了再往核心链路推进。3.4 交通高并发写入与轨迹查询的双重考验交通行业有一个很典型的场景早晚高峰的卡口过车数据。一个中型城市每天产生几千万条过车记录每一条都要完整落库同时还要求支持按车牌、时间、卡口条件组合查询。这种高并发写入加复杂查询的组合对数据库的写入吞吐和查询性能都提出了很高的要求。TiDB在写入侧的打法是水平扩展。几个亿的过车数据在TiDB里会被自动切片成大量Region分散在多个TiKV节点上并行写入。写入压力大就加TiKV节点吞吐线性增长。查询侧的打法是用好TiFlash。轨迹查询往往要做车牌号加时间的聚合统计这类分析SQL在TiFlash的列式存储上跑比在TiKV上走二级索引再回表的方式快很多倍。现场还有一个有代表性的讨论实时路况大屏。城市交通的实时路况展示数据源是海量GPS轨迹上报。很多团队的第一反应是上Kafka加流计算但从业务端看其实只需要拿到“最近五分钟每条路段的车流量”。流量没那么大的城市直接用TiDB加上定时聚合成本远低于搭一套实时数仓。3.5 智能制造IoT数据与质量追溯的长期战场智能制造的数据特点一是采集密度高二是历史追溯深。一台设备每秒上报一条状态数据一个工厂上千台设备一天就能产生上亿条数据而质量追溯往往要回溯几个月前的某个批次的完整生产记录。IoT数据写入TiDB要注意批量插入的方式。上一篇文章提过大事务限制这里再强调一次TiDB的单事务默认上限是100MB执行时间默认不能超过一小时。如果一边采集一边逐条insert不仅性能差还可能偶发事务超时。正确的做法是攒批插入比如每1000条数据一个事务既压低了事务提交频率又避免了单事务过大。质量追溯场景适合用TiDB的全局索引能力。比如按批次号、设备编号、生产日期组合查询即使在几十亿行的表上只要索引设计合理查询响应都能稳定在百毫秒级。这在过去的MySQL分库分表架构里是很头疼的——数据被拆到几十个库跨库查询要么走中间件要么起临时任务汇总效率极低。TiDB从设计上就避免了这个问题全局索引天然支持跨节点查询。行业核心压力典型场景关键收益特别注意零售流量波动大大促订单、实时库存、实时报表弹性扩容、HTAP自增主键热点医疗高可用强一致电子病历、挂号、药库多副本容灾、数据零丢失数据生命周期管理金融事务强一致转账、账务、风控、审计分布式事务、实时分析试点先行、非核心系统先上交通高并发写入卡口过车、轨迹查询、实时路况水平扩展、TiFlash分析批量写入避免单条插入制造数据密度高IoT设备数据、批次追溯全局索引、弹性存储分批复用、避免大事务4. 迁移上车从存量数据库到TiDB的一次完整手术聊完了行业打法回到最核心的工程问题存量系统怎么迁到TiDB。这一步做不好前面的技术评估全是白搭。我从现场的分享和个人的实操经验里整理了一条完整的迁移路径。4.1 迁移前评估先摸清家底再动刀第一步是盘点存量资产。你需要回答三个问题有哪些数据库实例每个实例上有哪些业务各自的数据量、表结构、SQL特征是什么这里面最花时间的不是数据量统计而是SQL兼容性分析。建议把业务的SQL日志捞出来按语句指纹分类统计每条SQL在TiDB上能否直接执行。我们当时是写了一个脚本从慢查询日志和审计日志里提取出SQL样本跑在TiDB的测试集群上自动归类为“完全兼容”“语法兼容但行为待确认”“完全不兼容”三档。三档的比例决定了这个系统的迁移成本。还有一个容易被忽略的点数据库账号权限和运维脚本。MySQL的授权模型跟TiDB存在一些细节差异比如TiDB的用户权限是全局的粒度没有MySQL那么细。原来那些按账号做权限隔离的脚本迁移后要做对应的调整否则上生产环境第一天就可能遇到权限报错。4.2 工具链从导出到实时同步的完整闭环TiDB官方提供了一整套数据迁移工具这一点比很多闭源国产数据库要省心得多。我按用途列一下Dumpling数据导出工具支持并发导出性能比mysqldump好得多适合做全量数据导出。TiDB Lightning数据导入工具专门针对TiDB做过优化支持并行导入能在较短时间内把几十GB甚至几TB的数据灌进TiDB。DMData Migration数据同步工具支持从MySQL/MariaDB实时同步到TiDB可以做全量加增量的一致迁移。如果你的源库本身就是MySQL系DM是最顺畅的一条路。TiCDCTiDB的变更数据捕获组件可以实时将TiDB的binlog变更推送到Kafka或下游数据库主要用于迁出和双写场景。如果是Oracle存量常见路径是先用OGG或自研ETL工具把数据转换成MySQL兼容格式落到中间库再接DM做增量同步。这个过程会比MySQL直迁多一层但好处是业务侧几乎不需要改数据模型。4.3 全量同步、增量追平、灰度切流三步走的细节全量同步阶段要注意的是同步期间的停业时间。如果要求不停机迁移一般是先跑全量全量导入完成后再用DM切换增量模式。增量追平的意思是让TiDB的数据始终跟着源库走两边数据延迟逐渐缩小到秒级甚至毫秒级。确认增量追平之后就到了最关键的灰度切流。我的建议是分四步先切只读流量。把报表、查询类业务指向TiDB观察查询耗时和正确性。再切非核心写流量。挑一个风险可控的业务模块开启双写或直接切写重点盯数据一致性和事务成功率。数据校验通过后切核心写流量。这里要提前准备回滚预案见下文。老库保留观察。至少跑一个完整的业务周期比如一周确认TiDB侧没有隐患再启动老库下线流程。4.4 回滚方案切流最怕的是开弓没有回头箭很多团队在迁移时最焦虑的就是切到TiDB了万一有问题回不去了怎么办我的经验是回滚方案要在切流之前就准备好而不是切完再想。最稳妥的做法是源库在切换窗口内保持“只读但不杀”。也就是说业务流量切到TiDB之后源库继续保留同时让DM的反向同步方向做起来——如果TiDB侧有写入变更会通过TiCDC实时回流到源库。这样两边数据始终是对齐的万一TiDB侧发现严重问题业务可以在分钟级切回源库数据不缺不漏。当然反向同步的代价是额外的一跳延迟和资源开销所以观察期一般不会拉太长。我们的经验是TiDB侧稳定跑一周期间修复了所有已经暴露的问题反向同步就可以断开了。断开的时机选择业务低峰期断开后源库保留归档权限TiDB正式成为生产主库。5. 踩过才懂国产化落地最痛的几个生产细节这一节全部来自生产环境的真实教训。每一项都是我们或现场同行踩过坑之后用时间和故障换来的经验。写出来是希望你能少走这些弯路。5.1 自增主键热点TiDB压力最大的一课之前在零售章节提过这里展开讲。MySQL时代自增主键是最主流的写法但在TiDB里这个习惯可能演变成性能瓶颈。原因是TiDB的数据按主键排序切片存储自增主键连续增长意味着新写入的数据永远落在最后一片Region上。所有并发写入集中在一个节点其他节点空闲集群整体利用率上不去。解决办法有两个一是主键改用AUTO_RANDOM让TiDB自动生成分散的主键值二是放弃主键的随机性要求改用业务字段做主键比如订单号、设备ID。需要注意AUTO_RANDOM在建表时就要指定后续ALTER TABLE改不了。所以迁移建表阶段就要想清楚这个字段策略。5.2 大事务与GC的相爱相杀TiDB对大事务是有明确限制的单事务默认不能超过100MB执行时间默认不能超过1小时。如果业务里有一把梭的批处理脚本比如每天凌晨一次性UPDATE全表很容易触发报错。更麻烦的是长时间运行的事务会和TiDB的GC垃圾回收机制产生冲突。GC的作用是清理历史版本数据它有安全点保护机制。如果一个事务运行时间太长超出了GC安全点的保护范围就会报“GC life time is shorter than transaction duration”的错误。这不是偶发问题而是机制性的——TiDB为了保持MVCC读一致保留了历史版本但如果历史版本积累过多又会拖慢读写。解决办法是把批量操作拆碎。一次更新十万条拆成每次一千条的小事务间隔几十毫秒提交。这样既能保持业务逻辑完整又不会触发大事务限制也不会和GC打架。5.3 字符集、连接参数与隐式转换这类问题隐蔽性极强往往是业务高峰时突然出现排查半天才发现是底层配置问题。迁移到TiDB后三个高频坑点你要提前检查一是字符集排序规则。MySQL 8.0默认的utf8mb4_0900_ai_ci跟TiDB支持的排序规则存在差异。如果业务原有的建表语句指定了特定排序规则迁移后虽然能建表但查询结果排序可能跟预期不一致。建议迁移时统一成utf8mb4_general_ci或utf8mb4_bin先保证行为一致。二是JDBC连接参数。TiDB兼容MySQL协议但JDBC连接串里如果带了一些MySQL特有的参数比如useSSLfalse之类的在TiDB侧可能表现不同。最稳妥的方法是连接参数尽量精简先跑通业务再逐步补齐安全相关的配置。三是隐式类型转换。MySQL里数字和字符串比较时会有隐式转换TiDB在这方面的行为跟MySQL基本一致但边界场景可能不同。比如WHERE phone 13800138000phone是VARCHAR类型右侧是INT两边引擎的处理结果可能不一样。迁移前最好针对所有条件查询的字段类型做一遍核对避免数据在类型边界上出问题。5.4 容量规划三副本和TiFlash都在吃你的磁盘很多团队在计算TiDB容量时只按源库数据量做乘法结果扩容预算严重超支。这里要算清一笔账TiDB默认三副本意味着你的原始数据量要乘以3这是第一层如果开了TiFlash列存副本TiFlash的副本数量单独计算这是第二层再加上日常的MVCC历史版本、事务日志的开销整体存储用量大约是源库逻辑数据量的4到6倍。这笔账在项目立项时就要算清楚并汇报给管理层否则上线半年后磁盘见底再申请扩容预算流程上会很被动。5.5 慢查询排查用好TiDB Dashboard这张地图TiDB的慢查询定位体验比MySQL好很多。MySQL时代定位慢查询最常用的手段是看慢查询日志和执行计划信息是割裂的。TiDB的Dashboard把所有信息都汇总到了一张图里慢查询列表、执行计划、扫表量和内存占用、甚至关联的SQL语句和表结构都能直接看到。我的建议是迁移完成后的第一个月每天固定时间看一次Dashboard的Top SQL列表。大量成功案例里第一批被揪出来的慢查询一半以上是“原MySQL里尚可接受迁到分布式环境后放大”的语句——比如不带WHERE条件的全表扫描或者关联了十几张表的复杂视图。这类SQL在单机环境也许能靠硬件硬顶但在分布式环境里跨节点的数据扫描会把问题放大好几倍必须尽早改写。6. 会后的一点实话TiDB不是万能钥匙活动最后有个环节是开放讨论主持人问了一个问题TiDB有没有不适合的场景现场安静了几秒然后大家开始轮流吐槽。我觉得这些吐槽非常有价值比任何宣传材料都真实。第一个公认的短板是小规模系统。如果你整个系统的数据量连100GB都不到并发也就几百高可用要求可以通过主从复制满足那就没必要上TiDB。分布式系统带来的节点通信开销、运维复杂度在这个体量下是纯负担性价比很低。第二个是重度存储过程或触发器依赖的系统。TiDB对存储过程的支持能力远比MySQL有限触发器更是原生不支持。如果业务逻辑大量封装在触发器里迁移时要先把这些逻辑改为应用层实现这个改造量可能比想象中大得多。第三个是极端的多表关联查询。TiDB的优化器已经很强但跨节点的表连接特别是三张以上大表做复杂关联性能仍然无法和专门的分析型数据库相比。如果你的核心业务长期跑着这种查询建议把分析负载放到TiFlash或者专门的数据仓库里TiDB更适合做高并发的事务处理和中等复杂度的分析。根据我个人做国产化迁移的经验还有一个容易被低估的点资源投入的评估。很多人以为TiDB是开源的软件不花钱整体成本就低。实际上三副本带来的硬件成本、Tiflash额外存储、升级后的监控告警体系、团队的学习和运维成本加起来的总拥有成本并不低。国产化升级不是一次买断是一个持续投入的工程。但我也要说句公道话框架搭对了TiDB确实是目前国产化升级路径里让人最踏实的数据库底座之一。它开源的架构、活跃的社群、完整的工具链意味着你在生产环境里遇到的问题大概率别人也遇到过TiDB官方和社区都能给出可参考的解法。这一点恰恰是很多闭源国产数据库给不了的。这次在长沙我最大的收获不是某个具体的技术方案而是亲眼看到了一批不同行业的工程师正在踏踏实实地把数据库国产化做成真事。零售、医疗、金融、交通、制造每个行业都有自己的难点但大家都在用同一个引擎、同一套方法论往前走。这让我觉得数据库国产化升级这件事正在从“要不要做”的技术评估阶段切换到“怎么做得更稳”的工程落地阶段。接下来就是看谁能在生产环境里跑得更久、更稳了。
阅读完成 · 觉得有帮助?
咨询建站