人们提到 Vitess,往往先谈它是横向扩展的 MySQL。[1][5] 这句话并没有错,只是还没有碰到真正有分量的那一下。Vitess 真正卖出的东西,是一层关于分片的间接结构。它在应用查询与物理 shard 布局之间插入控制层,于是应用仍旧可以继续说接近普通 MySQL 的语言,而 VTGate、VSchema 与 VReplication 工作流则去承接路由、搬迁与 cutover 里那些更难看也更危险的部分。[1][2][3][4]
这也是到了 2026 之后最值得记住的架构笔记。很多系统都能把数据切开,只要你愿意把 shard map、路由键与迁移痛苦分发给每一个应用团队。Vitess 的动作更具体。它试图把 sharding 变成基础设施问题,而并非应用习惯。若团队想保留 MySQL 语义与生态兼容,又不想继续让开发者手工记忆哪张表、哪个 tenant、哪段 key 应该落在哪台后端服务器上,Vitess 才会显出真正的用处。[1][2][7]
截至 2026-04-12T16:05:55Z UTC,GitHub API 显示 vitessio/vitess 仓库有 20,905 个 stars、2,321 个 forks、926 个 open issues,最近一次 push 时间是 2026-04-11T22:23:51Z;最近的 releases feed 显示 v23.0.3 发布于 2026-02-27T01:43:08Z。[5][6] 这些数字并不替团队完成采用判断,它们说明的是另一件事:这个项目仍在持续交付与运行,而并非停在旧论文与旧演讲里的静态遗存。
配图说明:题图采用的是 Sugu Sougoumarane 的 GitHub 真实头像,而并非一张拓扑示意图。这个选择很贴切,因为本文讨论的本来就是一种由维护者塑形出来的数据库架构立场:分片路由应当成为基础设施策略,而并非散落在每个服务里的经验写法。[8]
1. VTGate 把分片算术从应用边缘拿走
VTGate 的 FAQ 把这件事写得很直白:VTGate 是位于应用与 shards 之间的轻量代理,它本身基本无状态,可以通过增加实例随查询负载一起横向扩展,还会结合 SQL 解析结果与 VSchema 信息,把流量导向正确的 tablet 或 tablet 集合。[1] 这已经不只是“放在 MySQL 前面的代理”了,它其实重新划了责任边界。
文档里最重要的那句话,并非它能扩展,而是它会理解 SQL,再结合 VSchema 进行路由,并把结果聚合返回。[1] 一旦这个责任进入 VTGate,应用就不再需要直接背负 shard map。应用可以继续通过 MySQL 协议接入,把 VTGate 当成一台 MySQL server 来看,而路由层则去跟踪集群状态、底层 failover,以及查询真正该落到哪里。[1]
这件事乍看像运维分工,放回旧式分片系统里看,分量就会变重。2026 年 4 月 11 日那篇关于 Etsy 迁移的 InfoQ 报道很有代表性:Etsy 长期运行一套带内部 ORM 和 index database 的 MySQL 分片体系,真正让迁移到 Vitess 变得有价值的地方,恰恰是它把 shard routing 收回到 vindexes 与 Vitess 基础设施里,而并非继续把这些逻辑散落在内部定制系统各处。[7] 顺着文档与 Etsy 这条案例一起看,Vitess 的价值并不只是“它会分片 MySQL”,而是它提供了一处可管理的位置,在每个产品团队各自发明一套分片逻辑之前,先把这件事收束起来。
2. VSchema 让“一个逻辑数据库”的感觉成立
Vitess 的 VSchema 页面,是这套系统真正抽象层的最清楚表述。VSchema 为底层 keyspaces 与 shards 提供统一视图,把与路由有关的信息放进全局拓扑,再由 VTGate 消费这些信息完成 planning 与 routing。[2] 从另一层看,Vitess 之所以看起来像一个逻辑上的数据库,并非因为 shards 消失了,而是因为有一层元数据把这种统一感老老实实地支撑起来。
文档对应用知道什么、不知道什么,写得很克制。一个 row 最终落在哪个 shard,由 keyspace ID 决定;但 keyspace ID 是 Vitess 的内部概念,不要求有实体列,也可以在需要时重新计算。[2] 应用并不直接围绕这个内部 ID 做路由。真正负责把表字段映射到 keyspace ID、再映射到 shard 的,是 vindexes,尤其是 primary vindex。[2] 这个差异关键,因为它意味着系统可以改变 shard 布局,却尽量维持更高一层的路由契约不变。
也正因此,VSchema 页面才会强调“低干扰 resharding”。文档说,先映射到 keyspace ID,再映射到 shard,这种设计给了 Vitess 足够的灵活性,因为每一行的 keyspace ID 在 reshard 过程中保持不变。[2] 这并非一条漂亮的实现细节,而是它能够承诺“由基础设施主导的数据移动”而并非“由应用主导的大重写”的前提。
当然,这种能力的代价并没有被抹平。resharding 指南在 primary vindex 的选择问题上说得很明白:最高 QPS 查询长什么样,WHERE 子句压在哪些列上,列的基数够不够高,是否要保留 join locality 与 transaction locality,这些都会影响设计。[3] 因而 Vitess 并没有消灭 sharding design 这件事。它做的是把设计收束到一个平台团队可以统一判断的位置,而并非让每个应用自己再学一遍,而且大概率学得更差。
3. VReplication 把拓扑变化改写成工作流,而并非周末事故
很多分片系统在静态图上看上去都还不错,一旦数据要移动,问题才会真正显形。Vitess 恰恰是在这个时刻变得更有意思。MoveTables 与 Reshard 文档描述的并非一次性迁移剧本,而是一条工作流生命周期:create、用 show 或 status 监控、通过 VDiff 校验、用 switchtraffic 切流,最后再 complete 清理。[3][4] 文档还说明,VTGate 在 switchtraffic 与 reversetraffic 时可以对查询做 buffering,从而把用户侧可见影响压得很低。[3][4]
这恰好说明 Vitess 真正卖的是间接层,而并非一句空泛的 scale。Reshard 工作流并不只是复制数据,它把复制、lag 跟踪、流量切换与可回退的方向切换打包成一个控制面。[3] MoveTables 也是一样,它既能用于把数据迁入 Vitess,也能用于 vertical sharding,而且页面直接写明,团队可以先把部分负载迁入 Vitess,再在需要时迁回去。[4]
这里面依旧有真实成本。文档明确提醒,这些工作流会给 source tablets 带来显著压力,尤其当 PRIMARY 作为源头时,于是专门暴露了限速参数,因为 copy phase 本身绝并非免费的。[3][4] status 对复制进度的判断也依赖近似统计,而并非一种神奇的实时确定性。[3][4] 这类诚实很重要。Vitess 并没有把数据移动变便宜,它做的是把数据移动变成一种程序化、可检查、可回转到足以在活系统上执行的过程,让团队不用把每一次 reshard 都当成一次孤立的事故应对。
4. 最适合它的边界
把这些材料放在一起看,得到的结论会比“Vitess 能扩展 MySQL”这句口号窄很多,也有用得多。Vitess 最强的场景,是组织既想保留 MySQL 兼容性与常规应用查询方式,又想停止把 shard placement 的知识教给每一个服务。[1][2][7] VTGate 提供一个稳定的查询入口,VSchema 把路由知识停留在共享拓扑里,VReplication 工作流则把拓扑变化改写成可管理的程序。[1][2][3][4]
反过来看,不匹配的边界也很清楚。若数据规模还远没有逼近普通 MySQL 的操作极限,若团队并不想认真面对 vindex 选择与 shard locality 的代价,或者若预期是“做了分片之后,复杂度会永久不可见”,Vitess 就会显得比问题本身更重。[2][3] 它并非一种神奇的反复杂度薄膜,而是一种很明确的交换:用更多基础设施控制,换取更少应用层分片痛苦。
因此,到了 2026,理解 Vitess 最合适的方式,还是把它看成一种关于分片的间接层。它没有让 shards 消失,它只是把 shards 变成了另一群人那份界限分明的工作。
来源
- Vitess Documentation,《What is VTGate and how does it work?》:VTGate 作为轻量、近乎无状态的代理,如何结合 VSchema 解析 SQL,并保持 MySQL 协议兼容。
- Vitess Documentation,《VSchema》:统一逻辑视图、存放在拓扑中的路由元数据、keyspace ID、primary vindexes,以及低干扰 resharding 的逻辑基础。
- Vitess Documentation,《Reshard》:水平 resharding 的工作流生命周期、status 模型、switchtraffic 行为、buffering 与 source tablets 的压力控制。
- Vitess Documentation,《MoveTables》:迁表与 vertical sharding 工作流、cutover 顺序、可回转性与操作边界。
- GitHub API 中
vitessio/vitess的仓库快照:仓库描述、stars、forks、open issues 与文章创建时的最近一次 push 时间。 - GitHub API 中
vitessio/vitess的 releases feed:最近发布节奏,包括v23.0.3。 - Renato Losio,《Etsy Migrates 1000-Shard, 425 TB MySQL Sharding Architecture to Vitess》。InfoQ,2026 年 4 月 11 日:从次级报道角度说明,把 shard routing 收回到 Vitess 与 vindexes 里,为何在大规模环境下真正重要。
- Sugu Sougoumarane 的 GitHub 个人页:本文题图所用真实头像的来源页。