尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Vitess v15.0.5 变更深度解析:Online DDL 稳定性、查询服务竞态修复与半同步一致性治理

发布时间:2026/9/20 20:30:22

资讯中心
01
ARTICLE

Vitess v15.0.5 变更深度解析:Online DDL 稳定性、查询服务竞态修复与半同步一致性治理

Vitess v15.0.5 变更深度解析:Online DDL 稳定性、查询服务竞态修复与半同步一致性治理
Vitess v15.0.5 变更深度解析Online DDL 稳定性、查询服务竞态修复与半同步一致性治理【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess本篇技术指南围绕 Vitess v15.0.5release-15.0 分支补丁版本的官方变更记录展开逐项解析本次版本在 Online DDL、Query Serving、TabletManager 半同步复制、集群备份管理以及 CI/构建工程化上的修复动机、实现原理与升级影响并结合当前仓库源码验证每一条修复背后的真实调用链帮助读者在升级 v15 分支前准确评估风险收益、理解各修复在代码层面的落点。版本定位v15 生命周期内的第五个补丁版本v15.0.5是 Vitess 15.0 稳定分支release-15.0的第五个补丁版本。从变更记录changelog/15.0/15.0.5/changelog.md看本次发布以稳定性修复为绝对主线共覆盖五大类别Bug fixes包含 Build/CI、Cluster management、Online DDL、Query Serving、TabletManager 五个子类CI/Build文档生成工具链docgen与 vtorc 容器化改进Documentation自动生成文档的路径匿名化Internal Cleanup升级测试 Go 版本Releasev15.0.5 代码冻结TestingCI 环境下的 reparent 测试清理与 FOSSA 测试移除。其中 Online DDL 相关修复占据了近一半的变更量是本版本当之无愧的核心主题紧随其后的是查询服务Query Serving的多个竞态条件修复。下文按类别逐一展开。Online DDL本版本的重头戏v15.0.5 共包含 5 项 Online DDL 相关修复覆盖并发安全、策略语义、状态机一致性、产物清理四个维度。RevertMigration.Comment 读写并发问题变更记录指出本版本解决了RevertMigration.Comment的读写并发问题PR #13735。Revert 操作在 Vitess 中用于回滚一条已执行的 Online DDL 迁移当REVERT语句提交后vttablet 会解析被回滚迁移的元数据生成一条新的迁移记录并建立reverted_uuid关联。从 executor.go 的SubmitMigration实现可以看到L5470 附近提交 REVERT 迁移时会通过onlineDDL.GetRevertUUID()解析出被回滚迁移的 UUID并将其作为reverted_uuid写入_vt.schema_migrations表。Comment字段的并发读写如果不加保护在多协程同时读取/回填迁移注释时可能产生数据竞态导致注释内容错乱甚至 panic。该修复即针对这一数据结构的并发访问路径加锁或改用原子语义确保 Revert 场景下迁移注释的一致可读。immediate operations 语义正式化与 --postpone-completionPR #13832 是本次 Online DDL 修复中语义影响最大的一项正式化 immediate operations即时操作概念并让 DDL strategy 标志--postpone-completion对这类操作生效。所谓 immediate operations指那些不依赖数据拷贝copy阶段、可以立刻完成的 DDL 操作例如CREATE TABLE、DROP TABLE以及 MySQL 8.0 支持INSTANT算法的部分列操作。在 executor.go 中可以找到该语义在代码中的完整落点L2179从迁移记录中读取is_immediate_operation布尔字段L2188-2190注释明确说明即时操作天生具备 ready to complete 状态inherently ready to complete因为其操作本身就是即时的L2197判断!isImmediateOperation || !postponeCompletion决定迁移是否可以立即进入完成流程L2262-2301reviewImmediateOperations注释定义了何谓即时操作、何谓非即时操作例如针对真实ALTER TABLE的 REVERT 就不属于即时操作L3331、L3364-3366在in-order completion按序完成模式下即时操作必须位于其迁移上下文中第一个待处理位置因为它在运行后一至两秒内即可完成。对用户而言这意味着此前--postpone-completion标志对某些本应立即完成的迁移失效的问题得到解决。策略标志现在能够统一控制何时让迁移真正完成cut-over而无论其底层是即时操作还是需要数据拷贝的重型操作。需要特别指出的是--postpone-completion并非所有策略都支持从 executor.go L2341-2342 可以看到当 DDL 策略为mysql即直接透传 MySQL 原生 DDL时会直接返回INVALID_ARGUMENT错误提示--postpone-completion not supported in mysql strategy。修复取消迁移的 completed_timestamp 为空PR #13935 修复了被取消cancelled的迁移completed_timestamp为 NULL 的问题。该字段在 Online DDL 状态机中承担迁移何时结束的语义而清理逻辑artifact cleanup依赖它计算产物保留时长。对应的修复在 schema.go 中新增了sqlFixCompletedTimestamp语句L428-435UPDATE _vt.schema_migrations SET completed_timestampNOW(6) WHERE migration_status IN (cancelled, failed) AND cleanup_timestamp IS NULL AND completed_timestamp IS NULL即对于处于cancelled或failed状态、尚未清理且完成时间缺失的迁移回填当前时间戳。这一补账操作保证了清理调度器见下文在计算completed_timestamp NOW() - INTERVAL retain_artifacts_seconds时不会因为 NULL 时间戳而跳过或误判历史迁移从而避免取消/失败迁移的产物永远得不到回收。取消迁移产物清理与 --retain-artifacts 策略标志PR #14035 是另一项重量级修复清理被取消迁移的残留产物并支持--retain-artifactsdurationDDL 策略标志。在 v15.0.5 之前迁移一旦被取消其创建的表如_vt_xxx_gho影子表、_vt_xxx_ghc变更日志表、_vt_xxx_del延迟删除表等 artifacts可能因清理条件不满足而长期滞留。修复后清理逻辑统一由sqlSelectUncollectedArtifacts驱动schema.go L414-427SELECT migration_uuid, artifacts, log_path FROM _vt.schema_migrations WHERE migration_status IN (complete, cancelled, failed) AND cleanup_timestamp IS NULL AND completed_timestamp IF(retain_artifacts_seconds0, NOW() - INTERVAL %a SECOND, NOW() - INTERVAL retain_artifacts_seconds SECOND ) ORDER BY id可见清理条件同时覆盖complete、cancelled、failed三种终态且每个迁移的保留时长可独立控制retain_artifacts_seconds0时回退到全局默认保留时长%a占位符否则按迁移自身的保留时长计算。--retain-artifacts策略标志的生效逻辑位于 executor.go L5471-5475retainArtifactsSeconds : int64(retainOnlineDDLTables.Seconds()) if retainArtifacts, _ : onlineDDL.StrategySetting().RetainArtifactsDuration(); retainArtifacts ! 0 { // Explicit retention indicated by --retain-artifact DDL strategy flag for this migration. Override! retainArtifactsSeconds int64(retainArtifacts.Seconds()) }即迁移级策略标志优先于 vttablet 全局的retainOnlineDDLTables配置最终随sqlInsertMigration一并写入_vt.schema_migrations.retain_artifacts_seconds字段L5498。典型用法ALTER TABLE my_table DROP COLUMN c1, ALGORITHMghost, --retain-artifacts168h;这允许运维针对个别大表显式延长或缩短影子表保留期例如调试期间想多留几天影子表做比对而无需改动全局参数。修复改列名与列类型为 JSON 的 bugPR #14115 修复了将列名与列类型同时改为 JSON时的错误。这类 DDL 形如ALTER TABLE t CHANGE COLUMN old_col new_col JSON在 Online DDL 的 ghost/切表流程中涉及列映射column list推导与 vreplication 字段映射边界场景处理不当会导致迁移失败或数据错位。该修复属于 Online DDL 边界条件正确性的收尾工作。Query Serving四处竞态与代价模型修正schema tracker 遍历表/视图时的竞态PR #13794 修复了 vttablet 端 schema tracker 在**遍历表tables与视图views**时存在的竞态条件。schema tracker 维护内存中的 schema 缓存供 vtgate 下发查询计划时引用。当后台 refresh 线程在更新 schema 的同时查询线程正在迭代表/视图列表若无锁保护会触发 data race进而可能导致计划构建读到半更新状态的 schema。该修复在迭代路径上补齐了同步保护属于典型的并发访问正确性问题。模糊测试fuzzing发现的一批 bug 修复PR #13807 汇总了 vitess 团队在持续模糊测试中发现的若干问题。Vitess 仓库中维护了专门的 fuzzer可参见 go/mysql/mysql_fuzzer.goSQL 解析器、协议解析路径是重点目标。这类修复通常涉及畸形 SQL 导致解析器 panic极端输入导致内存分配失控错误处理路径中再次抛出异常掩盖原始错误。建议升级用户在发布说明之外重点关注 SQL 兼容性边界因为模糊测试修复往往悄悄改变了某些边缘语法的处理行为。join 引擎 OLAP 流式执行的数据竞态PR #14014 修复了join 引擎原语在 OLAP 流式streaming模式执行时的数据竞态。对应代码位于 go/vt/vtgate/engine/join.goTryStreamExecuteL123 起在流式执行时引入了sync.MutexL125-127确保并发读取 join 两翼结果集时共享状态的一致性。该修复对大规模聚合/Join 分析查询OLAP 工作负载的稳定性有直接价值——此前在高并发流式场景下可能出现计划执行器状态被并发修改导致的非确定性结果或 panic。代价模型将 subshard opcode 纳入 costPR #14025 修复了 vtgate 代价cost计算未包含 subshard opcode 的问题。在 v3 规划器中路由 opcode如EqualUnique、IN、Subshard等决定查询发往分片的方式。若代价计算遗漏Subshard这一 opcode规划器可能高估或低估某些查询的代价进而选择次优的执行计划例如错误地合并/拆分查询、选择错误的 route 方式。修复后代价估算更贴近真实执行开销有利于在跨分片场景下选出更合理的计划。TabletManager半同步动作枚举的全量覆盖PR #13957 修复了convertBoolToSemiSyncAction方法未能覆盖全部半同步动作的问题。该方法位于 go/vt/vttablet/tabletmanager/rpc_actions.go L194-214func (tm *TabletManager) convertBoolToSemiSyncAction(ctx context.Context, semiSync bool) (SemiSyncAction, error) { semiSyncExtensionLoaded, err : tm.MysqlDaemon.SemiSyncExtensionLoaded(ctx) if err ! nil { return SemiSyncActionNone, err } switch semiSyncExtensionLoaded { case mysql.SemiSyncTypeSource, mysql.SemiSyncTypeMaster: if semiSync { return SemiSyncActionSet, nil } else { return SemiSyncActionUnset, nil } default: if semiSync { return SemiSyncActionNone, vterrors.VT09013() } else { return SemiSyncActionNone, nil } } }半同步动作枚举定义在同文件 L47-53SemiSyncActionNone、SemiSyncActionSet、SemiSyncActionUnset。修复前该方法在某些 MySQL/分支的半同步插件状态SemiSyncType变体下无法正确映射出Set/Unset动作导致在主从切换PlannedReparentShard / EmergencyReparentShard或备份恢复流程中半同步配置无法按预期启停。修复后当半同步插件以 source/master 类型加载时布尔值正确映射为SemiSyncActionSet或SemiSyncActionUnset其他情况下插件未加载或类型未知若请求开启半同步则返回VT09013错误若请求关闭则安全返回None。该方法的调用点包括 rpc_actions.go 的ChangeType流程L129以及 rpc_backup.goL172备份结束恢复原类型时和 rpc_replication.goL313。对于依赖半同步保证数据不丢失的集群这一修复直接关系到切换与恢复流程中的复制安全。Cluster ManagementBackupShard 使用自身标志PR #13818 修复了BackupShard从**自身标志flags**而非外部默认值获取选项的问题。BackupShard是 vtctld 暴露的 RPC请求结构定义见 go/vt/proto/vtctldata/vtctldata.pb.go 的BackupShardRequest请求字段包括allow_primary、concurrency、upgrade_safe、incremental_from_pos、mysql_shutdown_timeout、init_sql等。修复前BackupShard在构造备份请求时可能读取了错误来源的参数例如 vtctld 进程级标志或默认值导致通过 RPC 触发的备份与命令行触发的备份行为不一致——例如并发度、是否允许主库备份等选项未按调用方意图生效。修复后每次BackupShard调用都严格以其请求参数为准保证vtctldclient BackupShard与内部调用语义一致。CI/Build、工程化与发布流程改进v15.0.5 的工程化改进同样值得关注静态检查覆盖 changelog 目录PR #14004Static Code Checks Etc现在会在./changelog目录过期如未生成新版本变更记录时让 CI 失败从流程上强制每个发布分支维护变更记录这也是本文档所在目录能保持结构一致的原因启用 e2e 竞态检测失败PR #14009tools/e2e_test_race.sh现在允许竞态检测失败直接中断 CI并修复了一批已知竞态与本次多处 data race 修复形成呼应升级测试 Go 版本到 go1.20.8PR #13938release-15.0 分支的升级测试环境更新至 Go 1.20.8vtorc 专用容器PR #14145docker 目录新增专门的 vtorc 容器镜像vtorcVitess 拓扑恢复控制器不再需要依赖通用镜像手工组装docgen 嵌入 commit IDPR #14072与homedir 匿名化PR #14104自动生成的文档 frontmatter 中嵌入 commit ID并对文档中的用户主目录路径做匿名化处理提升文档可追溯性与隐私性CI 稳定性PR #14118、#14120在 reparent 测试 teardown 中删除 VTDATAROOT 残留文件以消除测试相互污染并在找到安全方案前移除 FOSSA 测试。升级建议与风险提示Online DDL 语义变化需重点回归--postpone-completion对即时操作CREATE/DROP 等生效范围的扩大可能改变现有自动化流程对迁移何时完成的预期若你的流程依赖迁移完成时间点触发后续动作升级后建议先在测试环境验证 DROP/CREATE 类迁移的行为半同步修复直接影响切换安全convertBoolToSemiSyncAction的全量覆盖意味着主从切换、备份恢复流程中半同步启停行为更规范但若集群使用了非标准半同步插件加载方式需关注VT09013错误是否会因semiSynctrue请求而暴露产物清理策略可下放到迁移级借助--retain-artifactsduration可针对大表或审计需求差异化设置影子表保留时长同时取消/失败迁移的产物将不再无限滞留查询服务稳定性提升join OLAP 流式执行与 schema tracker 的竞态修复对高并发分析查询和 schema 频繁变更的集群收益明显。参考文件索引版本变更记录changelog/15.0/15.0.5/changelog.mdOnline DDL 执行器与策略语义go/vt/vttablet/onlineddl/executor.goOnline DDL 内部表 SQL 与清理逻辑go/vt/vttablet/onlineddl/schema.go半同步动作映射修复go/vt/vttablet/tabletmanager/rpc_actions.go半同步在备份/复制流程中的调用go/vt/vttablet/tabletmanager/rpc_backup.go、go/vt/vttablet/tabletmanager/rpc_replication.gojoin 引擎流式执行竞态修复go/vt/vtgate/engine/join.goBackupShard RPC 请求定义go/vt/proto/vtctldata/vtctldata.pb.go【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。