ARTICLE DETAIL

资讯详情

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

Vitess v16.0.3 版本发布解析:Bug 修复、性能优化与源码级实现印证

Vitess v16.0.3 版本发布解析:Bug 修复、性能优化与源码级实现印证 Vitess v16.0.3 版本发布解析Bug 修复、性能优化与源码级实现印证【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitessVitess v16.0.3 是 16.0 维护分支上的补丁版本其更新覆盖集群管理Cluster management、查询服务Query Serving、Schema Tracker、VReplication 与 TabletManager 五大核心模块并包含 MySQL 8.0 表大小查询的性能优化与 CI 工具链升级。本文以官方 Changelog 为主体逐条梳理各模块的修复内容与影响面并结合当前仓库中的源码实现如 go/mysql/flavor.go、go/vt/srvtopo/resilient_server.go、go/vt/vttablet/tabletserver/schema/engine.go印证关键修复的落地位置帮助维护 16.0 分支的用户评估升级价值。一、版本定位与更新总览Changelog 原文位于 changelog/16.0/16.0.3/changelog.md16.0 系列各补丁版本16.0.0 至 16.0.7的变更记录依次收录在 changelog/16.0/ 目录下。v16.0.3 的更新按类别划分为以下六大块Bug fixes集群管理、Query Serving、Schema Tracker、TabletManager、VReplication 等模块共 19 项缺陷修复是本版本的主要内容CI/BuildGolang 编译版本升级至go1.20.4Documentation修复 Reparenting 指南的文档链接Enhancementrelease notes 生成流程支持通过 flag 设置生成线程数PerformanceTabletManager 的BaseShowTablesWithSizes针对 MySQL 8.0 优化查询Testing大量 flaky不稳定测试修复覆盖升级降级测试、wrangler、查询超时与 VTorc 测试等。从条目结构看绝大多数 Bug fix 带有[release-16.0]前缀表明它们是从主线修复 Backport 到 release-16.0 分支的变更——这正是补丁版本的核心形态不引入新功能只收敛缺陷。二、Bug fixes逐模块解析2.1 集群管理Cluster Management本模块共 6 项修复涉及复制管理、Reparent、升级降级流程与拓扑并发修复项说明关联 PRPrevent resetting replication every time we set replication source修复每次设置复制源set replication source都会重置复制连接的问题避免无谓的复制重启#13392Dont run any reparent commands if the host is empty当 host 为空时不再执行任何 reparent 命令防御非法输入#13402Upgrade-Downgrade Fix: Schema-initialization stuck on semi-sync ACKs while upgrading修复升级过程中 Schema 初始化卡在半同步复制 ACK 等待上的问题#13441Flaky tests: Fix race in memory topo修复内存版 Topologymemory topo中的并发竞争#13576ignore all error for views in engine reloadSchema engine 重载时对视图忽略所有读表错误#13593check keyspace snapshot time if none specified for backup restores备份恢复未指定 snapshot time 时回退检查 keyspace 的 snapshot 时间#13634其中半同步 ACK 卡死问题#13441与init_db.sql的配套修复Testing 板块的 #13525修复了upgrade-downgrade测试 setup共同保障了 16.0 分支上跨版本升级降级路径的可用性对正在从 v15.x 升级或需要版本回退的集群尤为重要。2.2 查询服务Query ServingQuery Serving 是本版本修复最集中的模块共 8 项直接关系 vtgate/vttablet 的查询正确性与可用性修复项说明关联 PRFix the resilientQuery to give correct results during initialization修复弹性查询resilient query在拓扑初始化期间返回错误结果的问题#13087evalengine: TypeOf for Columns should only use value type when we have a value求值引擎中列的TypeOf仅在存在值时才使用值类型避免类型误判#13154Remove indentation limit in the sqlparser移除 SQL 解析器对缩进indentation的长度限制改善复杂 SQL 解析#13166Fix: errant GTID in health streamer修复健康检查 streamer 中错误 GTID 报告的问题#13184Fix: TabletServer ReserveBeginExecute to return transaction ID on errorReserveBeginExecute在出错时也应返回已分配的 transaction ID避免事务资源泄漏#13193Bug fix: SQL queries erroring with messageunknown aggregation random修复包含random聚合导致unknown aggregation random报错的问题#13334ignore ongoing backfill vindex from routing selection路由选择时忽略正在 backfill 的 vindex避免把流量切到未完成回填的 lookup 上#13607examples/compose: fixconsul:latesterror w/docker-compose up -d修复 compose 示例中 consul 镜像版本错误导致docker-compose up -d失败的问题#13472其中“正在 backfill 的 vindex 不应参与路由选择”一项影响所有正在执行 Lookup Vindex 数据回填的集群在回填完成前新写入的行落在旧路由规则上若路由选择器误用未回填的 vindex查询会漏读数据。修复后路由决策会跳过这类中间态 vindex。2.3 Schema Tracker修复项说明关联 PRIgnore error while reading table data in Schema.Engine reloadSchema.Engine重载时读取表数据出错先被忽略#13424Backport v16: schema.Reload(): ignore column reading errors for views only, error for tables进一步收紧策略仅对视图忽略列读取错误对表仍按错误处理#13456这两条形成一条清晰的演进链先放宽再收敛。从源码结构看该逻辑落在 vttablet 的 Schema 跟踪组件 go/vt/vttablet/tabletserver/schema/engine.go 的Reload路径中。最终语义是视图不存在数据表那样的行读取语义重载视图时不应因读列失败而阻塞整个 Schema 重载而普通表的重载失败必须显式报错保证 Schema 状态与 MySQL 真实状态一致。2.4 TabletManager 与 mysqlctl修复项说明关联 PRmysqlctl: Correctly encode database and table names修复 mysqlctl 在拼接 SQL 时对数据库名与表名编码不正确的问题#13323Operator: Upgrade mysqld memory limits to 1024MiOperator 部署模式下 mysqld 容器内存上限提升到 1024Mi#13204数据库名/表名编码问题意味着当 keyspace 或表名包含特殊字符时mysqlctl 生成的 DDL 可能引用到错误的对象修复保证了名字转义的正确性。Operator 内存限制的抬升则是针对 Kubernetes 部署场景下 mysqld 更容易触发 OOM 的调参。2.5 VReplicationVReplication 是 Vitess 跨集群复制与在线 Reshard 的底座本版本有 4 项针对性修复修复项说明关联 PRDo not delete sharded target vschema table entries on CancelCancel操作不再删除分片目标端的 vschema 表条目避免误删元数据#13155Pass on --keep_routing_rules flag value for Cancel actionCancel动作正确透传--keep_routing_rules标志值#13194Fix VDiff2 DeleteByUUID Query修复 VDiff2 中按 UUID 删除的 SQL 查询缺陷#13282Ensure ROW events are sent within a transaction保证 ROW 事件在同一事务边界内发出防止行事件跨事务拆分#13580这组修复相互关联--keep_routing_rules是 Reshard/VReplication 工作流的关键开关决定 Cancel 或完成时是否保留路由规则变更此前 Cancel 路径既不保留该标志值又会误删目标 keyspace 的 vschema 表条目两项一起修复后取消迁移Cancel操作对 vschema 与路由规则的影响变得可预期。从源码组织看VReplication 的流式复制实现位于 go/vt/vttablet/tabletmanager/vreplication/VDiff2 工具的实现与说明见 go/vt/vttablet/tabletmanager/vdiff/README.md相关流复制链路可通过 go/vt/vttablet/tabletserver/vstreamer/tablestreamer.go 进一步追踪。三、性能优化MySQL 8.0 的表大小查询Changelog 中唯一的 Performance 条目是BaseShowTablesWithSizes: optimize MySQL 8.0 query (#13375) #13389这条修复的落点在 MySQL 连接层的 flavor 抽象。从源码结构看BaseShowTablesWithSizes经由 go/mysql/flavor.go 中Conn.BaseShowTablesWithSizes()分发到各 MySQL 版本 flavor 的baseShowTablesWithSizes()实现不同 MySQL 版本5.7、8.0、8.0.26、9.0 及 MariaDB返回的查询各自不同——这正是“针对 MySQL 8.0 优化”能够按版本精准生效的原因。其返回结果的字段结构定义在 go/mysql/schema.go 的BaseShowTablesWithSizesFields在基础表列表字段上追加i.file_size与i.allocated_size两个 INT64 字段以及配套的BaseShowTablesWithSizesRow()。该查询被 vttablet 的查询执行层用于SHOW TABLES WITH SIZES语义端到端验证用例见 go/vt/vttablet/endtoend/misc_test.go 的TestShowTablesWithSizesL789 起测试先调用conn.BaseShowTablesWithSizes()取查询再在真实 MySQL 上执行并断言结果。8.0 版查询的优化降低了 information_schema 统计的开销使该命令在大表数量场景下更轻。四、弹性查询Resilient Query初始化缺陷修复Query Serving 中的“Fix the resilientQuery to give correct results during initialization (#13087)”值得单独说明。弹性查询是 srvtopo 层的核心能力当某 keyspace 的拓扑条目短暂缺失例如拓扑服务抖动时resilientQuery不立即报错而是基于已有信息继续工作并在初始化完成后收敛到正确结果。其实现集中在 go/vt/srvtopo/resilient_server.go相关查询逻辑见 go/vt/srvtopo/query.go。该修复的意义在于修复前拓扑初始化的窗口期内弹性查询可能返回错误结果修复后vtgate 依赖的 keyspace/shard 发现经由 go/vt/discovery/keyspace_events.go 等事件源消费在集群启动与拓扑变更期间更可靠直接降低了“重启 vtgate 后短暂查询异常”这类问题的发生概率。五、CI/构建与测试修复5.1 构建与发布工具链Go 版本升级CI 的 Golang 版本升级为go1.20.4#13053。这与仓库 go.mod 中声明的工具链保持一致16.0 分支用户自行编译时应使用 Go 1.20.x。Release notes 生成优化改为基于 GitHub Milestones 生成#13621并支持用 flag 指定生成线程数#13316同时修复了 v16.0.2 release notes 的格式错误#13058。文档链接修复Reparenting 指南的链接更新#13356。5.2 测试稳定性DeflakeTesting 板块共 9 项全部是测试基础设施本身的修复不改变产品行为但它们决定了 16.0 分支回归验证的可信度板块修复项关联 PRBackup and Restore修复upgrade-downgrade测试 setup 与init_db.sql#13525Cluster managementDeflakeTestPlannedReparentShardPromoteReplicaFail#13549Cluster management修复 wrangler 相关 flaky 测试#13571General修复Upgrade Downgrade Testing - Backups - Manual#13408Query Serving修复plan_test.go基准测试#13126Query ServingDeflakeTestQueryTimeoutWithDual#13409Query Serving修复TestGatewayBufferingWhileReparenting不稳定问题#13500Query Serving修复TestQueryTimeoutWithTablesflaky 问题#13585VTorc修复 VTOrc 测试 flakiness#13528vtctl修复 release-16.0 上新的 vtctl 升级降级测试#13252其中TestPlannedReparentShardPromoteReplicaFail与TestGatewayBufferingWhileReparenting分别对应计划内重父Planned Reparent与 VTGate 缓冲见设计文档 doc/design-docs/VTGateBuffering.md两个关键路径这两个用例的稳定性直接反映 Reparent 期间读缓冲机制的回归质量。六、升级建议与适用前提结合本版本内容与仓库现状对仍停留在 v16.0.0–v16.0.2 的用户给出如下评估依据以当前仓库实际代码为准正在执行或计划执行 Reshard/VReplication 的集群强烈建议升级到 16.0.3因为Cancel路径的 vschema 误删与--keep_routing_rules透传缺陷#13155、#13194直接影响迁移取消的安全性。使用 Lookup Vindex 且正在回填数据的集群#13607 修复了路由选择误用 backfill 中 vindex 的问题与查询正确性直接相关。从 v15.x 升级或存在版本回退需求的集群半同步 ACK 卡死修复#13441与配套的升级降级测试修复#13525、#13408降低了升级/降级路径的风险。使用 MySQL 8.0 并频繁执行表大小类诊断命令的集群可享受BaseShowTablesWithSizes查询优化。适用前提16.0 是维护分支本版本不引入新功能如需新特性应以 17.0 为参照其 Changelog 见 changelog/17.0/。七、小结Vitess v16.0.3 是一个典型的“收敛型”补丁版本19 项 Bug 修复全部围绕既有功能的正确性展开修复密度集中在 Query Serving 与 VReplication 两个高频使用路径上唯一的性能优化MySQL 8.0 表大小查询与 CI 的 Go 1.20.4 升级则在底层降低了诊断开销并统一了构建环境。结合 changelog/16.0/ 目录下的完整变更记录与本仓库源码中的实现落点flavor 查询分发、弹性查询、Schema 引擎重载、VReplication 工作流可以准确判断每条修复对自己集群的影响面从而做出有依据的升级决策。【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址: https://gitcode.com/gh_mirrors/vi/vitess创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表