ARTICLE DETAIL

资讯详情

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

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/vitessv15.0.5 是 Vitess 15.0 系列的一个维护补丁版本共合入 20 个 Pull Request集中修复了 Online DDL 调度器、vtgate 查询引擎、TabletManager 半同步复制等模块的若干缺陷并同步改善了 CI 稳定性与 Docker 部署方式。本文以 release_notes.md 与 changelog.md 为骨架结合当前仓库源码逐项解析本次补丁的修复内容、背后的实现原理与受影响模块帮助读者理解这些修复为何重要以及它们如何影响实际运维。版本概览与发布范围本次发布由以下 6 位贡献者共同完成GuptaManan100、app/vitess-bot、arthurschreiber、frouioui、shlomi-noach、systay。全部变更被归类为 6 大类别类别涉及 PR 数核心主题Bug fixes缺陷修复11BackupShard、Online DDL、Query Serving、TabletManagerCI/Build构建与 CI2docgen 元数据、vtorc 独立容器Documentation文档1生成文档匿名化Internal Cleanup内部清理1升级测试 Go 版本Release发布流程1release-15.0 代码冻结Testing测试2reparent 测试清理、移除 FOSSA作为补丁版本v15.0.5 不引入新功能全部改动聚焦于稳定性与正确性属于可直接升级的低风险版本。以下按模块深入拆解。Online DDL本次修复的重头戏Online DDL在线 DDL是 Vitess 的招牌能力允许在不锁表的前提下执行ALTER TABLE本次补丁版本对其投入了最多的修复资源涉及 5 个 PR。修复一RevertMigration.Comment 读写并发问题PR #13735 修复了 REVERT 迁移对已完成的迁移执行回滚操作过程中Comment字段的读写并发问题。REVERT 是 Vitess Online DDL 的重要回滚手段它通过 vreplication 逆向执行表结构变更。并发读写同一字段在迁移状态机流转时可能导致数据错乱本次修复保证了迁移元数据在多 goroutine 操作下的读写一致性。修复二形式化 immediate operations 并尊重 --postpone-completionPR #13832 从两个层面完善了 Online DDL 调度语义1. 形式化 immediate operations即时操作概念。从 executor.go 的reviewImmediateOperations实现可以看到即时操作被定义为可以在瞬间完成、不需要长时间运行进程的迁移具体包括CREATE TABLEDROP TABLEVitess 会将其转换为 RENAME 操作所有 VIEW 操作ALTER VIEW等携带相关 DDL 策略标志、可通过 MySQLINSTANT DDL完成的ALTER TABLE。而典型的非即时操作是走 vreplication 的vitess旧名online策略迁移以及针对真正ALTER TABLE的 REVERT 操作。2. 尊重--postpone-completion策略标志。该标志定义在 ddl_strategy.go 中通过IsPostponeCompletion()L297-L300解析。--postpone-completion表示迁移可以启动并执行但不自动进入完成complete状态需要运维人员显式触发完成。修复前即时操作会无视该标志直接完成修复后即时操作也必须遵守postpone-completion语义由调度器在 executor.go 中依据postpone_completion与is_immediate_operation两个字段联合判断是否推迟完成从而让 DBA 能精确控制每次在线 DDL 的完成时机。修复三修复已取消迁移的 nil completed_timestampPR #13935 修复了已取消cancelled迁移的completed_timestamp为空的问题。在 Online DDL 状态机中取消操作通过CANCEL或KILL后的迁移在展示与监控层面应具备完整的生命周期时间戳nil值会导致vtctldclient输出、监控埋点与自动化脚本出现异常。本次修复补齐了取消迁移的时间戳记录逻辑。修复四清理已取消迁移的产物并支持 --retain-artifactsPR #14035 实现了两件事1. 清理已取消迁移的产物。Online DDL尤其是 vreplication 策略会生成_vt_前缀的影子表等中间产物。此前取消的迁移其产物可能残留本次修复让取消的迁移在取消后即进入可清理状态。2. 新增--retain-artifactsdurationDDL 策略标志。该标志定义于 ddl_strategy.go解析逻辑在RetainArtifactsDuration()L380-L396它允许运维人员指定迁移完成后中间产物artifacts保留的时长。默认情况下产物在迁移完成后即被清理指定该标志后产物会在保留期结束后再清理便于在保留期内进行问题排查或数据对账。ParseDDLStrategyL117-L159会同时校验该时长的合法性。对应清理机制位于 executor.go 的CleanupMigrationL4956附近清理不是立即删除而是将迁移标记为可清理由调度器在合适的时机统一回收。修复五列名与列类型改为 JSONPR #14093 是一个小但必要的兼容性修复将 Online DDL 元数据表_vt.schema_migrations等中某列的名称与类型调整为json。这通常是为了避免在特定 MySQL 版本/模式如ONLY_FULL_GROUP_BY或严格的 JSON 语义校验下产生查询失败保证迁移状态查询的稳定性。Online DDL 策略标志速查结合 ddl_strategy.go 的常量定义本次修复涉及的策略标志与相关标志汇总如下标志含义本次修复关联--postpone-completion迁移执行完成后不自动完成需人工触发PR #13832 尊重该标志--retain-artifactsduration迁移完成后中间产物保留时长PR #14035 新增--postpone-launch迁移不立即启动等待人工放行相邻机制--in-order-completion同上下文内的迁移按序完成与即时操作判定联动--prefer-instant-ddl优先尝试 MySQL INSTANT DDL影响即时操作判定ddl_strategy变量的通用用法示例-- 使用 vitessvreplication策略完成后不自动完成 SET ddl_strategy vitess --postpone-completion; -- 使用 mysql 策略产物保留 24 小时 SET ddl_strategy mysql --retain-artifacts24h; -- 执行在线 DDL ALTER TABLE my_table ADD COLUMN c INT;Query Serving修复数据竞争与代价计算查询服务vtgate vttablet 的执行链路在本次补丁中有 3 个 PR均为并发安全与查询规划的正确性修复。修复 schema tracker 表/视图迭代竞态PR #13794 修复了 schema trackerschema 追踪器迭代表与视图时存在的竞态条件race condition。schema tracker 负责在 vttablet 侧持续跟踪 MySQL schema 变更并同步到 vtgate其内部使用 map 存储表与视图信息。在并发读写该 map 时可能触发 Go 的数据竞争data race导致迭代中途崩溃或读到不一致的元数据。该修复对 map 的读写访问进行了同步保护。fuzzing 发现的一批缺陷修复PR #13807 合入了通过模糊测试fuzzing发现的一系列 bugfix。Vitess 在 go/mysql/mysql_fuzzer.go 等位置持续对 SQL 解析与协议处理做 fuzz 测试本次修复覆盖了解析器在畸形输入下的健壮性问题属于典型的吃下自己生产的狗粮式的质量收口。修复 join 引擎 OLAP 流式执行的数据竞争PR #14014 修复了 join 引擎原语join engine primitive在 OLAP 流式模式streaming mode执行时的数据竞争。vtgate 的 join 原语在流式执行时会并发拉取多个分片的子查询结果若共享状态未加保护在高并发场景下可能触发 data race 与偶发错误。该修复是 v15 系列对--workloadolap流式查询稳定性的重要补强。修复代价计算遗漏 subshard 操作码PR #14025 修复了查询规划器planner在代价cost估算中遗漏Subshard操作码opcode的问题。vtgate 的 route 引擎通过 opcode 描述查询路由类型如Equal、IN、Subshard等代价计算遗漏Subshard会导致规划器在选择执行计划时做出次优决策进而影响查询路由与性能。该修复让 subshard 路由参与统一的代价评估。TabletManager半同步动作转换的边界修复PR #13957 修复了convertBoolToSemiSyncAction方法未覆盖所有半同步semi-sync动作的问题。该方法位于 rpc_actions.go其职责是把布尔值是否启用半同步转换为具体的SemiSyncAction动作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 } } }从源码可以看出Vitess 需要先探测 MySQL 加载的半同步扩展类型SemiSyncTypeSource或SemiSyncTypeMaster再决定返回Set、Unset还是None。修复前该方法未能穷举所有半同步动作分支在特定 MySQL 版本/配置下可能返回错误动作导致主备切换PRSPlanned Reparent Sharding或副本状态同步时半同步配置不一致。该方法是 TabletManager 复制相关 RPC 的公共转换点被 rpc_replication.go、rpc_backup.go 与 tm_init.go 等多处调用其正确性直接影响复制链路的健康。集群管理BackupShard 选项来源修复PR #13818 修复了BackupShard从自己的命令行标志flags获取选项的问题。在 Vitess 中BackupShard备份流程既可以由vtctld发起通过vtctldclient BackupShard命令也可以由vtbackup独立进程执行。此前BackupShard可能错误地从全局配置或其他来源读取备份选项如备份并发度、压缩方式、是否使用外部存储等导致备份行为与预期不符。该修复确保备份选项严格取自发起方自身的标志避免配置串扰。CI、构建与工具链更新本次补丁还包含若干工程化改动PR #14004让Static Code Checks Etc静态检查任务在./changelog目录过期out-of-date时直接失败。这意味着发布流程中变更日志必须与代码同步更新保证每个版本的 changelog 与 release notes 都是最新的。PR #14009启用tools/e2e_test_race.sh中的失败检测并修复竞态让 e2e 测试在 race 模式下跑得更稳。PR #14072更新 docgen将 commit ID 嵌入自动生成文档的 frontmatter提升文档与代码版本的可追溯性。PR #14145Docker 构建新增独立的 vtorc 容器。vtorcVitess Orchestrator负责故障检测与主节点选举此前可能与其他组件共用镜像本次为它提供了专属容器镜像便于独立部署与资源控制。PR #14104匿名化生成文档中的家目录路径homedir避免文档泄漏 CI 环境或开发者本机的用户名信息。PR #13938将升级测试upgrade test的 Go 版本提升到go1.20.8跟随工具链安全更新。测试与发布流程调整PR #14118修复 reparent 测试在 CI 中因残留VTDATAROOT文件导致的偶发失败flake在测试 teardown 阶段清理相关文件。PR #14120出于安全考虑从 CI 中移除 FOSSA 测试直到能以安全方式运行。PR #14141对release-15.0分支执行代码冻结code freeze标志着 v15.0.5 正式进入发布状态。升级建议与运维要点综合本次补丁内容给出以下升级与运维建议Online DDL 用户应优先升级。本次对--postpone-completion语义、取消迁移清理、--retain-artifacts的修复直接影响在线 DDL 的日常操作正确性。升级后如需控制产物保留可在ddl_strategy中组合使用--retain-artifactsduration。OLAP 流式查询与高频 DDL 场景。join 引擎流式执行的数据竞争修复PR #14014对--workloadolap场景有直接收益schema tracker 的竞态修复PR #13794则让频繁变更 schema 的环境更稳定。半同步复制依赖方。TabletManager 的半同步动作转换修复PR #13957与主备切换流程相关启用rpl_semi_sync的集群建议尽早升级验证。备份任务核查。BackupShard选项来源修复PR #13818改变了备份选项的取值方式升级后应抽查备份策略压缩、存储、并发度是否符合预期。本次发布的所有变更细节均可追溯至 changelog.md 中列出的 PR涉及的核心源码实现可分别在 ddl_strategy.go、executor.go 与 rpc_actions.go 中查阅验证。【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表