ARTICLE DETAIL

资讯详情

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

Vitess v16.0.0 版本升级指南:破坏性变更、增量备份、VTOrc 强制化与 VReplication 新特性深度解析

Vitess v16.0.0 版本升级指南:破坏性变更、增量备份、VTOrc 强制化与 VReplication 新特性深度解析 数据库分布式数据库云原生后端数据存储【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址https://gitcode.com/gh_mirrors/vi/vitess点击查看免费下载导读本文以 Vitess 官方 v16.0.0 发布说明changelog/16.0/16.0.0/summary.md为核心系统梳理该版本对生产集群影响最大的已知问题与升级注意事项并深入讲解增量备份与时间点恢复PITR、Tablet Throttler 动态配置、VReplication 并行写入、VTOrc 强制化等关键特性。读完本文你将掌握从 v15 平滑升级到 v16 的完整检查清单、新命令行参数的使用方法以及从源码层面对这些变更底层实现的理解可直接用于规划集群升级与排障。一、升级前必读v16.0.0 的 Known Issuesv16.0.0 发布时存在四个官方记录的已知问题其中三个已在后续 patch 版本v16.0.3 及以后修复。升级或部署前务必对照检查。1.1 MySQL INSTANT DDL 与 XtraBackup 冲突这是 v16 用户最可能踩中的坑。自 MySQL 8.0.12 起InnoDB 的ALTER TABLE默认算法为INSTANTMySQL 8.0.29 又为更多常见操作如新增列启用了 INSTANT 支持。但该改动与 Percona XtraBackup 冲突一旦在 MySQL 8.0.29 上执行了可被 INSTANT 优化的ALTER TABLEXtraBackup 将无法再备份该表乃至整个数据库。关键事实受影响版本MySQL8.0.29-8.0.31不适用于 Percona Server 发行版即使后续升级到 MySQL 8.0.32该表依然无法备份必须重建表官方解决路径是 Percona XtraBackup8.0.32 MySQL8.0.32的组合。受影响的条件是使用 MySQL8.0.29-8.0.31且用 XtraBackup 备份同时执行过ALTER TABLE直接执行或通过 Vitess v16.0 及以下的 Online DDL。缓解措施使用 Percona XtraBackup8.0.32 MySQL8.0.32可直接使用镜像vitess/lite:v16.0.0-mysql-8.0.32改用 Percona Server所有ALTER TABLE语句显式追加ALGORITHMINPLACE或ALGORITHMCOPY。已受影响时的处理方法改用builtin备份引擎不基于 XtraBackup升级到 MySQL/XtraBackup8.0.32或切到 Percona Server然后重建表OPTIMIZE TABLE your_table或ALTER TABLE your_table ENGINEInnoDB升级到 Vitess v16.0.1 后可通过 Online DDL 重建表$ vtctldclient ApplySchema --skip_preflight --ddl_strategy vitess --sql ALTER TABLE your_table ENGINEInnoDB your_keyspace或直接在会话中执行 SET ddl_strategyvitess; ALTER TABLE your_table ENGINEInnoDB;1.2 VTTablet Restore 指标丢失v16.0.0 的 sidecar 数据库重构删除了local_metadata表导致与备份恢复相关的两项指标随之丢失。这些指标已在 v17.0.0 中以/debug/vars可访问的 metrics 形式重新引入。1.3 升级时 schema 初始化卡在 semi-sync ACK从 v15.x.x升级到v16.0.0时PromoteReplica调用中的 schema-init 发现 schema diff 需要写入数据库若开启了 semi-sync这些写入会被无限期阻塞最终导致PromoteReplica失败、整个 PRSPlanned Reparent Shard调用失败。该问题已在 v16.0.3 及后续 patch 中修复。1.4 v17 降级到 v16.0.0 因 super_read_only 失效v17.x 默认开启super_read_only而init_db.sql需要写权限导致从 v17 降级到 v16.0.0 失败。该问题在 v16.0.3中通过 PR #13525 修复。二、Breaking Changes升级必须调整的配置与行为2.1 VTGate 广告的 MySQL 版本改为 8.0.30自 PR #11989 起VTGate 对外广告的 MySQL 版本从5.7.9-vitess变为8.0.30-vitess。依赖广告版本的客户端如仍运行 MySQL 5.7 的场景会受影响。注意避免使用保留连接reserved connection的特性依赖mysql_server_version标志其默认值变更可能导致查询被意外改写。建议 MySQL 5.7 用户显式设置vtgate --mysql_server_version5.7.9-vitess2.2 Docker 镜像默认 MySQL 版本升为 8.0vitess/lite:latest默认大版本从 5.7 升到 8.0且 MySQL 8.0 的 patch 版本从8.0.23升到8.0.30PR #12252。使用 vitess-operator 且想留在 MySQL 5.7 的用户必须使用vitess/lite:v16.0.0-mysql57镜像已在 operator 上跑 MySQL 8.0如vitess/lite:v15.0.2-mysql80的用户因 patch 版本从 8.0.23 升到 8.0.30需手动升级在 YAML 的 extra cnf 中加入innodb_fast_shutdown0应用该文件等待所有 Pod 健康修改 YAML 使用新镜像vitess/lite:v16.0.0默认 mysql80移除innodb_fast_shutdown0再次应用。2.3 命令行标志的删除与弃用vtctld随 UI 移除以下标志被弃用/删除弃用--vtctld_show_topology_crud删除--enable_realtime_stats、--enable_vtctld_ui、--web_dir、--web_dir2、--workflow_manager_init、--workflow_manager_use_election、--workflow_manager_disablemysqlctlv15 pflag 改造后遗留的无用 server 标志被清理脚本中使用以下标志需在升级前移除--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeoutVTTablet删除--enable_semi_sync、--backup_storage_hook改用内置压缩算法或--external-compressor/--external-decompressor、--init_populate_metadatalocal_metadata与shard_metadatasidecar 表已删除。--disable-replication-manager被弃用。VTBackup删除--backup_storage_hook。VTOrc--lock-shard-timeout弃用改用新标志--lock-timeout。2.4lock-timeout与remote_operation_timeout拆分此前 shard/keyspace 锁的等待时长被remote_operation_timeout封顶。PR #11881 后引入独立标志lock-timeout若未显式指定lock-timeout而提供了remote_operation_timeout后者的值会同时用于lock-timeout向后兼容remote_operation_timeout默认值从 30 秒改为15 秒lock-timeout默认值为45 秒。源码佐证go/vt/topo/locks.go 中定义LockTimeout 45 * time.Second与RemoteOperationTimeout 15 * time.Second并在 registerTopoLockFlags 中注册--lock-timeout与--remote-operation-timeout两个标志获取锁时以LockTimeout构造带超时的 context见 locks.go。升级建议若希望保持旧行为升级前显式提供remote_operation_timeout升级后再在配置中显式指定lock-timeout。2.5 Orchestrator 集成删除与 vtctld Web UI 移除Orchestrator 集成在 vttablet 中彻底删除必须部署 VTOrc 替代vtctld UIv13 弃用本版本删除web/vtctld2目录镜像不再包含 UI但 HTTP API 保留在{$vtctld_web_port}/api。2.6 Query Serving Errors 增加错误码PR #10738 引入带错误码的错误报告每个错误附VT前缀 数字编码便于搜索与上报。例如aggregate functions take a single argument count(user_id, name)变为VT03001: aggregate functions take a single argument count(user_id, name)如果你有按错误字符串匹配的代码这是破坏性变更需要更新匹配逻辑。2.7 Logstats、Stats 与 Prometheus 标签规范化LogstatsTable/Keyspace字段在 v15 弃用后于 v16 删除改用 v15 引入的TablesUsed字符串数组列出所有表及其 keyspace移除的统计QueryRowCounts删除可用QueryRowsAffected与QueryRowsReturned替代弃用的统计QueriesProcessed与QueriesRouted弃用下个版本移除改用QueriesProcessedByTable与QueriesRoutedByTablePrometheus 标签规范化PR #12057所有 label 统一为snake_case。典型映射旧指标新指标vtgate_topology_watcher_errors{OperationGetTablet}vtgate_topology_watcher_errors{operationGetTablet}vtgate_topology_watcher_operations{OperationAddTablet}vtgate_topology_watcher_operations{operationAddTablet}vtgate_queries_processed{PlanReference}vtgate_queries_processed{planReference}vtgate_queries_routed{PlanReference}vtgate_queries_routed{planReference}vttablet_table_allocated_size{Tablecorder}vttablet_table_allocated_size{tablecorder}vttablet_table_file_size{Tablecorder}vttablet_table_file_size{tablecorder}vttablet_topology_watcher_errors{OperationGetTablet}vttablet_topology_watcher_errors{operationGetTablet}vttablet_topology_watcher_operations{OperationAddTablet}vttablet_topology_watcher_operations{operationAddTablet}依赖 Prometheus 告警规则/面板的用户需同步更新 label 名。三、Replication Manager 移除VTOrc 成为必选组件v16 起VTOrc 成为必需组件。复制管理的职责完全交给 VTOrcvttablet 内置的 replication manager 被删除disable-replication-manager标志被弃用未来版本移除。若希望 Vitess 管理复制必须运行 VTOrc。这与此前删除 Orchestrator 集成的动作一脉相承复制拓扑修复统一收敛到 VTOrc。四、VReplication 增强VStream Copy Resume 与 VDiff2 GA4.1 VStream Copy ResumePR #11103 引入 VStream copy 操作的可恢复能力。当 copy 因网络故障或服务器重启中断时可在新的 VStream 请求中指定每张表最后看到的last seen主键值来恢复 copy避免从头开始全量拷贝。4.2 VDiff2 正式 GAVDiff v2 在 v16 标记为生产就绪GA官方推荐用 v2 替代 v1。v1 将逐步弃用并移除仍想用 v1 的用户需显式指定--v1标志。五、Tablet Throttler 动态配置实验特性throttler 配置从 vttablet 命令行标志迁移到topo service一个 keyspace 下所有 cell、所有 shard 的所有 tablet 共享配置可动态启停限流、调整阈值与限流查询。v16 中该功能标记为实验性为向后兼容仍支持 vttablet 标志方式。新标志--throttler-config-via-topo切换配置来源默认false未来版本默认true。配置更新通过vtctldclient UpdateThrottlerConfig完成# 关闭限流器所有限流检查返回 200 OK $ vtctldclient UpdateThrottlerConfig --disable commerce # 开启限流器检查按当前指标返回对应状态 $ vtctldclient UpdateThrottlerConfig --enable commerce # 同一命令中开启并设置阈值未指定查询默认检查复制延迟 $ vtctldclient UpdateThrottlerConfig --enable --threshold 5.0 commerce # 仅修改阈值不影响限流器的启停状态 $ vtctldclient UpdateThrottlerConfig --threshold 1.5 commerce # 使用自定义查询 $ vtctldclient UpdateThrottlerConfig --custom_query show global status like threads_running --check_as_check_self --threshold 50 commerce # 恢复默认查询与阈值 $ vtctldclient UpdateThrottlerConfig --custom_query --check_as_check_shard --threshold 1.5 commerce六、增量备份与时间点恢复PITRPR #11097 引入原生增量备份与时间点恢复核心能力包括可基于最后一次全量或增量备份备份到指定 GTID 位置或auto当前位置备份方式为复制二进制日志按需轮转 binlog恢复时寻找一条恢复路径一个全量备份 零个或多个增量备份一直应用到目标时间点恢复到时间点的服务器保持DRAINEDtablet 类型不加入复制流即冻结在时间点可从不同 tablet 取增量备份内容允许重叠只要备份的 binlog 内容无空洞即可。源码中增量备份相关参数与逻辑集中在 go/vt/mysqlctl/backupengine.goIncrementalFromPos字段、go/vt/mysqlctl/backup.go增量备份总是使用builtin引擎因为需要复制 binlog 文件增量备份 manifest 中FromPosition非空且Incremental true见 backupengine.go。6.1 发起增量备份Backup --incremental_from_pos$ vtctlclient -- Backup --incremental_from_pos MySQL56/16b1039f-22b6-11ed-b765-0a43f95f28a3:1-615 zone1-0000000102 $ vtctlclient -- Backup --incremental_from_pos auto zone1-0000000102auto表示以最后一次成功备份的Position为起点。增量备份不停止 MySQL、不加锁、不中断流量先轮转 binlog再拷贝从请求位置到最后一个完整 binlog 的所有内容。因此备份不一定恰好从请求位置开始以第一个包含更新条目的 binlog 为起点恢复进程会丢弃重复事务。若无法从指定位置获取 binlog如已被清理备份失败。6.2 时间点恢复RestoreFromBackup --restore_to_pos--restore_to_pos恢复到指定位置含为止不再前进--dry_run计算并评估恢复路径但不实际改动服务器。$ vtctlclient -- RestoreFromBackup --restore_to_pos MySQL56/16b1039f-22b6-11ed-b765-0a43f95f28a3:1-220 zone1-0000000102恢复进程会寻找由一个全量备份 零或多个增量备份组成的恢复路径存在多条路径时优先选择备份数量最少的路径。以下情况命令失败增量备份存在空洞gap现有备份未覆盖到请求位置所有全量备份都超过请求位置无法回到更早位置。恢复结束后服务器处于故意破坏的复制配置tablet 类型为DRAINED。七、新命令行标志与行为详解7.1 VTGate--query-timeout对所有查询设置超时优先级从低到高为--query-timeout标志 session 变量query_timeout 查询注释指令QUERY_TIMEOUT_MS。源码中QUERY_TIMEOUT_MS指令在 go/vt/sqlparser/comments.go 中定义并在执行器层面通过SetExecQueryTimeoutgo/vt/vtgate/executor.go与route.QueryTimeout构造带超时的 contextgo/vt/vtgate/engine/route.go生效。-- 以注释指令覆盖全局超时单位毫秒 SELECT /*vt QUERY_TIMEOUT_MS100 */ * FROM user;7.2 VTTablet--vreplication-parallel-insert-workers--vreplication-parallel-insert-workers[integer]在 VReplication copy 阶段启用并行批量插入默认关闭。设为大于 1 时vstream 包中的批量插入每个包是一条事务可并行、乱序执行但事务提交仍严格按序串行化。该标志在 go/vt/vttablet/common/flags.go 中注册配置项传入 VReplication 的ParallelInsertWorkersgo/vt/vttablet/common/config.go。copy 阶段的其他保证不变处理一个 vstream 包的所有语句在单个 MySQL 事务内执行_vt.copy_state的写入总是跟随包内对应 insert包的最终commit总是跟随_vt.copy_state的写入包按流中顺序提交对任意 PK1、PK2PK1 的copy_state写入与 commit 都先于 PK2。catchup、fast-forward、replicatingrunning等其他阶段行为不变。7.3 VTTablet--queryserver-config-pool-conn-max-lifetime设置查询服务器连接池中每个连接的存活上限系统在[值, 2×值]间取随机数连接存活超过该随机值时下次归还连接池即被移除。注册于 go/vt/vttablet/tabletserver/tabletenv/config.go。随机化取值可避免大量连接同时到期导致的重建风暴适用于有连接老化/回收需求的场景。7.4 新vexplain查询命令语法VEXPLAIN [ALL|QUERIES|PLAN] explainable_stmtPLAN查看 vtgate 为查询生成的执行计划QUERIES查看在所有 MySQL 实例上实际执行的查询ALLvtgate 计划 已执行查询的 MySQL explain 输出。同时EXPLAIN的VTEXPLAIN与VITESS两种 format 被弃用应改用上述新命令。八、重要 Bug 修复与 Deprecations8.1 JOIN 场景非全 group-by 查询结果损坏修复 v14.0.3与 v15.0.0中非 full-group-by 查询带 JOIN 时可能生成损坏结果的问题已在 v16 修复。8.2 其他弃用与移除清单V3 planner在 v16 弃用v17 移除VReplication v1 命令v11 起弃用全部移除必须改用 v2 命令vtctlclient VExec命令移除v12 起弃用vtctlclient VReplicationExec弃用未来版本移除vtctlclient OnlineDDL ... [complete|retry|cancel|cancel-all]成功时返回空结果不再返回受影响的 shard 数遗留 Workflow Manager 相关代码删除涉及vtctl命令WorkflowAction、WorkflowCreate、WorkflowWait、WorkflowStart、WorkflowStop、WorkflowTree、WorkflowDeleteVTAdmin 的VTExplainendpoint 弃用改用vexplain查询格式未来删除。九、MySQL 兼容性提升9.1 事务隔离级别支持set [session] transaction isolation leveltransaction_characteristic: { ISOLATION LEVEL level | access_mode } level: { REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE }设置作用于当前会话会话在任意 shard 开启事务时生效。9.2 事务访问模式支持带事务特性的START TRANSACTIONSTART TRANSACTION [transaction_characteristic [, transaction_characteristic] ...] transaction_characteristic: { WITH CONSISTENT SNAPSHOT | READ WRITE | READ ONLY }9.3 Views实验特性v16.0.0 以实验特性发布分片sharded视图支持默认关闭。启用方式VTGate--enable-viewsVTTablet--queryserver-enable-views十、VTTestServer 性能改进vttestserver 建库耗时约 45 秒在大量 create/drop database 的测试环境中成为瓶颈。PR #11918 将 vtcombo 初始化时的tablet_refresh_interval调整为 10 秒并使其可配置。注意生产集群该标志默认仍为 1 分钟调小会增加 Topo Server 压力读取更频繁但对测试环境无碍。十一、附备份压缩基准Minor Changesmysqlctl包新增压缩基准测试go test -benchBenchmarkCompress ./go/vt/mysqlctl使用约 6 GiB 的 tar 包含 3 个 InnoDB 文件对比内置与外部压缩器。官方在 2020 年代 Mac M1/16 GiB 内存上的示例结果$ go test -benchBenchmarkCompress ./go/vt/mysqlctl -runNONE -timeout12h -benchtime1x -v BenchmarkCompressLz4Builtin-8 1 11737493087 ns/op 577.98 MB/s 2.554 compression-ratio BenchmarkCompressPargzipBuiltin-8 1 31083784040 ns/op 218.25 MB/s 2.943 compression-ratio BenchmarkCompressPgzipBuiltin-8 1 13325299680 ns/op 509.11 MB/s 2.910 compression-ratio BenchmarkCompressZstdBuiltin-8 1 18683863911 ns/op 363.09 MB/s 3.150 compression-ratio BenchmarkCompressZstdExternal-8 1 10795487675 ns/op 628.41 MB/s 3.093 compression-ratio BenchmarkCompressZstdExternalFast4-8 1 7139319009 ns/op 950.23 MB/s 2.323 compression-ratio BenchmarkCompressZstdExternalT0-8 1 4393860434 ns/op 1543.97 MB/s 3.093 compression-ratio BenchmarkCompressZstdExternalT4-8 1 4389559744 ns/op 1545.49 MB/s 3.093 compression-ratio PASS注意基准会从外部 URL 下载测试数据且结果依硬件而异仅供选型参考。十二、内部重构VTTablet Sidecar Schema 维护方式变更v16 改变了 vttablet sidecar 数据库_vtschema 的维护方式放弃旧的WithDDL包PR #6348 引入改用声明式方法。开发者需在go/vt/sidecardb/schema目录维护期望 schema每张表一个文件新模块sidecardb对比现有 schema 并执行所需的create/alter在 primary vttablet 每次启动时进行。该重构对用户无感知但副作用是local_metadata与shard_metadata两张 sidecar 表不再使用相关引用全部删除。它们此前服务于 Orchestrator 支持而 Orchestrator 已被 VTOrc 取代——这也解释了上文 1.2 节 restore 指标丢失的根源。结语v16.0.0 升级行动清单检查 MySQL 版本是否落在8.0.29-8.0.31且使用 XtraBackup若是则规划升级到 XtraBackup8.0.32 MySQL8.0.32并尽快升级到 v16.0.1部署VTOrcv16 起必选确认 replication manager 相关脚本不再依赖检查脚本中已删除的 vtctld/mysqlctl/VTTablet/VTBackup 标志并移除显式设置remote_operation_timeout如需保持旧 30s 行为并为lock-timeout规划显式配置检查查询错误匹配逻辑新增VTxxxxx错误码、Prometheus 告警标签snake_case 化、日志解析TablesUsed替代Table/Keyspace使用 vttestserver 的测试工程可关注建库提速生产环境不要随意调小tablet_refresh_interval若使用 vitess-operator 且停留 MySQL 5.7务必指定vitess/lite:v16.0.0-mysql57镜像。赞分享数据库分布式数据库云原生后端数据存储【免费下载链接】vitessVitess is a database clustering system for horizontal scaling of MySQL.项目地址https://gitcode.com/gh_mirrors/vi/vitess点击查看免费下载相关推荐Vitess v16.0.0 版本发布深度解读破坏性变更、增量备份与 VReplication 新特性实战指南Vitess v16.0.0 版本发布深度解读破坏性变更、增量备份与 VReplication 新特性实战指南 导读 本文以 Vitess v16.0.0 官数据库分布式数据库云原生后端数据存储Tempo 2.1 版本特性与升级指南TraceQL 增强、vParquet2 与破坏性变更解析Tempo 2.1 版本特性与升级指南TraceQL 增强、vParquet2 与破坏性变更解析 Grafana Tempo 2.1 是 Tempo 在 2.后端可观测性链路追踪Vitess 15.0 升级指南破坏性变更、新特性与迁移实操全解析Vitess 15.0 升级指南破坏性变更、新特性与迁移实操全解析 本篇技术指南以 Vitess 15.0.0 官方 Release Summary 为主体骨数据库分布式数据库云原生后端数据存储上一篇【限时免费】 4.10热门项目推荐dante-cloud - 企业级微服务与单体架构双模解决方案下一篇一拍 10msopenpilot 横向控制如何用曲率闭环 延迟补偿跟上转向滞后创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表