2026/9/21 15:03:00

Vitess v18.0.7 版本发布详解:查询服务修复、VStream API 校验与 Throttler 行为修正

Vitess v18.0.7 版本发布详解:查询服务修复、VStream API 校验与 Throttler 行为修正 Vitess v18.0.7 版本发布详解查询服务修复、VStream API 校验与 Throttler 行为修正【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess本篇技术指南以 changelog/18.0/18.0.7/changelog.md 为骨架系统梳理 Vitess v18.0.7 补丁版本的全部变更包括 6 个模块的 Bug 修复、Go 版本升级、Online DDL 增强与回归修复。读者将了解每个修复涉及的具体组件、底层原理及仓库中的对应源码位置并掌握升级评估所需的完整变更清单。版本概览23 个合并 PR 的补丁版本v18.0.7 是 Vitess 18.0 系列的第七个补丁版本。根据同目录下的 release_notes.md 记录该版本共合入23 个 Pull Request由以下贡献者共同完成GuptaManan100、app/vitess-bot、frouioui、shlomi-noach、vitess-bot。其中 shlomi-noach 作为长期维护者贡献了 VReplication 与 Online DDL 相关的关键修复。变更按官方 Changelog 的标准分类法组织为六大类Bug fixes缺陷修复、CI/Build持续集成与构建、Enhancement功能增强、Internal Cleanup内部清理、Regression回归修复与Testing测试改进。缺陷修复集中在查询服务Query Serving这一核心链路这与 Vitess 作为 MySQL 水平扩展数据库集群系统、查询规划质量直接决定稳定性的定位一致。Bug fixes查询服务Query Serving六项关键修复查询服务层承载 VTGate 的查询规划与执行、VTTablet 的查询引擎与 Schema 跟踪是本次修复最密集的模块共 6 个 PR。1. 连接谓词不再被当作过滤谓词[#16473]修复了dont treat join predicates as filter predicates问题。在 SQL 规划过程中连接条件JOIN 谓词如ON a.id b.id与过滤条件WHERE 子句谓词语义不同连接谓词用于决定行如何匹配而过滤谓词决定哪些行被保留。此前规划器可能错误地将 JOIN 谓词下推为过滤谓词导致结果集错误。该修复调整了规划器中谓词分类与下推逻辑确保两类谓词各司其职。2. 修复 Schema 通知器数据竞争[#16490]修复了RegisterNotifier在分发 schema 变更通知时直接复用内部 table 引用所导致的数据竞争data race。从源码看RegisterNotifier是 VTTablet schema engine 的订阅机制多个消费者通过它注册回调health_streamer.go健康流组件注册healthStreamer通知器并在回调中持有锁分发变更query_engine.go查询引擎注册qe通知器收到变更后触发计划失效engine.go消息系统注册messages通知器。修复方案是在通知回调时传递表集合的副本避免多个 goroutine 并发读写同一 slice 造成竞态从而消除使用-race检测时可能出现的崩溃与未定义行为。3. 引用表 JOIN 合并修复[#16495]修复了引用表reference table即未分片、全副本广播的表在 JOIN 场景下的合并逻辑。引用表因在各分片均存在完整副本常被规划器优化为无需跨分片传输的本地 JOIN此前合并逻辑在特定连接形状下会产生错误规划。配套的[#16531]simplify merging logic对合并逻辑做了简化降低复杂分支引入的回归风险。4. 查询计划缓存未命中指标修复[#16626]修复了查询计划缓存未命中plan cache miss指标的统计偏差。查询计划缓存是 VTGate 与 VTTablet 提升性能的核心机制指标QueryPlanCacheMisses定义于 executor.goVTTablet 侧对应指标QueryEnginePlanCacheMisses定义于 query_engine.go。该修复使指标准确反映缓存失效导致的未命中便于运维通过监控真实判断缓存效率避免误报警。5. JSON 编码使用 Type_RAW[#16680]调整了 JSON 值的编组marshalling方式JSON 编码改用Type_RAW类型。在 query.pb.go 中Type_RAW定义于querypb枚举type 36表示原始字节序列parsed_query.go 中绑定时也走 RAW 分支。此前 JSON 值在编码阶段可能经历不必要或错误的转换改用Type_RAW后能保留 MySQL 返回的 JSON 原始形态避免双重编码导致的结果失真。6. 回归修复允许跨 keyspace JOIN[#16522]标注为 Regression 类别修复了跨 keyspace JOINcross-keyspace join被错误禁止的问题。源码层面VTGate 规划器在 route_planning.go 通过checkCrossKeyspaceOp检查跨 keyspace 操作若任一涉及的 keyspace 配置为禁止跨 keyspace 连接则拒绝规划。该回归导致本应合法的跨库 JOIN 报错本次修复恢复了allowCrossKeyspaceJoin相关配置下的正确行为。Bug fixesThrottler 与 VReplicationThrottler修正 VPlayer 使用的应用名[#16581]Throttler/vreplication: fix app name used by VPlayer修正了流式复制写入端 VPlayer 在请求节流throttle权限时使用的应用名app name。Throttler 依据应用名区分流量来源并施加节流策略此前 VPlayer 使用了错误的名称导致 VReplication 流量可能绕过节流规则或误被节流。该修复保证 VPlayer 的节流请求能被正确识别。VPlayer 是 go/vt/vttablet/tabletmanager/vreplication 目录下 VReplication 播放器核心组件。VReplicationVStream API 校验 LastPK 字段[#16485]为 VStream API 增加校验last PK 必须定义字段fields。VStream 增量流中每个事件携带主键游标LastPK用于断点续传与并行消费若 LastPK 的字段定义缺失消费端无法正确解析游标。该修复在 VStream API 层提前拒绝非法游标避免下游消费者在解析阶段才暴露错误提升 API 的健壮性与错误可诊断性。Bug fixesVTAdmin 与 VTGateVTAdmin升级 websockets JS 依赖[#16511]将 VTAdmin Web 前端的 websockets 相关 JS 包升级修复已知缺陷。VTAdmin 是 Vitess 的集群管理 UI其浏览器端通过 WebSocket 与后端实时通信依赖升级消除了旧版本 websocket 客户端在断线重连、消息帧处理上的不稳定行为。VTGate修复 RemoveTablet 在外部 reparent 期间引发的连接问题[#16566]Fix RemoveTablet during TabletExternallyReparented causing connection issues修复了 VTGate 在外部重新选主TabletExternallyReparented流程中移除 tablet 时造成的连接问题。重新选主期间拓扑信息处于过渡态VTGate 若在此时将刚成为新主的 tablet 从健康列表中移除客户端会短暂失去可用连接。该修复调整了 tablet 移除与 reparent 事件之间的时序/条件处理保证 reparent 期间连接服务的连续性。Bug fixesVTorc 的 Errant GTID 判定[#16727]修复了 VTorcVitess 的故障转移编排器中FindErrantGTIDs的一个边界误判超集superset不应被视为 errant GTID 情况。从源码结构看FindErrantGTIDs在 emergency_reparenter.go 中被紧急重新选主ERS流程调用当候选主节点的 GTID 集合是其他节点的超集时说明该节点数据最新属于正常状态此前逻辑可能将其错误标记为存在 errant GTID导致 ERS 误选或误判。对应 emergency_reparenter_test.go 中TestEmergencyReparenterFindErrantGTIDs系列测试覆盖了空 position、空主 position、空 errant replica 等多种边界场景为修复提供了回归保障。EnhancementOnline DDL 与 VReplication 工作流Online DDL以编程方式替代 SQL CONVERT[#16604]Online DDL: avoid SQLs CONVERT(...), convert programmatically if needed优化了 Online DDL在线表结构变更在需要类型转换时不再生成 SQL 层的CONVERT(...)表达式而是由 Vitess 在程序内部完成必要转换。这避免了部分 MySQL 版本对CONVERT表达式在 DDL 执行上下文中的解析限制或语义差异提升在线迁移的兼容性与成功率。VReplication 工作流重试 wrong tablet type 错误[#16651]让 VReplication 工作流MoveTables、Reshard 等对wrong tablet type这类瞬时错误进行自动重试。VReplication 运行期间源/目标 tablet 的类型可能因迁移流程如切换读/写而短暂不符合预期此前这类错误会直接终止工作流现在会按重试策略等待并重试减少因流程时序导致的失败增强迁移的鲁棒性。CI/BuildGo 版本升级与测试运行器调整Go 版本升级至 1.21.13[#16545]将构建使用的 Golang 版本升级到go1.21.13这是 Go 1.21 系列的安全/维护更新涵盖标准库安全修复。[#16722]进一步将升级upgrade测试任务提升到go1.22.7用于验证从旧版本升级路径。升级测试upgrade/downgrade CI确保跨版本数据与二进制兼容性。仓库根目录的 go.mod 与 tools/check_go_versions.sh 共同约束了各 Go 工具的版本一致性。升级/降级 CI 与二进制版本对齐[#16500]优化了 queries 的升级/降级 CI 工作流测试代码版本与二进制版本保持同一版本避免测试代码与待测二进制跨版本组合导致的误判使兼容性测试结果更可信。更换 CI 运行器与依赖更新[#16716]CI 从 4 核大运行器迁移到ubuntu-latest简化维护并降低资源成本[#16665]将 VTAdmin 的micromatch依赖更新至 4.0.8修复该 glob 匹配库的已知 ReDoS 安全问题。Testing升级/降级测试断言强化[#16701]将升级/降级upgrade/downgrade测试中的ErrorContains断言替换为Error断言。前者检查错误子串、后者仅校验错误是否存在替换后降低了错误信息文本差异导致的脆弱断言同时避免了因错误文案变化而掩盖真实失败的问题。升级评估与资源导航v18.0.7 作为补丁版本无新增破坏性功能重点在于稳定性与正确性。建议运行 v18.0.x 且遇到以下问题的用户优先升级JOIN 谓词被错误当作过滤谓词、跨 keyspace JOIN 报错、引用表 JOIN 规划异常查询服务修复以-race运行 VTTablet 时检测到 schema 通知竞态VStream 消费端出现 LastPK 解析错误VReplication 工作流因wrong tablet type中断、Online DDL 在转换场景失败ERS 因 errant GTID 误判而异常。进一步查阅完整变更清单见 changelog/18.0/18.0.7/changelog.md版本摘要与贡献者见 changelog/18.0/18.0.7/release_notes.md系列版本索引见 changelog/18.0/README.md其后的 18.0.8 changelog 记录了本版本的后续演进如备份恢复 fail-fast、派生表 JOIN 修复等底层实现参考executor.go、query_engine.go、route_planning.go、emergency_reparenter.go、query.pb.go 及 emergency_reparenter_test.go。【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考