ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MySQL分库分表瓶颈后如何平滑迁移TiDB:从弹性扩展到分布式事务实践

MySQL分库分表瓶颈后如何平滑迁移TiDB:从弹性扩展到分布式事务实践 在过去两年里外贸赋能中心的业务体量经历了多轮快速扩张从最初支撑单一业务线的订单数据逐步演变为承载客户画像、商品目录、报价体系、关务数据、物流轨迹等多维数据的核心平台。伴随业务边界不断拓宽原有的 MySQL 分库分表架构开始频繁暴露出运维成本和扩展性方面的问题数据迁移周期长、容量预估困难、大促或业务波峰时段容易出现连接打满和慢查询研发团队需要投入大量精力处理底层数据路由和扩容节奏业务侧却仍然感受不到查询性能的提升。在重新审视整体数据架构的过程中我们评估了多种技术方案最终决定引入 TiDB 作为新的数据底座。选择 TiDB 的核心原因并不是因为它“新”或“热门”而是因为它同时解决了我们在弹性扩展、MySQL 生态兼容、分布式事务和高可用方面最迫切的几个痛点。本文将以这次外贸赋能中心数据架构迭代为背景完整拆解我们为什么选择 TiDB、如何规划部署、数据迁移怎么做、应用层如何平滑接入以及弹性扩缩容和日常运维中的最佳实践。无论你是在做电商、外贸、金融还是物联网业务的数据底座选型只要正面临 MySQL 扩容瓶颈或分布式数据库选型问题这篇文章都值得你花十分钟读完。1. 背景与核心概念1.1 外贸赋能中心的数据业务特征外贸赋能中心本质上是一个面向外贸业务全链路提供数据服务和业务支撑的平台。它的数据特征和普通互联网应用有明显区别。第一业务数据维度多、关系复杂。一个外贸订单往往关联供应商、采购商、货代、报关行、仓库、运输批次等多个参与方数据模型天然具备多对多关系。传统做法是将这些关系通过大量的关联表和外键表达但这在分布式数据库场景下容易成为性能瓶颈。第二读写模式存在明显的周期性波峰。外贸行业受海外市场节假日、大促活动、汇率波动等因素影响业务流量往往在特定时间段内集中爆发。例如黑色星期五、圣诞备货季、海外仓补货周期等节点查询和写入量可能是平时的 3 到 5 倍。这种流量特征要求底层数据架构必须具备快速的弹性伸缩能力而不是提前数月做容量预估。第三数据一致性要求高。报价、库存、订单状态、关务申报等数据一旦出错直接影响业务合规和资金安全。因此像“分库分表后跨节点事务失效”这类问题在外贸场景中是绝对不可接受的。第四分析查询与事务处理并存。业务部门既要在交易链路上做高频的点查和短事务又需要运营团队对历史订单、商品表现、区域销量做多维分析。传统架构通常需要把 OLTP 和 OLAP 拆成两套系统再通过数据同步链路连接链路越长数据延迟和出错概率越高。在这样的背景下我们原有的 MySQL 分库分表方案虽然勉强支撑了业务发展但已经出现明显吃力。分库分表方案中的数据路由规则、分布式主键、跨库查询、全局表管理等问题每一项都在消耗研发资源而且随着业务复杂度上升问题会越来越严重。1.2 什么是数据弹性为什么外贸业务需要它“数据弹性”这个词在数据库领域并没有一个绝对统一的标准定义。结合我们的实践我把它理解为数据库系统能够根据业务负载的变化动态调整计算资源和存储资源且整个过程不需要中断业务也不需要人工介入大量数据迁移工作。数据弹性包含两个维度垂直弹性单机配置的升降级例如 CPU、内存扩容。MySQL 的垂直扩容有一定作用但存在硬件上限且扩容期间往往需要重启实例。水平弹性通过增加或减少节点来线性提升系统整体能力。这是分布式数据库的核心能力也是解决大数据量、高并发场景的根本手段。外贸赋能中心的业务特征决定了它需要的是“水平弹性”。因为业务峰值通常难以精确预测如果按照峰值容量采购硬件日常运行会产生巨大浪费如果按照平均值采购峰值时段又会服务降级。TiDB 的分布式架构天然支持水平扩缩容可以在业务低峰期缩容节省成本在业务高峰期快速扩容保障稳定这正是我们选择它作为新底座的关键原因。这里也要澄清一个容易混淆的概念数据弹性不是“自动伸缩”。自动伸缩通常指通过监控指标触发 K8s 或云平台的自动扩容动作而 TiDB 提供的是“可以弹性伸缩的底层能力”——扩容和缩容的命令、数据再平衡的机制、对业务透明的影响范围。是否实现自动触发还需要结合你自己的监控告警和运维平台来实现。1.3 TiDB 在架构迭代中的定位在引入 TiDB 之前我们内部也做过一轮技术预研对比了包括 ShardingSphere MySQL、CockroachDB、OceanBase、TiDB 在内的多种方案。最终选择 TiDB主要看中四点MySQL 协议兼容应用层可以最小化改造DBA 和开发人员的学习成本低。分布式事务支持不需要像分库分表那样在业务层处理分布式事务问题。原生水平扩展能力通过增加 TiDB Server 节点和 TiKV 节点即可线性扩展业务无感知。混合负载能力TiDB 和 TiFlash 的结合让同一份数据既能做事务处理又能跑分析查询减少冗余数据链路。在我们的新架构中TiDB 承担的是“统一数据底座”的职责。订单、商品、客户、库存、报价等核心业务数据统一存放在 TiDB应用层通过标准 MySQL 协议访问。部分非核心的日志数据和离线分析数据仍然保留在原有的大数据体系中通过数据同步任务定时沉淀到数仓。这样的设计既让核心链路获得分布式能力又不至于把所有类型的存储需求都堆在 TiDB 上。2. 环境准备与版本说明2.1 部署架构规划TiDB 集群的部署架构和传统 MySQL 主从架构有很大区别。一个完整的 TiDB 集群至少包含以下三类组件TiDB Server负责 SQL 解析、优化、执行是无状态计算节点可以水平扩展。TiKV负责分布式事务 KV 存储数据自动分片为 Region是存储节点。PDPlacement Driver负责集群元信息管理、Region 调度、时间戳分配是整个集群的“大脑”。另外如果业务需要 HTAP 能力可以额外部署 TiFlash 列存节点用于承载分析型查询。我们最初没有直接部署 TiFlash是在上线后业务分析需求增加时才补充的这里建议如果你已经有明确的 OLAP 需求可以在规划阶段就把 TiFlash 纳入部署范围避免后续增加节点时的数据同步压力。2.2 版本与硬件建议TiDB 的版本迭代速度较快不同版本在部署方式和功能特性上存在差异。本文写作时的常见部署方式是使用 TiUP 工具它支持一键部署、扩缩容、升级等操作。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。硬件方面结合外贸业务中等规模数据量的实际情况建议按以下标准做初始规划组件节点数配置建议说明TiDB Server2 或 316C32G无状态计算节点可通过负载均衡对外提供服务TiKV316C64G SSD至少 3 节点建议 5 节点起步以获得更好稳定性PD38C16G奇数节点建议 3 节点部署TiFlash可选1 或 216C64G SSD根据分析查询需求决定操作系统建议使用 CentOS 7.9、Rocky Linux 8 或 Ubuntu 20.04文件系统推荐 ext4 或 xfsTiKV 节点必须使用 SSD。需要强调的是TiKV 是 IO 敏感型组件机械硬盘或低性能云盘会严重影响写入性能。2.3 环境初始化在正式部署前需要对所有服务器做一些基础初始化操作主要包括关闭防火墙或放通端口、配置时间同步、调整系统文件句柄数、关闭 swap 或合理配置 swappiness。TiDB 集群需要放通以下端口TiDB Server4000客户端连接、10080状态端口TiKV20160PD2379客户端、2380集群通信TiFlash3930TCP 通信、20170复制监听初始化脚本的核心部分如下# 调整系统参数 cat /etc/sysctl.conf EOF fs.file-max 1000000 net.core.somaxconn 32768 net.ipv4.tcp_tw_reuse 1 vm.swappiness 0 EOF sysctl -p # 调整文件句柄数 cat /etc/security/limits.conf EOF * soft nofile 1048576 * hard nofile 1048576 root soft nofile 1048576 root hard nofile 1048576 EOF # 配置时间同步 yum install -y chrony systemctl enable chronyd systemctl start chronyd chronyc sources -v这些基础配置对于 TiDB 集群的长期稳定运行非常重要。文件句柄数不足会导致高并发下连接异常swap 配置不当会引起 TiKV 性能抖动时间不同步则会导致 PD 分配的时间戳出现偏差从而引发分布式事务异常。2.4 使用 TiUP 部署集群TiUP 是 TiDB 官方提供的集群运维工具类似于 Kubernetes 领域的 kubectl。通过 TiUP可以完成集群部署、扩缩容、升级、销毁等操作。首先在中控机上安装 TiUPcurl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh source ~/.bashrc然后编写集群拓扑文件下面是一个最小拓扑示例# 文件路径topology.yaml global: user: tidb ssh_port: 22 deploy_dir: /tidb-deploy data_dir: /tidb-data arch: amd64 os: linux pd_servers: - host: 10.0.1.11 - host: 10.0.1.12 - host: 10.0.1.13 tidb_servers: - host: 10.0.1.21 - host: 10.0.1.22 tikv_servers: - host: 10.0.1.31 - host: 10.0.1.32 - host: 10.0.1.33 monitoring_servers: - host: 10.0.1.41 grafana_servers: - host: 10.0.1.41 alertmanager_servers: - host: 10.0.1.41执行部署命令tiup cluster deploy tidb-test v8.1.0 ./topology.yaml --user root -p tiup cluster start tidb-test tiup cluster display tidb-test部署完成后可以通过 MySQL 客户端连接 TiDB 验证集群状态mysql -h 10.0.1.21 -P 4000 -u root -p登录后执行SHOW DATABASES; SELECT * FROM information_schema.cluster_info;如果能看到集群中所有组件的信息说明 TiDB 集群已经成功运行。3. 核心原理拆解TiDB 的数据弹性从何而来3.1 整体架构计算与存储分离理解 TiDB 的数据弹性首先要理解它的架构设计。TiDB 采用了典型的计算与存储分离架构TiDB Server 负责 SQL 层TiKV 负责存储层PD 负责调度管理。这种架构带来的最直接好处是计算节点和存储节点可以独立扩展。当业务并发升高时增加 TiDB Server 节点即可提升 SQL 处理能力当数据量增大或写入压力升高时增加 TiKV 节点即可提升存储容量和写入吞吐。两者互不干扰也不需要对现有节点做数据搬迁。对比之下MySQL 分库分表方案的水平扩展非常痛苦。每次扩容都需要重新评估数据分布规则迁移大量数据修改路由配置风险很高。TiDB 的扩缩容操作对应用透明数据自动重新平衡这是质的区别。3.2 Region数据弹性的最小单元TiKV 存储层并不是把数据简单地按行或按表存储而是将数据划分为多个 Region。每个 Region 是数据的一个连续片段默认容量约 96MB内部按照 Key 范围有序排列。当某个 Region 的数据量超过阈值时它会自动分裂成两个更小的 Region当集群中某个 TiKV 节点的负载明显高于其他节点时PD 会自动将一部分 Region 调度到低负载节点。这套机制就是 TiDB 数据弹性的底层基础。“Region 自动分裂 调度”听起来很抽象我们可以类比一下想象一个大仓库货架之间空间分布不均有些货架快满了有些还很空。Region 分裂相当于把快满的货架拆成两个调度相当于把货物搬到空货架上。整个过程不需要关仓库门顾客随时可以进来取货。实际业务中我们不需要关心 Region 的具体数量和管理细节但理解 Region 机制对下面几个决策很有帮助为什么 TiKV 节点建议至少 3 个因为 Region 默认保存 3 个副本少于 3 个节点会限制调度能力。为什么 TiKV 扩容后性能不会立刻提升因为数据从旧节点迁移到新节点需要时间PD 会控制调度速度。为什么小表也可能产生大量 Region频繁写入的热点表也可能触发 Region 分裂这对设计表结构有影响。3.3 PD 调度集群的自动化运维大脑PD 是整个集群的调度中心维护了 Region 的分布、副本状态、负载信息等元数据。它的调度决策决定了数据如何分布、副本如何摆放、负载如何均衡。PD 支持的主要调度策略包括副本调度保证每个 Region 的副本数量满足配置要求例如 3 副本。负载均衡将读写压力从高负载节点转移到低负载节点。热点调度识别热点 Region 并打散避免单个 TiKV 节点成为瓶颈。缩容调度当节点下线时将该节点的 Region 迁移到其他节点。这些调度策略是自动执行的但作为 DBA 或运维工程师可以通过 PD 的调度参数控制调度速度避免在业务高峰期大量迁移数据影响性能。例如可以在业务低谷期适当调大调度并发数加快数据再平衡速度在业务高峰期调小调度并发数减少对在线业务的影响。# 查看当前调度参数 tiup ctl pd config show # 调整调度并发这里以调整 store limit 为例 tiup ctl pd store limit # 设置节点级别的调度限流 tiup ctl pd store limit all 50这里需要提醒的是调度参数调整要谨慎建议在测试环境验证后再修改生产配置。3.4 与 MySQL 生态的兼容性TiDB 最吸引 MySQL 团队的一点就是生态兼容性。它支持 MySQL 协议兼容绝大部分 MySQL 语法这意味着已有的 MySQL 驱动、ORM 框架、监控工具都能直接使用。具体来说连接方式使用 MySQL 客户端、JDBC、Go MySQL Driver、Python PyMySQL 等都可以直接连接 TiDB。SQL 语法支持大部分 MySQL DDL、DML 语法包括事务、索引、视图、存储过程部分支持。数据迁移官方提供 DMData Migration工具可以将 MySQL/MariaDB 数据平滑迁移到 TiDB。数据同步TiDB Binlog 可以将 TiDB 的数据变更实时同步到下游 MySQL、Kafka 等系统。这让外贸赋能中心的应用改造工作量大为降低。原本基于 MySQL 的 MyBatis、MyBatis-Plus、Spring Data JPA 等框架几乎不需要修改 SQL只需要调整数据源连接配置。当然也有一些 MySQL 特性 TiDB 并不完全支持例如外键约束的支持力度有限全文索引实现方式不同分区表语法和 MySQL 有差异。这些问题我们在实战改造时要注意规避。4. 完整实战案例从 MySQL 迁移到 TiDB 全流程4.1 迁移前评估与容量规划在正式启动迁移前我们花了大约两周时间做迁移评估。这部分工作如果省略后面大概率会踩坑。评估内容主要包括以下几个方面实例清单梳理统计所有需要迁移的 MySQL 实例、库表数量、数据总量、每日新增数据量。访问方式盘点梳理应用连接 MySQL 的方式包括连接池配置、读写分离逻辑、依赖的 SQL 特性。特殊 SQL 审计找出含有 MySQL 特有语法、存储过程、触发器的 SQL评估改造方案。容量规划根据业务增长预估 TiDB 集群需要的存储容量和 QPS 能力推算 TiKV 节点数量。容量规划方面我们使用的经验公式是单 TiKV 节点的有效存储约为磁盘容量的一半考虑 3 副本、RocksDB 压缩、空间预留。例如单节点 2TB SSD3 节点集群的有效存储约为 2TB × 3 / 3 2TB约一半预留。估算时建议预留未来 12 个月的增长空间同时留出 20% 的余量。以一个数据量为 5TB、日增约 20GB 的业务为例12 个月后数据量约为 12TB加上余量按照 15TB 规划需要 TiKV 有效存储不低于 15TB。单节点有效存储约 1TB则需要至少 15 个 TiKV 节点的存储空间但考虑到写入吞吐和热点问题实际部署建议不少于 5 个 TiKV 节点再结合数据量选择更高容量的磁盘。4.2 使用 DM 完成全量 增量数据迁移TiDB 官方提供了 DMData Migration工具专门用于从 MySQL 迁移数据到 TiDB。它支持全量数据导入和增量 Binlog 同步可以在业务不停机的情况下完成迁移。DM 的核心组件是 DM-worker 和 DM-master。DM-worker 负责执行数据迁移任务DM-master 负责管理调度。我们需要在一台服务器上部署 DM 集群然后配置迁移任务。配置文件分为两部分source数据源配置和 task迁移任务配置。数据源配置# 文件路径mysql-source.yaml source-id: mysql-source-01 from: host: 10.0.2.10 port: 3306 user: dm_user password: xxxxxx enable: - relay迁移任务配置# 文件路径dm-task.yaml name: full-incremental-task task-mode: all # all 表示全量 增量 is-sharding: false target-database: host: 10.0.1.21 port: 4000 user: root password: xxxxxx mysql-instances: - source-id: mysql-source-01 block-allow-list: business-tables route-rules: [] block-allow-list: business-tables: do-dbs: [order_db, product_db, customer_db]启动 DM 集群并创建迁移任务tiup dm deploy dm-test v8.1.0 ./dm-topology.yaml --user root -p tiup dm start dm-test tiup dmctl --master-addr 10.0.1.51:8261 operate-source create mysql-source.yaml tiup dmctl --master-addr 10.0.1.51:8261 start-task dm-task.yaml在迁移过程中可以通过 dmctl 查看任务状态tiup dmctl --master-addr 10.0.1.51:8261 query-status full-incremental-task当全量数据导入完成且增量同步延迟接近 0 时就可以进行应用切换。切换时只需要把应用的数据库连接地址从 MySQL 改到 TiDB然后观察业务运行情况确认无误后再停止 DM 增量同步任务。4.3 应用层接入与读写路径改造应用接入 TiDB 的改动比我们预想的要小得多。因为我们使用 Spring Boot MyBatis-Plus 技术栈只需要修改数据源配置文件。改造前spring: datasource: url: jdbc:mysql://10.0.2.10:3306/order_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: order_app password: xxxxxx driver-class-name: com.mysql.cj.jdbc.Driver改造后spring: datasource: url: jdbc:mysql://10.0.1.21:4000/order_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghairewriteBatchedStatementstrue username: order_app password: xxxxxx driver-class-name: com.mysql.cj.jdbc.Driver这里需要注意一个关键配置rewriteBatchedStatementstrue。这个参数原本在 MySQL 中用于优化批量插入性能在 TiDB 中同样重要。如果关闭MyBatis-Plus 的批量插入会被拆成单条执行性能会差很多。另一个需要关注的改造点是分布式事务场景。如果你原来依赖 MySQL 的本地事务切换到 TiDB 后本地事务依然有效。但如果你原来在分库分表中间件上使用了分布式事务如 Seata迁移到 TiDB 后可以考虑直接使用 TiDB 的分布式事务能力省掉中间件层的复杂度。4.4 弹性扩缩容实操演练TiDB 的弹性扩缩容是架构迭代中重要的验证环节。我们在测试环境做了多次演练确保后续生产扩容时可以顺利进行。增加 TiDB Server 节点tiup cluster scale-out tidb-test ./scale-out-tidb.yaml其中 scale-out-tidb.yaml 的内容tidb_servers: - host: 10.0.1.23 ssh_port: 22 port: 4000 status_port: 10080 deploy_dir: /tidb-deploy/tidb-4000 log_dir: /tidb-deploy/tidb-4000/log增加 TiKV 节点tikv_servers: - host: 10.0.1.34 ssh_port: 22 port: 20160 status_port: 20180 deploy_dir: /tidb-deploy/tikv-20160 data_dir: /tidb-data/tikv-20160 log_dir: /tidb-deploy/tikv-20160/log执行扩容命令tiup cluster scale-out tidb-test ./scale-out-tikv.yaml扩容后可以通过 Grafana 或 PD 监控页面观察 Region 的调度情况。你会发现新节点加入后数据并不会立即全部迁移过来而是由 PD 控制调度速度逐步均衡。这个过程可能需要几小时甚至几天具体取决于数据量和调度参数设置。缩容操作类似tiup cluster scale-in tidb-test --node 10.0.1.34执行缩容命令后PD 会先将该节点上的 Region 迁移到其他节点然后才下线节点。这个过程对业务是透明的但需要注意确保集群剩余节点的容量足以承接数据。4.5 业务验证与监控体系搭建集群部署和数据迁移完成后不能马上宣布上线完成。我们制定了完整的业务验证清单核心验证点包括功能验证核心业务链路订单创建、查询、更新、关务申报跑通数据正确。性能验证对比迁移前后常见查询的响应时间确认没有出现明显的性能回退。容量验证模拟未来 12 个月数据量增长观察集群水位。高可用验证随机重启一个 TiKV 节点确认业务无感知。容灾演练模拟单机房故障验证跨机房容灾能力如果有多机房部署。监控体系方面TiDB 默认部署了 Prometheus Grafana 监控方案。我们在 Grafana 上重点关注的指标包括QPS、TPS、延迟判断整体负载。TiKV CPU、内存、磁盘 IO判断存储节点健康状态。Region 数量与分布判断数据均衡程度。热点 Region 监控识别读写热点。慢查询日志定位 SQL 性能问题。集群错误日志提前发现隐患。这些监控指标我们配置了对应的告警规则告警渠道接入了企业微信机器人确保问题发生时能第一时间通知值班人员。5. 常见问题与排查思路在 TiDB 落地过程中我们遇到了一些问题也收集了社区里其他团队常踩的坑。下面整理成表格方便你按图索骥。问题现象常见原因解决思路应用连接 TiDB 偶尔超时连接池配置过小或 TiDB Server 节点负载不均检查 TiDB Server 负载调大连接池上限确保负载均衡器配置正确批量写入速度慢缺少 rewriteBatchedStatements 参数在 JDBC URL 中增加 rewriteBatchedStatementstrue扩缩容后性能没有即刻提升Region 正在迁移数据尚未均衡观察 Region 调度进度等待调度完成必要时调大调度并发单个 SQL 查询特别慢缺少合适的索引或产生大范围扫表使用 EXPLAIN 分析执行计划优化 SQL 或添加索引磁盘占用增长过快TiKV 的 Region 副本比例高或数据膨胀检查副本数配置合理设置 region 大小和压缩策略跨域或跨机房读取延迟高数据副本分布在异地合理规划副本放置策略必要时使用标签和隔离级别下面挑两个典型问题展开说明。问题一批量插入性能远低于 MySQL我们刚接入 TiDB 时发现批量导入数据的耗时比 MySQL 高了近一倍排查后发现是 JDBC 连接串没有配置批处理参数。TiDB 本身对批量写入是支持的但应用驱动默认可能把批量操作拆成单条执行。添加rewriteBatchedStatementstrue后写入性能提升约 3 倍。这个问题非常隐蔽建议所有接入 TiDB 的 JDBC 应用都默认配置该参数。问题二缩容节点长时间处于下线中状态执行缩容命令后节点状态长时间显示为下线中。原因通常是该节点上有大量的 Region 需要迁移而 PD 为了提高业务稳定性对调度速度设置了限制。解决办法是如果业务处于低峰期可以适当调大迁移并发例如使用tiup ctl pd config set max-snapshot-count 64临时调大快照迁移速率。但要注意调度完成后建议恢复默认值避免影响正常业务的磁盘 IO。6. 最佳实践与工程建议6.1 容量规划要“先算后建”TiDB 集群建设最忌讳边跑边加资源。虽然 TiDB 支持在线扩容但如果初始节点太少数据重分布需要很长时间期间可能影响业务。建议在项目初期就根据数据增长曲线、业务峰值 QPS、备份恢复时间等指标综合计算 TiKV 节点数量和磁盘配置。这里的原则是TiKV 节点宁可多部署一两个也不要卡着最小规模上线。6.2 表结构设计与 SQL 规范TiDB 虽然兼容 MySQL但分布式场景下的表结构设计有一些额外注意点尽量避免使用过于宽泛的表结构列数过多会影响存储和传输效率。主键最好使用自增整数或雪花 ID避免随机字符串做主键因为随机主键容易导致热点写入。合理设计分区表。TiDB 对分区表的支持与 MySQL 存在差异需要在测试环境充分验证。外键约束尽量在应用层实现减少分布式事务的复杂度。对高频查询字段建立二级索引同时注意索引数量和写入性能的平衡。SQL 规范方面我们要特别强调执行计划分析。TiDB 提供 EXPLAIN 语句可以方便地查看 SQL 执行计划识别全表扫描、索引失效等问题。上线前应该对核心 SQL 逐个做执行计划审查。6.3 监控告警与值班机制数据底座稳定运行不能靠“人肉盯着”。我们建议建立三级监控告警机制第一级基础设施监控。包括服务器 CPU、内存、磁盘、网络使用 Prometheus Node Exporter 实现。第二级数据库组件监控。包括 TiDB Server、TiKV、PD 的运行指标使用 TiDB 自带监控组件。第三级业务链路监控。包括核心 API 的响应时间、错误率、数据库慢查询次数使用 SkyWalking 或自研监控系统实现。告警规则要分层通知例如“集群节点宕机”通知全体 DBA 和研发负责人“单个 SQL 慢查询次数增加”通知相关应用负责人。避免所有告警都推送给所有人造成告警疲劳。6.4 变更管理与灰度发布数据库架构迭代中变更管理是最高风险环节。我们的实践是建立严格的变更审批流程所有 DDL 变更必须先在测试环境执行观察执行计划变化和锁等待情况。生产 DDL 尽量在业务低峰期执行使用pt-online-schema-change这类工具也存在一定限制最好使用 TiDB 原生支持的在线 DDL。应用切换实行灰度发布先切 5% 流量验证再逐步扩大到 100%。每次变更前准备回滚方案包括回滚 SQL、备份文件、数据同步链路等。6.5 权限与安全控制TiDB 的权限管理体系与 MySQL 类似支持用户、角色、库表级权限控制。我们在生产环境遵循最小权限原则应用账号只授予业务库的 SELECT、INSERT、UPDATE、DELETE 权限不授予 DDL 权限。DDL 操作通过独立的运维账号执行操作留痕。开启 TiDB 的审计日志功能记录重要操作。数据库连接必须使用 TLS 加密传输防止数据在网络上被窃取。需要特别提醒的是在未获得合法授权的情况下任何数据库变更、数据导出和权限调整都是不被允许的。所有操作都应在公司审批流程内进行并在测试环境中完成验证。7. 总结与下一步这次外贸赋能中心数据架构迭代核心成果是完成了从 MySQL 分库分表到 TiDB 分布式架构的平滑切换。我们获得了几个明确收益扩缩容不再需要业务停机、数据自动均衡不再依赖人工迁移、分布式事务由数据库原生支持、分析查询与事务处理可以共享同一份数据。对业务团队来说最直接的感受是“能扛住大促了”对研发团队来说“不用再写分库分表的业务代码了”。如果你正在考虑引入 TiDB建议先做三件事第一梳理清楚现有 MySQL 上依赖了哪些特殊特性评估兼容成本第二在真实数据量和真实业务流量下做性能测试不要只依赖官方文档上的 Benchmark第三规划好数据迁移和回滚方案确保每一步都可逆。希望这篇文章能为你提供一些参考。文中涉及的部署命令和配置示例在实际环境里要根据你的版本和网络规划做调整。如果后续你在 TiDB 落地过程中遇到问题欢迎在评论区交流。
返回列表