在PlanetScaleDB上学习使用Vitess进行水平扩展——在Rust应用中使用分片MySQL数据库对小狗进行评分

在PlanetScaleDB上学习使用Vitess进行水平扩展——在Rust应用中使用分片MySQL数据库对小狗进行评分

💡 原文英文,约2000词,阅读约需8分钟。
📝

内容提要

本文介绍了PlanetScaleDB和Vitess的水平扩展功能,重点讲解了分片数据库的概念及其在应用中的实现。Vitess可以将多个数据库视为一个单一数据库,从而简化数据管理。通过示例应用“Goodest Doggo”,展示了如何使用VSchema和Vindex高效管理数据,确保数据的一致性和可扩展性。

🔎

延伸解读

Vitess分片的核心优势:数据共置

许多分片数据库系统在分片时只考虑均匀分布,而忽略数据之间的关联性,导致跨分片事务和查询效率低下。Vitess允许将关联数据共置在同一分片,例如用户表和订单表分别按用户ID和订单中的用户ID分片,确保同一用户的数据位于同一分片。这种设计减少了跨分片操作,提升了读写性能和事务一致性。

VSchema与Vindex:分片管理的核心抽象

VSchema类似于关系型数据库的schema,但用于定义数据在多个分片中的组织方式,包括是否分片、使用的Vindex以及各表的Vindex配置。Vindex则类似于索引,但用于快速定位行所在的分片。每个表只能有一个主Vindex,但可以有多个辅助Vindex。通过VSchema和Vindex,应用可以像操作单库一样操作分片数据库,无需在代码中处理分片逻辑。

Vitess序列:解决分片下的自增ID问题

在分片环境中,传统的自增列会导致不同分片产生重复ID。Vitess通过序列(Sequence)解决此问题,序列由位于未分片keyspace中的特殊表实现,并在VSchema中声明。应用只需在表定义中引用序列,Vitess便会生成全局唯一且单调递增的ID。序列支持缓存一定数量的值,以减少对后端表的写入压力,适合高并发场景。

从示例看分片实践:Goodest Doggo应用

示例应用“Goodest Doggo”使用两个keyspace:未分片的lookup用于存储序列和查找表,分片的puppers存储实际数据。puppers表按id分片,ratings表按pupper_id分片,确保同一小狗的评分数据与小狗数据位于同一分片。通过VSchema定义序列和Vindex,应用无需修改业务逻辑即可实现水平扩展。读者可参考此模式设计自己的分片方案。

❓

Q&A

什么是PlanetScaleDB?

PlanetScaleDB是基于开源Vitess构建的完全托管的数据库服务,支持MySQL的水平扩展。

Vitess如何实现数据库的分片?

Vitess通过将多个具有相同关系模式的数据库集合视为一个单一数据库,简化了数据管理,并允许应用程序在不改变逻辑的情况下扩展。

VSchema在Vitess中有什么作用?

VSchema用于定义分片数据库中数据的组织方式,确保相关数据的共同存储,提高访问效率。

Vindex是如何工作的?

Vindex用于快速定位分片数据库中的行,通过特定列的值计算出keyspace_id,从而确定行所在的分片。

如何在Vitess中生成唯一的自增值?

Vitess通过在VSchema中定义序列来实现唯一自增值,避免在分片数据库中出现重复值。

示例应用“Goodest Doggo”展示了什么?

“Goodest Doggo”展示了如何使用VSchema和Vindex高效管理数据,确保数据的一致性和可扩展性。

🏷️

标签

➡️

继续阅读