ARTICLE DETAIL

资讯详情

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

Vitess v18.0.6 补丁版本深度解析:查询计划、VReplication 与稳定性修复全指南

Vitess v18.0.6 补丁版本深度解析:查询计划、VReplication 与稳定性修复全指南 Vitess v18.0.6 补丁版本深度解析查询计划、VReplication 与稳定性修复全指南【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess本指南基于 Vitess 官方 v18.0.6 发布说明与变更日志系统梳理该补丁版本合并的 28 个 Pull Request覆盖查询服务Query Serving执行计划修复、VReplication 工作流可靠性、VTTablet 模式拷贝、VTorc 超时防护与构建链升级等核心改动并结合仓库源码深入解析每类修复的底层原理。读完本文你将掌握 v18.0.6 相对 v18.0.5 的全部行为变化、每个修复背后的代码路径以及升级时需要注意的兼容点。版本概览一个聚焦稳定性与正确性的维护版本v18.0.6 是 Vitess 18.0 系列的第 6 个补丁版本。根据 changelog/18.0/18.0.6/release_notes.md 的记录该版本共合并28 个 Pull Request主要贡献者包括 GuptaManan100、arthurschreiber、shlono-noach、vitess-bot 等。完整变更条目见 changelog/18.0/18.0.6/changelog.md。从变更日志的分布看v18.0.6 的工作重心非常明确类别修复数量代表改动Query Serving查询服务6information_schema 路由、LIMITGROUP BY 优化、Route 合并清理VReplication4VDiff show、Routing Rules、复制阶段流重启状态、Reshard 无主分片VTTablet2schemacopy 排序规则、启动时跳过表统计加载VTorc1所有 RPC 调用上下文超时vtexplain1UNION 查询 weight_string 处理Build/CI、依赖、测试等14Go 版本升级、DCO workflow、Mac 兼容等其中相当一部分修复是针对查询规划器planner的正确性问题——这类问题在真实集群中往往表现为偶发的错误查询结果或计划报错是维护版本中最值得关注的内容。查询服务Query Serving六项执行计划正确性修复查询服务是 Vitess 的核心路径v18.0.6 中绝大部分代码改动都集中于此覆盖了信息模式路由、子查询合并、聚合与排序等多个场景。information_schema 路由处理PR #15905修复了information_schema查询的路由问题。information_schema是 MySQL 内置的元数据库Vitess 需要把针对它的查询路由到正确的后端通常是未分片键空间或系统表处理逻辑。修复前某些包含information_schema的查询可能被错误路由导致结果缺失或报错。从源码结构看Vitess 在 go/vt/vtgate/planbuilder/operators/info_schema_planning.go 中专门维护了一套信息模式的规划逻辑并在 go/vt/vtgate/engine/routing.go 中实现对应的路由引擎v18.0.6 对该路径的边界情况做了修正。合并子查询时移除 keyspacePR #16026修复了子查询subquery合并过程中的 keyspace 残留问题。当规划器把两个子查询合并为单一查询计划时如果子查询原本来自不同 keyspace 的语义信息被错误保留生成的 SQL 就会带上多余的 keyspace 限定导致后端 MySQL 解析失败。修复的关键是在合并阶段主动剥离不该保留的 keyspace 标识。LIMIT 与 GROUP BY 的错误优化PR #16266修复了一个典型的规划器优化 bug当查询同时包含LIMIT和GROUP BY时规划器可能将LIMIT错误地下推到分组操作之前造成分组结果被截断、返回不完整的数据。这类问题在分布式分片环境下尤为隐蔽因为每个分片各自执行下推后的 SQL汇总后结果可能整体错误。v18.0.6 修正了该优化条件的判定逻辑确保LIMIT只能在语义安全的场景下下推。derived table派生表内 ORDER BY 处理PR #16358修复了派生表derived table / 子查询 FROM 子句中的内联视图内部ORDER BY的处理。MySQL 语义下没有LIMIT的派生表内部ORDER BY通常可以被优化掉但 Vitess 规划器在合并派生表到外层计划时需要正确判断何时保留该排序语义否则可能产生错误的排序结果。该修复完善了规划器对派生表排序的识别逻辑。Route 合并中的 Join 谓词清理PR #16388修复了路由合并route merging过程中 Join 谓词清理的 bug。当多个查询分支可以合并到同一路由时规划器需要清理冗余的 Join 条件若清理不彻底可能留下对不存在列的引用导致Unknown column之类的运行时错误。回归修复INSERT ... ON DUPLICATE KEY UPDATE 的 bind variablePR #15966属于回归修复类别修复了INSERT ... ON DUPLICATE KEY UPDATE语句中新增的列表参数未正确加入 bind variables map 的问题。该问题会导致带VALUES(...)引用的写操作在执行时报参数缺失错误。修复后在 go/vt/vtgate/planbuilder 的改写流程中新增参数会被正确注册到绑定变量映射中。测试配套更干净的 plan 测试输出配套的PR #15923优化了 plan 测试plan tests的输出格式使执行计划快照更易读、更易对比。Vitess 的规划器测试采用计划快照对比模式golden file分布在 go/vt/vtgate/planbuilder/plan_test.go 等文件中输出格式的稳定直接影响这类测试的可维护性。VReplication四项可靠性修复VReplication 是 Vitess 实现在线迁移Reshard、MoveTables、VDiff的底层数据复制引擎v18.0.6 的修复集中在命令兼容与流状态管理上。vtctldclient Apply Routing Rules 命令失效PR #16123修复了vtctldclient中ApplyShardRoutingRules、ApplyKeyspaceRoutingRules、ApplyRoutingRules等命令无法正常工作的问题。Routing Rules 用于控制键空间的路由关系例如从键空间迁移期间的路由重定向该命令在 vtctldclient 这一较新的客户端工具中的实现此前存在缺陷v18.0.6 使其与 v18 系列的 Routing Rules 功能保持一致。相关命令定义位于 go/vt/vtctl/vtctl.go 的commandApplyShardRoutingRules等实现中。VDiff CLI show 命令 bugPR #16197修复了 VDiff CLI 的show子命令 bug。VDiff 用于对比两个数据源之间的数据一致性其服务端实现位于 go/vt/vtctl/workflow/vdiff.goVDiffShow方法客户端展示逻辑则通过BuildSummary从响应构建摘要。该修复保证了vtctldclient vdiff show能正确展示对比摘要与进度。复制阶段重启流时的状态设置PR #16221修复了 VReplication workflow 在copy 阶段重启流restart workflow streams时状态设置不正确的问题。VReplication 工作流分为 copy全量与 replicate增量两个阶段copy 阶段重启时若状态未正确重置会导致数据重复拷贝或流停滞。该修复确保重启后的流以正确的状态续跑相关状态机逻辑集中在 go/vt/vttablet/tabletmanager/vreplication 目录下。Reshard 目标分片无 primary 的处理PR #16290修复了 Reshard 场景下目标分片target shard没有 primary 时的处理。Vitess 的 Reshard 流程由resharder驱动见 go/vt/wrangler/resharder.go 与 go/vt/vtctl/workflow/resharder.go此前当目标分片尚未选出 primary 时可能发生未预期的行为v18.0.6 对该场景做了妥善处理避免 workflow 进入异常状态。VTTabletschemacopy 排序规则与启动性能schemacopy 的排序规则collation问题PR #15859修复了schemacopyschema 拷贝对应CopySchemaShard/CopySchemaShardFromShard命令中的排序规则问题。该命令用于把一个分片的表结构拷贝到目标分片实现位于 go/vt/wrangler/schema.go拷贝前通过schematools.CompareSchemas对比源与目标 schema若一致则提前返回存在差异时从源 primary 读取GetSchemaRequest结果将 DDL 逐条applySQLShard到目标 primary并通过 binlog 传播到副本最后再次对比 schema 校验拷贝结果除非--skip_verify。修复前当源库与目标库的默认排序规则不同时schema 对比CompareSchemas会因排序规则差异产生误报或漏报导致拷贝不完整或校验失败。v18.0.6 修正了对比逻辑对 collation 的处理。对应的测试用例可见 go/vt/wrangler/testlib/copy_schema_shard_test.go。启动时不再加载 table statsPR #16099性能类让vttablet在启动booting阶段不再加载表统计信息table stats。此前 tablet 启动时会执行统计加载在表数量很多的实例上会显著拖慢启动速度v18.0.6 将其延后使得 tablet 能更快地进入可服务状态。该改动属于更快启动类优化不会改变查询语义。VTorc为所有 RPC 调用上下文加上超时PR #16104为 VTorcVitess 的故障转移/拓扑管理组件中所有用于 RPC 调用的 context 增加了超时。VTorc 依赖 MySQL 拓扑发现与 RPC 探测来监控集群健康如果某个 RPC 调用挂起例如网络分区或对端无响应此前可能长时间阻塞发现循环。修复后在 go/vt/vtorc/logic/tablet_discovery.go、go/vt/vtorc/logic/keyspace_shard_discovery.go 等关键路径中所有 RPC 都使用context.WithTimeout(ctx, topo.RemoteOperationTimeout)包装保证探测操作在超时阈值内结束避免 VTorc 的监控与故障切换能力被慢调用拖垮。vtexplainUNION 查询的 weight_string 处理PR #16156修复了vtexplain查询计划解释工具无法正确处理带weight_string结果的UNION查询的问题。weight_string是 Vitess 在分片间做字符串排序/比较时使用的内部函数用于保证跨分片排序正确性。修复前当 UNION 查询的结果列包含weight_string时vtexplain 可能输出异常计划修复后其处理与真实查询执行路径保持一致。从测试数据看vtexplain 的预期输出中大量出现weight_string(...)见 go/vt/vtexplain/testdata/multi-output/selectsharded-output.txt例如select name, info, weight_string(info) from name_info order by name_info.info asc limit 10001 /* select * and order by varchar column */这体现了 vtexplain 对排序场景的忠实模拟——v18.0.6 让 UNION 场景下这类内部列的展示与计算保持一致。同批的PR #16166还修复了 vtexplain 单元测试的偶发不稳定flakiness。构建链与依赖Go 版本升级与 CI 完善v18.0.6 对构建链路做了一次集中升级Go 版本升级连续两次升级先是PR #16063将 Go 升级到go1.21.11随后PR #16320再次升级到go1.21.12。这两个版本属于 Go 1.21 系列的维护版本主要包含标准库与工具链的安全/稳定性修复。仓库根目录的 go.mod 与 go.sum 反映了当前依赖基线。DCO workflowPR #16055新增 DCODeveloper Certificate of Origin检查 workflowPR #16090移除了此前的 DCO workaround完善了贡献流程的自动化校验。CI 修复PR #16331修复了 CI 中 xtrabackup 安装失败的问题PR #16345修复了 Docker 镜像构建中的install dependencies脚本涉及 docker/utils/install_dependencies.sh 相关流程。依赖更新PR #16117更新了 VTAdmin 前端依赖中的braces包npm 生态的安全相关修复web 前端位于 web/vtadmin。示例脚本PR #15914更新了 examples/local/env.sh 等示例脚本使其在 macOS 上运行时不再报错。版本流程PR #15888在 v18.0.5 发布后将版本号提升为v18.0.6-SNAPSHOTPR #16444为 v18.0.6 执行了代码冻结Code Freeze这两步是 Vitess 标准的发布流程动作参见 tools/code_freeze.sh。测试稳定性消除 flaky 测试除了功能修复v18.0.6 还针对测试稳定性做了多处打磨PR #16419引入/完善了 Vitess tester workflowPR #16211修复了使用 vtcombogo/cmd/vtcombo的测试中的 flaky 问题PR #16166修复了 vtexplain 单元测试的 flakiness。这些改动虽不直接影响生产行为但显著提升了 CI 可靠性让后续版本迭代中的回归检测更可信。升级建议与验证要点v18.0.6 属于同大版本内的补丁升级从 v18.0.5 升级无需 schema 或拓扑变更。升级时建议重点关注以下行为变化LIMIT GROUP BY 语义修正此前若依赖了错误下推带来的部分分组结果升级后查询可能返回更完整的数据——请先在小流量灰度核对业务查询结果是否符合 MySQL 原生语义。VReplication 流状态修复若集群中有处于 copy 阶段的工作流升级后重启流的行为更符合预期建议对进行中的 Reshard/MoveTables 工作流先执行Workflow show观察状态。vttablet 启动更快表数量多的实例可明显感知启动加速属预期变化。VTorc 超时行为网络抖动场景下 VTorc 的 RPC 探测会更快超时并重试故障切换决策将更及时。验证方式方面可以借助仓库自带的测试体系go test ./go/vt/vtgate/planbuilder/...验证规划器修复go test ./go/vt/wrangler/testlib/...验证 schemacopy 相关逻辑go test ./go/vt/vtexplain/...验证 UNION 与 weight_string 处理。若需本地快速体验可参考 examples/local/README.md 启动本地集群并使用vtctldclient执行 VDiff、Routing Rules 等命令验证修复效果。【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表