引言

Vitess 是一个备受欢迎的 CNCF 开源项目,它被用于扩展全球一些最大的 MySQL 安装,比如 Slack、Square、Shopify 和 GitHub。这些公司利用 Vitess 提供的分片、连接池和其他功能,使横向扩展 MySQL 变得轻松。
Vitess 和 MySQL 非常适合用于在线事务处理系统(OLTP),即最终用户直接与系统交互,快速响应是关键。这些系统生成关键业务记录,如订单、用户档案等。然而,Vitess 和 MySQL 并非专为在线分析处理(OLAP)工作负载优化,也不适用于产品、公司及数据需求增长时所需的一些场景。这就是**变更数据捕获(CDC)**技术(也称为提取-转换-加载,或 ETL)以及数据管道的作用所在。这些技术使你能够维护跨多个系统的数据同步副本,这些系统针对不同的需求而设计。CDC 是一种跟踪数据库变化并将其传播到其他系统的技术,用于实现数据复制、数据仓库和数据集成等场景。它使得比如维护数据仓库或数据湖(用于分析和报告,例如季度销售报告),以及将数据集成到其他系统(其中数据来自于初始的 OLTP 系统)成为可能。


Vitess 构建块

Vitess 提供了许多原语(即构建块),使构建数据管道变得容易。这些原语主要体现在 Vitess 的 VReplication 系统中,这是一个支持多种数据复制和转换的强大机制。对于 CDC 或类似需求,VReplication 提供了一项功能称为 **VStream API**,它允许你实时从 Vitess 集群流式传输变化数据。
像 Debezium 这样的流行 CDC 工具使用低级 VStream 原语来捕获 Vitess 的变化并将它们传播到其他系统。此外,PlanetScale 通过使用 VStream API 构建了 Connect 功能,并支持流行的 CDC/ETL 服务(如 Airbyte 和 Fivetran)的驱动。


VStream 背后的技术细节

VStream 是一个低级组件,通过 gRPC 提供服务。它在 Vitess 的 VReplication 中被内部使用,用于在不同的 VTTablet 间进行数据复制,支持 MoveTables 和 Reshard 等工作流类型。VTGate 的 VStream RPC 使用这个低级组件从 Vitess Keyspace 的分片中流式传输数据,提供一个跨逻辑数据库的统一变更数据流,这个数据库可能包含数百甚至数千个分片。
以下是直接使用 VStream API 的一个简单客户端例子:

git clone git@github.com:vitessio/vitess.git  
cd vitess  
git checkout main  
make build  
cd examples/local  

# 初始化 Vitess 集群
./101_initial_cluster.sh; mysql < ../common/insert_commerce_data.sql; ./201_customer_tablets.sh; ./202_move_tables.sh; ./203_switch_reads.sh; ./204_switch_writes.sh; ./205_clean_commerce.sh; ./301_customer_sharded.sh; ./302_new_shards.sh; ./303_reshard.sh; ./304_switch_reads.sh; ./305_switch_writes.sh; ./306_down_shard_0.sh; ./307_delete_shard_0.sh  

# 运行 VStream 客户端
go run vstream_client.go  

# 在另一个终端中向 VTGate 发送一些插入命令进行测试
for i in {1..10}; do  
  command mysql --no-defaults -h 127.0.0.1 -P 15306 customer -e "insert into customer (email) values ('${i}@foo.com')"
done  

# 完成测试后清理环境
./401_teardown.sh

VStream 客户端的输出将显示从 VTGate 流式传输的变化数据。起初,它会快照当前表的状态(例如分片 customer keyspace 中的 customer 表);随后,实时流式传输表的后续更改信息。


数据流示例

以下是使用低级 VStream API 客户端生成的一些输出示例:

  1. 快照当前的 customer 表状态;
  2. 实时捕获 customer 表随后的逐行更新:
[type:BEGIN keyspace:"customer" shard:"80-" type:FIELD field_event:{table_name:"customer.customer" fields:{name:"customer_id" type:INT64 table:"customer" org_table:"customer" database:"vt_customer" org_name:"customer_id" column_length:20 charset:63 flags:53251 column_type:"bigint"} fields:{name:"email" type:VARBINARY table:"customer" org_table:"customer" database:"vt_customer" org_name:"email" column_length:128 charset:63 flags:128 column_type:"varbinary(128)"} keyspace:"customer" shard:"80-" enum_set_string_values:true} keyspace:"customer" shard:"80-" type:COMMIT keyspace:"customer" shard:"80-"]

[type:ROW row_event:{table_name:”customer.customer” row_changes:{after:{lengths:1 lengths:14 values:”1alice@domain.com”}} keyspace:”customer” shard:”-80″} keyspace:”customer” shard:”-80″]

[type:ROW row_event:{table_name:”customer.customer” row_changes:{after:{lengths:1 lengths:14 values:”2bob@domain.com”}} keyspace:”customer” shard:”-80″} keyspace:”customer” shard:”-80″]

[type:COMMIT keyspace:”customer” shard:”-80″]

如果你对更低级别的细节感兴趣,可以参考官方文档


示例配置

如本文提到的示例,你可以使用类似的设置——例如,使用 Vitess 的 Debezium Connector 而不是 MySQL 的 Debezium Connector,同时将目标系统设为 AWS RedShift 而不是 PostgreSQL(RedShift 基于 PostgreSQL)。这也体现了一个常见原则:设置这些系统时,应使用 Vitess 专用的连接器,而非 MySQL 连接器,其余配置保持不变。
Vitess 提供了一套强大的构建块,通过与各种工具和平台集成,使构建数据管道和处理实时数据成为可能。无论是分析、大规模数据同步还是数据整合,这些工具都能为你提供强大的支持。



使用 Vitess 构建数据管道插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2025/09/14/vitess-data-pipelines/