多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Vitess v17.0.3 版本解读:`--grpc-send-session-in-streaming` 标志与 StreamExecute 流式事务兼容性修复

Vitess v17.0.3 版本解读:`--grpc-send-session-in-streaming` 标志与 StreamExecute 流式事务兼容性修复 数据库分布式数据库云原生后端数据存储【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址https://gitcode.com/gh_mirrors/vi/vitess点击查看免费下载导读Vitess v17.0.3 是 v17.0 系列的一个关键补丁版本共合并 34 个 Pull Request。该版本最重要的技术变更是新增 VTGate 命令行标志--grpc-send-session-in-streaming用于修复 v17.0.0 引入的StreamExecutegRPC API 破坏性变更给客户端升级带来的兼容性问题。本文将以该标志为核心结合仓库源码剖析其实现原理、客户端适配方式与升级注意事项并顺带梳理 v17.0.3 在查询服务、VReplication、Online DDL、Evalengine 等模块的修复亮点。版本总览v17.0.3 的定位与发布背景v17.0.3 属于 v17.0 系列的维护分支release-17.0其正式发布说明位于 changelog/17.0/17.0.3/release_notes.md完整的逐项变更清单见 changelog/17.0/17.0.3/changelog.md。该版本的核心特征可以概括为34 个合并 PR全部以 backport 形式从主干合入 release-17.0 分支1 个重大变更Major Change新增 VTGate 标志--grpc-send-session-in-streaming修复覆盖 Build/CI、CLI、Cluster management、Evalengine、Online DDL、Query Serving、Throttler、VReplication 等多个领域构建基线升级Go 版本升级到go1.20.8并新增独立的 vtorc 容器镜像。版本说明中特别鸣谢了 ajm188、frouioui、mattlord、rohit-nayak-ps 等贡献者其余为自动化机器人账号。核心变更--grpc-send-session-in-streaming标志变更背景v17.0.0 引入的破坏性变更在 v17.0.0 中Vitess 改进了StreamExecutegRPC API 的行为使其在流式响应的最后一个数据包中携带 session从而为流式执行场景提供事务支持。这一改动本身是合理的功能增强但它给依赖旧行为的客户端带来了升级问题——很多客户端只期望收到纯查询结果数据包无法处理多出来的 session 包导致升级 v17.0.0 后出现兼容性故障。这正是 v17.0.3 修复的核心问题。v17.0.3 引入了--grpc-send-session-in-streaming标志将是否在流式响应末尾发送 session变为可由运维显式控制的行为默认关闭从 v17.0.3 起该标志默认值为false即默认不发送 session 包恢复到旧客户端的预期行为按需开启只有客户端代码已经完成适配能识别并消费末尾的 session 包之后才应显式开启该标志。版本说明原文对此的表述为The client should enable it only when they have made the required changes to expect such a packet即开启该标志的前提是客户端已完成相应改造。服务端实现session 如何作为最后一个数据包发送虽然 v17.0.3 中该行为默认关闭但仓库当前的实现已经完整保留了末尾发送 session的代码路径。以 go/vt/vtgate/grpcvtgateservice/server.go 中的StreamExecute方法为例其核心逻辑为处理请求中的 session若为空则创建一个默认的{Autocommit: true}session向后兼容处理调用底层vtg.server.StreamExecute通过回调函数把每个结果包stream.Send给客户端流式执行结束后无论是否发生错误都通过stream.Send发送最后一个StreamExecuteResponse其中只包含Session字段代码注释明确说明Even if there is an error, session could have been modified. So, this needs to be sent back to the client. Session is sent in the last stream response.聚合执行错误与最后发送的错误后统一以 gRPC 错误形式返回。也就是说从协议层面看session 包携带的是本次流式执行最终修改后的 session 状态如自增、临时表、事务上下文等客户端若在流式执行中开启了事务需要从这最后一个包里取回更新后的 session 以继续后续操作。即便执行出错session 也可能已被修改因此仍然需要回传。协议层定义StreamExecuteResponseStreamExecuteResponse消息定义于 proto/vtgate.protoresult字段 1携带查询结果数据其中第一个包只含 Fields 信息列定义后续包才是真正的行数据且每次 Send 可能携带多行session仅在末尾包中出现携带执行后的 session。StreamExecute属于服务端流式server streamingRPC客户端发送一次请求含 SQL、绑定变量与当前 session服务端持续返回多个StreamExecuteResponse包。客户端消费完所有结果包后还应检查是否有最后一个 session 包从而维持事务状态。客户端适配何时需要升级、如何升级对应的 gRPC 客户端实现位于 go/vt/vtgate/grpcvtgateconn/conn.go其StreamExecute方法接收一个processResponse回调逐包处理响应StreamExecuteMulti则是多语句变体。测试侧的实现可见 go/vt/vtgate/grpcvtgateconn/suite_test.go其中fakeVTGateService.StreamExecute的签名(…, callback func(*sqltypes.Result) error) (*vtgatepb.Session, error)正是结果包经回调消费、session 单独返回这一模型的直接体现。对客户端开发者的适配要求可以归纳为识别末尾 session 包逐包消费StreamExecuteResponse当包内Session字段非空或结果字段为空且位于流末尾时将其解析为本次执行后的 session按标志决定行为服务端未开启--grpc-send-session-in-streaming时响应流末尾没有 session 包客户端不应阻塞等待事务场景联动若客户端使用StreamExecute开启事务如BEGIN后的流式读取只有开启该标志才能取回更新后的 session 并正确执行后续的COMMIT/ROLLBACK。升级注意事项与兼容性矩阵对于从 v17.0.0/v17.0.1/v17.0.2 升级到 v17.0.3 的用户若你的客户端未做过任何适配v17.0.3 默认关闭该行为可平滑升级无需改动若你的客户端已经适配了末尾 session 包例如已在 v17.0.0 上完成改造升级到 v17.0.3 后需要在 VTGate 启动参数中显式添加--grpc-send-session-in-streaming否则将无法再收到 session 包若你在 v17.0.0 上依赖流式响应末尾必有 session的中间行为v17.0.3 后必须显式开启该标志以维持行为一致。该标志的后续生命周期跨版本演进从仓库中不同版本的 release notes 可以完整追溯该标志的生命周期这也印证了其在流式事务支持中的长期价值v18.0.0changelog/18.0/18.0.0/release_notes.md继续记录该标志说明其默认关闭的语义与 v17.0.3 保持一致v22.0.0changelog/22.0/22.0.0/release_notes.md该标志被标记为 deprecated且默认值改为true即session 将始终作为 StreamExecute RPC 响应的一部分返回说明社区已经默认客户端完成适配v24.0.0changelog/24.0/24.0.0/release_notes.md该标志被正式移除运维需要清理启动脚本或配置中的相关参数。这一演进路径说明v17.0.3 的该标志并非临时补丁而是 Vitess 流式 API 事务支持从默认行为变更走向显式可控再到默认落地的过渡枢纽。当前仓库主干的StreamExecute实现go/vt/vtgate/grpcvtgateservice/server.go已无条件地在末尾发送 session 包正是这一演进最终状态的源码证据。v17.0.3 其他修复亮点除上述重大变更外v17.0.3 还包含一批值得关注的修复详见 changelog/17.0/17.0.3/changelog.mdQuery Serving查询服务重写USING为ON条件修复 join 中USING子句的改写逻辑保证连接条件生成正确处理大量谓词不超时修复在谓词数量巨大时的查询超时问题修复 join 引擎 OLAP 流式执行的数据竞争#14012代价估算纳入 subshard opcode#14023为 stream execute gRPC API 新增 session 标志#14046即本文核心变更的原始 PR。VReplication数据迁移与流式复制正确处理 JSON 列的 SQL NULL 与 JSONnull#13944从其他 tablet 恢复时正确拷贝已复制的行计数到本地计数器#13949VDiff 修复默认 source/target cell 处理、TabletPicker 场景下 cell 值切分、以及删除 VDiff 前清理 controller 等问题#13969/#14099/#14107。Online DDL 与 TableGC修复被取消迁移的completed_timestamp为空的问题#13928清理被取消迁移的产物并支持 DDL 策略标志--retain-artifactsduration#14029TableGC 支持DROP VIEW#14020。Evalengine、Throttler 与其他Evalengine将UUID()函数标记为非恒定non-constant避免错误缓存#14051Throttler修复非 leader tablet 上探针列表为空的问题#13926BackupShard修复从自身标志而非全局标志获取选项的问题#13813CI/构建Go 版本升级至go1.20.8#13934新增独立 vtorc 容器#14126并启用 e2e race 测试失败检测#13654。升级建议结合版本说明与源码从 v17.0.x 升级到 v17.0.3 的建议流程为评估客户端确认是否有代码依赖StreamExecute流式响应末尾的 session 包分阶段切换先以默认配置标志关闭升级 VTGate验证旧客户端不受影响再分批完成客户端适配后为需要的 keyspace/集群显式开启--grpc-send-session-in-streaming回归测试重点覆盖流式查询下的多语句、事务BEGIN/COMMIT、大结果集分页以及出错场景因为无论执行是否成功session 包都可能在末尾出现留意未来版本该标志在 v22 默认开启并弃用、在 v24 移除长期规划上应尽早完成客户端对末尾 session 包的适配避免被后续大版本强制升级。参考资料v17.0.3 Release Notesv17.0.3 完整 Changelogv17.0.3 SummaryStreamExecute 服务端实现StreamExecuteResponse 协议定义StreamExecute 客户端实现StreamExecute 测试实现v18.0.0 中该标志的记录v22.0.0 中该标志的弃用记录v24.0.0 中该标志的移除记录赞分享数据库分布式数据库云原生后端数据存储【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址https://gitcode.com/gh_mirrors/vi/vitess点击查看免费下载相关推荐Vitess v17.0.3 新特性解析VTGate gRPC StreamExecute 会话回传标志 --grpc-send-session-in-streamingVitess v17.0.3 新特性解析VTGate gRPC StreamExecute 会话回传标志 grpc send session in strea数据库分布式数据库云原生后端数据存储Vitess v17.0.3 版本发布深度解析StreamExecute 会话标志、Online DDL 与 VReplication 关键修复Vitess v17.0.3 版本发布深度解析StreamExecute 会话标志、Online DDL 与 VReplication 关键修复 导读 本文以数据库分布式数据库云原生后端数据存储Vitess v17.0.7 补丁版本解读事务限流、查询规划与 VReplication 健康检查修复全解析Vitess v17.0.7 补丁版本解读事务限流、查询规划与 VReplication 健康检查修复全解析 导读 Vitess v17.0.7 是 v17数据库分布式数据库云原生后端数据存储创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表