Vitess v15.0.4 版本全解析:Online DDL 原子切换、复制管理修复与查询计划器增强
2026/9/20 22:02:01 网站建设 项目流程
  • 数据库
  • 分布式数据库
  • 云原生
  • 后端
  • 数据存储

【免费下载链接】vitess

Vitess is a database clustering system for horizontal scaling of MySQL.

项目地址:https://gitcode.com/gh_mirrors/vi/vitess
点击查看免费下载

导读

本文基于 Vitess 官方发布说明,系统解读 v15.0.4 补丁版本的全部变更:从 Online DDL 原子切换(atomic cut-over)这一重大能力回溯,到查询计划器(planbuilder/gen4)的多项修复、Schema Tracker 对视图错误的容错处理、复制源管理的行为修正,以及 MySQL 8.0 下表大小查询的性能优化。读完本文,你将清晰了解该版本修复了哪些生产环境痛点、每个修复背后的源码级原理,以及升级到 v15.0.4 后可以预期的稳定性与性能收益。

版本定位:一个以稳定性为重的补丁版本

Vitess v15.0.4 是 v15 系列的第 4 个补丁版本,属于维护性发布。从变更分类看,该版本的核心工作集中在Bug fixes(缺陷修复)Performance(性能优化)Testing(测试稳定化)三个方向,没有引入破坏性的新特性,而是围绕复制管理、查询计划、Schema 跟踪、Online DDL 等生产核心链路做收敛与加固。对于正在运行 v15 系列的集群,这是一个值得关注的升级目标。

变更涉及的主要领域与对应发布说明条目:

领域变更类型代表性 PR
Online DDLBug fix(特性回溯)#13376
Query ServingBug fix / Enhancement#12824、#12968、#13035、#13167、#13196
Schema TrackerBug fix#13425、#13457
Cluster managementBug fix#13393、#13403
TabletManagerPerformance#13388
Build/CI、Testing工具链与测试稳定化#12847、#12853、#12821、#13570 等

核心亮点:Online DDL 原子切换(atomic cut-over)

v15.0.4 最重要的变更之一是"vitess Online DDL atomic cut-over"(PR #13376),这是从后续版本回溯(backport)到 v15 分支的关键能力。它直接关系到 Online DDL 在生产环境切换表时的数据一致性与集群可用性。

从项目文档的定位看,Vitess 的 Online DDL 机制允许大表迁移"通过只需数秒的原子切换步骤"完成(见 README.md),这一设计正是为了把 DDL 对主库的影响降到最低。原子切换的核心思想是:在迁移表(shadow table)与源表之间进行切换(cut-over)时,确保切换动作本身是原子的——要么完全成功,要么完全不生效,避免出现数据写入中间状态。

在 v15.0.4 之前的早期实现中,切换过程存在竞态窗口,事务可能在切换过程中被错误路由。原子切换通过改进切换阶段的锁定与事务处理时序,保证了:

  • 切换瞬间的写入不会丢失或重复;
  • 应用层无感知,无需停机窗口;
  • 后续ALTER语句在 VReplication 确认完成后再进行切换,减少 ghost 写入。

需要说明的是,原子切换能力在后续版本中持续演进,v15.0.4 是将这一成熟机制稳定回溯到 v15 分支,让仍停留在 v15 系列的集群也能获得该保障。

Query Serving:查询计划与执行链路的全面修复

v15.0.4 在查询服务(Query Serving)上投入最大,涉及计划器(planner)、解析器(sqlparser)与执行器(tablet server)多个层面。

计划器(planbuilder / gen4)修复

不将聚合下推到派生表(derived table)(PR #12824):planbuilder 此前可能错误地将聚合操作下推到子查询/派生表内部,导致结果集在语义上被改变(例如LIMITGROUP BY与外层聚合的相互作用)。该修复确保聚合保留在外层执行,避免因下推产生错误行数或错误分组。

未分片路由与分片 JOIN 之间的 UNION DISTINCT 修复(PR #12968):UNION DISTINCT在"未分片表路由 + 分片表 JOIN"的混合场景下,此前会产生错误的去重语义。修复后,该组合的执行计划能正确合并结果并去重,保证跨分片查询结果与单机 MySQL 语义一致。

JOIN ON 表达式在子查询中的作用域规则修正(PR #12890,Enhancement 分类):子查询内部 JOIN ON 子句中的列引用作用域(scoping)此前存在解析偏差,修复后更符合 SQL 标准的作用域查找顺序(内层优先),避免误解析外层同名列。

支持带参数的last_insert_id()(PR #13035):gen4 计划器此前只接受无参的last_insert_id(),而 MySQL 8.0 支持last_insert_id(expr)形式。此修复让INSERT ... ON DUPLICATE KEY UPDATE等依赖last_insert_id(expr)返回值的场景在 Vitess 中正确执行。

解析器与查询路由修复

移除 sqlparser 的缩进限制(PR #13167):解析器对 SQL 文本的缩进深度存在隐藏上限,超深缩进的查询会解析失败。该修复移除了这一限制,使深层嵌套的查询文本能够被正确解析。

ResilientQuery 初始化期间结果正确性修复(PR #13086):在查询路由缓存/健康状态初始化阶段,resilientQuery机制此前可能返回不完整或陈旧的结果,修复后初始化期间也会返回正确数据。

TabletServer 的 ReserveBeginExecute 错误处理(PR #13196):ReserveBeginExecute(用于"预留 + 开启事务"的组合 API)在出错时此前没有返回事务 ID,导致调用方无法正确回滚或恢复。修复后即使出错也会返回事务 ID,保证事务资源可被正确清理。

复制与流式查询修复

Health streamer 中的 errant GTID 修复(PR #13226):health streamer(用于向集群报告 tablet 健康状态与复制位置)在某些情况下会误报 errant GTID(游离 GTID),导致PRIMARY/REPLICA状态判断异常。该修复规范了 GTID 的读取与上报逻辑,避免因游离 GTID 触发错误的故障转移判断。

Schema Tracker:视图错误容错与重载逻辑加固

v15.0.4 对 Schema Tracker(表结构跟踪引擎)做了两项重要修复,直接关系到大表结构变更时 tablet 的可用性:

Schema Engine 重载时忽略读取表数据的错误(PR #13425):在Schema.EngineReload过程中,如果某个表的元数据读取失败(例如表被并发 DROP、权限不足),此前整个重载流程会失败并影响后续所有表的结构更新。修复后,读取失败的表会被跳过而非中断整体重载。

仅对视图忽略列读取错误,对表仍然报错(PR #13457):在第一次修复的基础上进一步细化——只有view(视图)的列读取错误被忽略,表(table)的列读取错误仍然会如实上报。这一区分的背景在源码注释中有清晰说明:MySQL 在视图被修改时不会更新create_time字段(见 engine.go),因此无法依赖时间戳判断视图是否变更,必须通过额外查询changedViews来比对视图定义(见 engine.go)。既然视图本就存在这类"难以可靠跟踪"的特性,读取失败时选择跳过是务实的选择;而表结构是查询计划的基础,必须严格校验。

这两项修复共同降低了"一个坏视图拖垮整个 schema 重载"的风险,对于存在大量视图或经常调整视图定义的集群尤为关键。

Cluster Management:复制源管理与 reparent 行为修正

防止每次设置复制源时都重置复制(replication reset)(PR #13393):此前每次执行Change replication source(设置复制源)时,Vitess 都可能触发复制重置(例如重置复制坐标、清空中继日志等),这在复制本身健康时是不必要的,还会引入瞬时的复制中断。修复后,仅在真正需要时重置复制,减少对复制链路的扰动。

主机为空时不再执行任何 reparent 命令(PR #13403):在进行主从切换(reparent)相关操作时,如果目标主机(host)为空,此前可能仍会下发 reparent 命令,导致对空主机执行无意义甚至有害的操作。修复后会在命令下发前校验主机是否为空,为空则直接跳过,避免误操作。

TabletManager 性能优化:MySQL 8.0 表大小查询重写

v15.0.4 的 Performance 分类下有一项值得关注的变化:BaseShowTablesWithSizes 对 MySQL 8.0 的查询优化(PR #13388)。

表大小信息是 Online DDL 决策(例如估算迁移成本、决定执行策略)的重要输入。在早期实现中,表大小通过BaseShowTablesWithSizes查询获得。在 go/mysql/flavor.go 中可以看到该查询按数据库 flavor 分派,而 MySQL 8.0 的实现(InnoDBTableSizes)在 go/mysql/flavor_mysql.go 中被定义为一条基于information_schema.innodb_tablesinformation_schema.innodb_tablespaces的 JOIN 查询:

  • 普通表大小:通过it.nameits.file_size/its.allocated_size关联获得,并排除fts_%前缀的全文索引内部表;
  • 隐藏表(如 FULLTEXT 索引内部表)大小:单独UNION ALL汇总;
  • 表名以 InnoDB 编码形式(如my@002ddb/my@002dtable)返回,读取方需解码。

该查询的设计初衷正是为了规避在 MySQL 8.0 上扫描information_schema.tables全部行的高昂成本。v15.0.4 的这次优化进一步打磨了这条查询(MySQL 8.0 场景),使其在表数量巨大(例如数千张表)的实例上更快返回,从而缩短 Online DDL 的前置评估时间。对于 MySQL 5.7,代码中保留了走基础BaseShowTables的降级路径,并明确注释了原因:带 size 的查询在 Aurora 等外部数据库上表数量多时"经常超时"(见 flavor_mysql.go)。

字段结构定义位于 go/mysql/schema.go:BaseShowTablesWithSizesFields在基础表字段之上追加i.file_sizei.allocated_size两个INT64字段,schema engine 据此解析表大小。

构建、CI 与测试稳定化

v15.0.4 在工程效率层面也做了大量收尾工作:

  • 工具链版本固定:升级/降级测试改用go1.20.3go1.20.4go1.20.5(PR #12839、#13071、#13271),保证 CI 环境一致性与可复现性。
  • golangci-lint 加固:为 golangci-lint 添加超时并升级版本(PR #12853),随后又回滚了一次引发问题的版本提升(PR #12910),体现了 CI 工具的谨慎演进。
  • auto-upgrade 工具修复:对自动升级 golang 工具的少量修正(PR #12847)。
  • fakedbclient 加锁:为测试用假数据库客户端添加锁以避免数据竞争(PR #12821)。
  • 发布说明生成优化:使用 GitHub Milestones 驱动发布说明生成,并支持用 flag 控制生成线程数(PR #13398、#13315)。
  • 示例修复examples/compose修复consul:latest镜像与docker-compose up -d的兼容性问题(PR #13471)。
  • 测试去抖(de-flake):修复plan_test.go基准测试(#13125)、TestGatewayBufferingWhileReparenting(#13502)、wrangler 测试(#13570)、VTOrc 测试(#13529)以及vtgate_schema_tracker不稳定测试(#12850)。

测试稳定化看似琐碎,但对大型分布式系统意义重大:它可以显著减少 CI 噪音,让真实的回归问题更快暴露。

运维与代码整洁度

  • VTOrc 日志收敛(PR #13463):移除 VTOrc(Vitess 编排器,负责复制拓扑管理与故障转移)API 中的过量日志,降低高流量场景下的日志写入压力与磁盘消耗。
  • vitess-operator 版本更新(PR #12993):示例改用 vitess-operatorv2.8.4,保证示例与最新 operator 行为一致。

升级建议与总结

v15.0.4 是一份典型的"夯实型"补丁:它不引入新功能,但系统性修复了查询计划正确性、复制管理行为、Schema 重载健壮性与表大小查询性能等生产关键路径问题。以下几类用户尤其值得关注本次升级:

  1. 大量使用 Online DDL 的集群:获得 atomic cut-over 回溯保障,以及 MySQL 8.0 下表大小评估的性能优化;
  2. 存在复杂 JOIN/子查询/UNION 场景的集群:多项计划器正确性修复直接降低"查询结果与单机 MySQL 不一致"的风险;
  3. 维护大量视图的集群:Schema Tracker 的视图错误容错避免单点结构问题拖垮整体重载;
  4. 运行 VTOrc 的部署:日志收敛与测试稳定化带来更干净的运维体验。

升级时请遵循 Vitess 官方的跨版本升级路径(v15.0.x 系列内升级风险较低),并在升级后重点回归 Online DDL、跨分片 JOIN 与 reparent 流程。本发布说明中所有 PR 编号均可在仓库 changelog/15.0/15.0.4/changelog.md 中找到原始记录,配套源码证据可查阅 go/mysql/flavor_mysql.go、go/mysql/flavor.go、go/mysql/schema.go 与 go/vt/vttablet/tabletserver/schema/engine.go。

  • 数据库
  • 分布式数据库
  • 云原生
  • 后端
  • 数据存储

【免费下载链接】vitess

Vitess is a database clustering system for horizontal scaling of MySQL.

项目地址:https://gitcode.com/gh_mirrors/vi/vitess
点击查看免费下载

相关推荐

上一篇:FaceFusion超强人脸检测引擎:RetinaFace、SCRFD、YOLO-Face技术解析
下一篇:从零到精通:MediaMTX社区运营与贡献者管理完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询