Vitess v16.0.5 变更日志深度解析:Bug 修复、Online DDL 与 VReplication 增强全览
2026/9/21 1:52:13 网站建设 项目流程
  • 数据库
  • 分布式数据库
  • 云原生
  • 后端
  • 数据存储

【免费下载链接】vitess

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

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

本篇文章系统梳理 Vitess 16.0 系列的补丁版本 v16.0.5 的完整变更内容,覆盖 Bug 修复(半同步复制、Online DDL、查询服务、VReplication、VTCombo)、CI/Build 升级(Go 1.20.8、vtorc 容器)、MoveTables 新增强化等。通过结合当前仓库源码中的具体实现文件与测试用例,帮助读者理解每个修复背后的底层原理、受影响组件以及升级到 v16.0.5 后可以获得的行为改进。

版本定位与发布背景

v16.0.5 是 Vitess 16.0 分支的一个补丁版本(patch release),其发布过程遵循 Vitess 标准的代码冻结(code freeze)流程,相关动作由 PR [#14132] 完成。整个 v16 系列承载了 Vitess 在 MySQL 水平扩展、Online DDL、VReplication 数据迁移等方面的大量新特性,而 v16.0.5 的职责则是:在保持 API 与行为稳定的前提下,修复上一阶段暴露出的缺陷、消除测试不稳定因素(flakes)、升级构建工具链,并为后续版本扫清障碍。

从变更分类看,本次发布覆盖以下领域:

  • Bug fixes:Build/CI、Cluster management、Online DDL、Query Serving、VReplication、VTCombo 六个子类;
  • CI/Build:Go 工具链升级至go1.20.8、为 vtorc 提供专属容器镜像、docgen 文档生成器嵌入 commit ID;
  • Documentation:生成文档中主目录(homedir)路径匿名化;
  • Enhancement:MoveTables 新增"不创建路由规则"的开关;
  • Internal Cleanup:Bootstrap 基础镜像切换到 Debian Bullseye、超时测试挪包;
  • Testing:移除 FOSSA 测试、清理 vreplication e2e 测试数据目录。

下面按类别逐一深入解析。

Bug 修复:集群管理与半同步复制

BackupShard 从自身 flags 获取备份选项

问题描述BackupShard在备份操作时使用了错误来源的配置参数,导致备份行为与命令行指定不一致。

修复内容:让BackupShard完全从自身的命令行 flags 中读取备份选项(PR [#13819])。在 go/vt/vtctl/backup.go 中,commandBackupShard定义了以下专属参数并逐项注入到BackupShardRequest

  • --concurrency:压缩与校验(checksum)任务并行数,默认 4;
  • --allow_primary:是否允许在主库上执行备份。注意,若使用内置备份引擎(builtin),在主库备份期间会关闭主 MySQL;
  • --incremental_from_pos:增量备份起点位置或基准备份名,默认空;值为auto时自动从最近一次成功备份的位置开始;
  • --upgrade-safe:备份时使用innodb_fast_shutdown=0,保证备份可用于 MySQL 升级;
  • --mysql-shutdown-timeout:关闭 MySQL 的超时时间,默认mysqlctl.DefaultShutdownTimeout

修复之后,调用方通过vtctl BackupShard <keyspace/shard>传入的参数会正确覆盖全局默认值,不会再出现"命令行设置了却未生效"的错位问题。

convertBoolToSemiSyncAction:覆盖所有半同步插件类型

问题描述convertBoolToSemiSyncAction方法未完整覆盖所有半同步(semi-sync)动作场景,导致在部分 MySQL 版本上启用/禁用半同步的行为不正确(PR [#13075]、回移植 [#13958])。

修复内容:该方法根据 MySQL 上实际加载的半同步插件类型决定返回的动作。修复后的实现位于 go/vt/vttablet/tabletmanager/rpc_actions.go:

func (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 } } }

关键变化在于switch分支同时覆盖了mysql.SemiSyncTypeSource(MySQL 8.0.x 的 SOURCE 命名)与mysql.SemiSyncTypeMaster(MySQL 5.7 及更早的 MASTER 命名)两种插件类型。此前仅识别其中一种,会导致另一类 MySQL 实例上SemiSyncActionSet/Unset无法正确下发。

SemiSyncAction枚举定义于 go/vt/vttablet/tabletmanager/rpc_actions.go,包含SemiSyncActionNoneSemiSyncActionSetSemiSyncActionUnset三态。

错误路径:当半同步插件完全未加载时,若请求启用半同步(semiSync == true),返回预定义错误VT09013,其定义见 go/vt/vterrors/code.go:FAILED_PRECONDITION级别,消息为 "semi-sync plugins are not loaded",提示 "Durability policy wants Vitess to use semi-sync, but the MySQL instances don't have the semi-sync plugin loaded."——即持久化策略(durability policy)要求半同步,但底层 MySQL 实例未加载插件。

调用链影响面:该方法被集群管理的关键路径广泛调用,包括:

  • ChangeType变更 tablet 类型(rpc_actions.go),随后通过fixSemiSyncAndReplication修正半同步确认(ack)行为;
  • 备份流程中切换为BACKUP类型、恢复原类型时(rpc_backup.go);
  • 复制管理(rpc_replication.goSetReplicationSourceInitPrimaryChangeTabletType等多个 RPC 入口),以及SetTwoPCAllowed(..., semiSyncAction == SemiSyncActionSet)对两阶段提交能力的联动控制。

这意味着该修复直接影响:主库切换(PRS/ERS)、备份期间的类型切换、复制源重置等操作中半同步的启停正确性,是集群高可用行为的重要保障。

VTCombo:DBDDL 插件竞态条件

vtcombo(本地开发用的一体化 Vitess 进程)中 DBDDL 插件存在竞态条件(PR [#13117],回移植 [#13741])。该问题在并发执行 DDL 相关操作时可能引发不可预期的行为,修复后 vtcombo 对插件状态的读写具备正确的同步语义,提升了本地开发与测试环境的稳定性。

Bug 修复:Online DDL 与 TableGC

v16.0.5 在 Online DDL 子系统中打包了四项修复,涉及迁移状态记录、产物清理、视图删除与元数据列类型。

已取消迁移的 completed_timestamp 为空值

修复 Online DDL 中已取消(cancelled)迁移的completed_timestamp为 nil 的问题(PR [#13928]、回移植 [#13936])。此前取消迁移时该时间戳未被正确填充,导致基于迁移完成时间的查询、清理与监控逻辑出现空指针或误判。修复后取消的迁移同样会获得合法的完成时间戳,保证_vt_schema_migrations表的元数据一致性。

清理取消迁移的产物并支持 --retain-artifacts

核心变更:取消(cancel)迁移后自动清理其遗留的 artifact(影子表等中间产物),并新增--retain-artifacts=<duration>DDL 策略参数(PR [#14029]、回移植 [#14036]),允许用户控制被取消迁移产物的保留时长。

在 go/vt/schema/ddl_strategy.go 中通过isRetainArtifactsFlag识别该标志,RetainArtifactsDuration()方法(ddl_strategy.go)解析出具体时长:

// RetainArtifactsDuration returns a the duration indicated by --retain-artifacts func (setting *DDLStrategySetting) RetainArtifactsDuration() (d time.Duration, err error) { opts, _ := shlex.Split(setting.Options) for _, opt := range opts { if val, isRetainArtifacts := isRetainArtifactsFlag(opt); isRetainArtifacts { if s, err := strconv.Unquote(val); err == nil { val = s } if val != "" { d, err = time.ParseDuration(val) } } } return d, err }

该标志属于"内部提示选项"(internal hint option),因此在RuntimeOptions()(ddl_strategy.go)中被过滤,不会作为运行时选项传递给执行引擎。同时ParseDDLStrategy会校验时长格式——如--retain-artifacts=3这类缺失单位的写法将被拒绝(见 ddl_strategy_test.go)。

端到端验证:调度器测试 go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go 使用--postpone-completion --retain-artifacts=1s创建迁移并断言retainArtifactsSeconds == 1;另一组用例以--retain-artifacts=1h验证保留 3600 秒(同文件 L2087-L2111);还有用例验证相同迁移上下文(migration context)下并发迁移的 artifacts 按保留窗口统一清理(同文件 L2481-L2484)。

TableGC 支持 DROP VIEW

此前 TableGC(表垃圾回收)流程只支持对表执行DROP TABLE,删除视图时会失败。本次修复为 TableGC 增加了DROP VIEW支持(PR [#14020]、回移植 [#14044])。

从源码结构看,TableGC 定义了完整的生命周期状态机,见 go/vt/schema/tablegc.go:

  • HOLD:表刚被重命名剥离(如_vt_hld_<uuid>_<ts>_),数据仍在,用户有机会改回原名,属"安全期";
  • PURGE:正在清除表数据,此时表对用户"已丢失";
  • EVAC:等待 InnoDB 缓冲池、自适应哈希索引等页缓存逐出;
  • DROP:尽快执行最终删除(DROP TABLE/ 现在也包括DROP VIEW);
  • 空串表示表已不存在。

GC 表命名遵循_vt_(hld|prg|evc|drp)_<32位uuid>_<14位时间戳>_格式(tablegc.go),ParseGCLifecycle支持以逗号分隔的 GC 生命周期配置且 DROP 状态被隐式包含(tablegc.go)。视图的 DDL 识别在 go/vt/schema/online_ddl.go 中由CreateView / DropView / AlterView共同处理。

Online DDL 元数据列改为 JSON 类型

修复 Online DDL 内部某列名称与类型,将其改为 JSON(PR [#14093]、回移植 [#14116])。这一调整使该字段可以容纳结构化数据,为后续功能扩展提供了更灵活的元数据承载能力。

Bug 修复:查询服务(Query Serving)

未知/不支持排序规则的 text 类型哈希错误

修复执行报错 "text type with an unknown/unsupported collation cannot be hashed"(PR [#13852]、回移植 [#13863])。该错误发生在将TEXT类型列用于需要哈希运算的场景(如 Vindex 计算)且其排序规则(collation)未知或不支持时。修复后系统对该类列的哈希行为给出正确结果或更明确的错误指引,避免查询中断。

大量谓词(predicates)不再超时

修复处理大量谓词(如IN (...)展开)时查询超时的问题(PR [#13979]、回移植 [#13981])。当谓词数量达到万级时,原实现在谓词归一化/展开环节耗时过高;修复优化了该路径的时间复杂度,使大谓词集查询可以在限定时间内完成。

join 引擎 OLAP 流式执行的数据竞争

修复 join 执行原语(join engine primitive)在 OLAP 流式(streaming)模式下执行时存在的数据竞争(PR [#14012]、回移植 [#14015])。该问题在并发流式 join 时可能导致读改写冲突,修复为相关状态增加了正确的同步保护。

代价模型纳入 subshard 操作码

修复代价计算未包含 subshard 操作码的问题(PR [#14023]、回移植 [#14026])。从源码结构看,这属于查询规划器(planner)的代价估算环节:执行计划中出现 subshard 操作(按子分片路由)时,其额外开销此前未被计入总代价,可能导致规划器选择次优计划;修复后代价模型更准确,路由决策更贴近实际执行成本。

Bug 修复:VReplication 与 VDiff

VReplication 是本次修复数量最多的模块,聚焦于 VDiff2 的稳定性与恢复正确性:

  • 跳过易闪断的 VDiff2 Progress ETA 校验(PR [#13804]、回移植 [#13816]):VDiff2 Progress 命令返回的 ETA 属"未来时间"的断言在 CI 中不稳定,先跳过该 flaky 检查,避免误报失败;
  • 恢复时续接 rows_copied 本地计数(PR [#13949]、回移植 [#13962]):当从另一台 tablet 恢复(resume)复制时,需将已复制的行数同步到本地计数器,避免恢复后行数统计偏差导致进度误判;
  • VDiff 默认 source/target cells 正确处理(PR [#13969]、回移植 [#13983]):修正 VDiff 在未显式指定 source、target 单元格时对默认单元格的处理逻辑;
  • 将 rows_copied 查询加入忽略列表(PR [#14040]):近期新增的select rows_copied查询会被纳入 VReplication 的忽略查询列表,防止其干扰复制状态判断;
  • TabletPicker 场景下正确切分 cell 值(PR [#14099]、回移植 [#14102]):VDiff 在使用 TabletPicker 时,record 中逗号分隔的 cell 值需正确拆分,否则单元格列表解析错误;
  • 删除 VDiff 前清理其 controller(PR [#14107]、回移植 [#14124]):删除一个 VDiff 时先清理对应 controller,避免资源泄漏或重复清理引发的冲突。

这些修复共同提升了 VDiff(数据一致性校验)在大型集群、跨单元格场景下的可靠性,并减少 CI 中的随机失败。

Bug 修复:构建与 CI 的强制校验

  • Static Code Checks 强制 changelog 同步(PR [#14003]、回移植 [#14005]):Static Code Checks Etc任务在./changelog目录内容过期(如缺少新版本条目)时直接失败,从机制上保证每个版本都带 changelog;
  • 启用 e2e race 测试失败判定(PR [#13654]、回移植 [#14010]):tools/e2e_test_race.sh此前未让 race 检测失败生效,本次启用失败判定并修复了脚本中暴露的竞态问题。

CI/Build、文档与工具链变更

  • Go 升级至 1.20.8(PR [#13932]):v16.0.5 使用go1.20.8构建,包含该版本的安全与稳定性修复;
  • 专属 vtorc 容器(PR [#14126]、回移植 [#14146]):docker 构建体系新增独立的 vtorc 容器镜像,便于单独部署 Vitess 的故障恢复编排组件 vtorc;
  • docgen 嵌入 commit ID(PR [#14056]、回移植 [#14073]):自动生成的文档 frontmatter 中嵌入构建时的 commit ID,提升文档与源码版本的可追溯性;
  • 文档主目录匿名化(PR [#14101]、回移植 [#14105]):生成文档中涉及的主目录路径被匿名化处理,避免泄露开发者本机用户路径;
  • Bootstrap 使用 Debian Bullseye(PR [#13757]、回移植 [#13921]):基础镜像从旧 Debian 版本迁移至 Bullseye,属于构建环境的内部清理(Internal Cleanup);
  • 超时测试移入独立包(PR [#14028]、回移植 [#14031]):查询超时相关测试迁移至不同 package,属于测试组织的内部整理。

Enhancement:MoveTables 支持不创建路由规则

本次发布唯一的 Enhancement 项(PR [#13858])属于 VReplication 模块:MoveTables 新增一个开关,指定创建 workflow 时不生成路由规则(routing rules)

在 MoveTables 工作流中,路由规则负责将原表的流量指向迁移后的新表。新增的 flag 允许在创建 workflow 时跳过路由规则创建,适用于用户希望自行管理路由、或计划后续手动切换的场景。这为数据迁移流程提供了更细粒度的控制,避免了"workflow 创建即自动改路由"这一默认行为的副作用。

Testing 与发布流程

  • 移除 FOSSA 测试(PR [#14119]、回移植 [#14121]):在能以安全方式执行之前,将 FOSSA(开源合规扫描)从 CI 中移除,避免其在 CI 中产生不稳定或安全隐患;
  • 清空 vtdataroot 再启动 vreplication e2e 测试(PR [#13803]、回移植 [#13821]):每个 vreplication 端到端测试开始前清空vtdataroot数据目录,消除跨测试的残留数据导致的 flake;
  • 代码冻结(PR [#14132]):v16.0.5 发布前对release-16.0分支执行代码冻结,确保发布窗口内的变更可控。

升级建议与影响评估

对于运行 v16.0.x 系列的集群,v16.0.5 属于低风险补丁升级,主要收益集中在:

  1. 高可用正确性:半同步插件类型覆盖(含 MySQL 5.7 的MASTER类型)修复了主备切换、备份、复制源重置中的半同步启停缺陷,配合VT09013错误提示可快速定位"持久化策略要求半同步但插件未加载"的配置错误;
  2. Online DDL 运维体验:取消迁移的产物可自动清理,--retain-artifacts提供保留窗口控制,TableGC 可处理视图;
  3. 查询稳定性:大谓词查询超时、join 流式执行数据竞争、代价模型偏差等问题得到修复;
  4. VReplication/VDiff 可靠性:恢复续接计数、单元格解析、controller 清理等细节修复减少了迁移与校验流程的误判。

升级前建议:在测试环境先行验证(尤其涉及半同步与 Online DDL 的工作负载),并确保./changelog与版本同步的 CI 校验在 fork 或镜像仓库中同样生效;使用 vtorc 容器镜像的部署应确认镜像标签与 v16.0.5 匹配。

深入阅读

如需进一步验证本文引用的实现细节,可查看仓库中的以下文件:

  • 半同步修复实现:go/vt/vttablet/tabletmanager/rpc_actions.go 与错误定义 go/vt/vterrors/code.go
  • BackupShard 命令实现:go/vt/vtctl/backup.go
  • --retain-artifacts解析:go/vt/schema/ddl_strategy.go 及端到端测试 go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go
  • TableGC 状态机:go/vt/schema/tablegc.go,Online DDL 视图识别:go/vt/schema/online_ddl.go
  • 策略解析测试:go/vt/schema/ddl_strategy_test.go
  • 本版本完整变更清单:changelog/16.0/16.0.5/changelog.md
  • 数据库
  • 分布式数据库
  • 云原生
  • 后端
  • 数据存储

【免费下载链接】vitess

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

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

相关推荐

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

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

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

立即咨询