PlanetScale & Vitess:遗留分片数据库的参考完整性

PlanetScale定义

PlanetScale是一个MySQL无服务器平台,它销售Vitess,是一个用于MySQL水平扩展的数据库集群系统

Vitess创建于2010年,用于解决YouTube团队面临的MySQL可伸缩性挑战。

本文将介绍这些非acid遗留分片数据库的结构为什么它们不能支持像引用完整性这样重要的东西,以及为什么我们应该避免在应用程序中使用它们。这篇文章更多的是关于Vitess的技术。

背景

在MySQL中,FOREIGN KEY约束的实现方式会干扰在线DDL操作。详情查看

由于限于单一的MySQL服务器范围,一旦你的数据增长并被划分到多个数据库服务器上,FOREIGN KEY约束是不可能维护的。

那么OREIGN KEY约束会影响可伸缩性吗?如果是的话,是怎么做到的?

现在,如果我们做一些像数据分析之类的事情,显然我们不需要引用完整性,因为我们只是想把我们的数据转储到一个表中,但是PlanetScale和Vitess自夸被像YouTube这样的大型网络应用程序使用。

为什么他们要放弃FOREIGN KEY约束?原因是因为数据库如CockroachDB和Spanner仍然保持参考完整性,并具有可伸缩性。

什么是参照完整性,为什么它很重要?

简单地说,FOREIGN KEY约束是一个数据库键,我们可以使用它通过引用一个列或一组列来在两个不同的表之间创建关系。引用完整性指的是数据库的状态,其中所有键的所有值都有效。

为什么它很重要?


引用完整性很重要,因为它可以防止将新的错误引入数据库。这是关系数据库经常提供的一种功能,防止用户或应用程序向数据库输入不一致的数据。这将提高数据质量、加快开发速度、减少bug和应用程序的一致性。

为什么没有Vitess ?

因此,要理解Vitess为什么不能支持引用完整性,必须深入研究数据库的架构。Vitess是一个分片的非ACID SQL数据库,不是一个真正的分布式ACID SQL数据库。
ACID的定义:ACID是原子性、一致性、隔离性和持久性的缩写。

这里,原子性指的是完全完成或失败的操作——事务没有部分完成。一致性是指事务使数据库处于有效状态。隔离仅仅意味着执行两个事务时互不干扰,而持久性意味着保存事务的更改。

在单独的数据库服务器实例上分散负载。所以当我们提到分片的数据库时,我们谈论的是这样的东西。如前所述,Vitess是一个分片的非ACID SQL数据库,这基本上意味着它不保证事务的ACID属性。

为什么放弃?

当有一个具有良好定义的模式的MySQL数据库时,并且您的服务由于数据库读取过多的问题而变得严重。大多数人在这里做的是,他们开始缓存频繁执行的查询,但读取不再是酸性的。

除了读取过多之外,对数据库进行过多的写操作也是许多人可能面临的一个严重问题。

当然,SQL表连接的复杂性增加问题依然存在,所以你开始去正规化以避免表之间的连接。\

但反规范化基本上是将冗余数据添加到数据库中的表的过程,这可以通过磁盘空间成本提高性能,因为在连接时不再使用CPU能力。虽然去正规化提高了读取的速度,但是它确实会使写入变慢。
但是我们的数据库仍然很慢,所以我们将数据库计算转移到客户端,例如生成UUID或分配日期。

即使在所有这些之后,查询仍然会很慢——所以我们将查询最多的数据的结果保持在一个被称为数据库具体化的过程中。现在读可能更快,但写却一天比一天慢。现在唯一符合逻辑的情况是删除二级索引。

在这一点上,我们的数据库: 因为缓存,所以没有ACID属性

  • 没有正常模式
  • 没有触发
  • 没有数据库计算
  • 没有二级索引

这为Vitess和NoSQL数据库铺平了道路,因为公司在扩展数据库方面存在问题。按照设计的方式,当事务跨越多个不同的分片时,他们无法维护数据一致性(ACID属性)。当数据跨越多个分片时,引用完整性就是关于一致性的,因此它们不能很好地支持引用完整性是有道理的。

我们可以深入了解无FOREIGN KEY约束的NoSQL数据库的结构,以及采用该模型将面临的问题,但这是另一篇文章的主题。

不只是Vitess,它已经成为分片数据库避免引用完整性的标准实践,因为没有其他选择。就ACID模型而言,它们的文档声明它们保证原子性而不是隔离性,甚至还说:

保证ACID隔离是非常有争议的,而且成本很高。默认地提供它将使Vitess在大多数常见用例中不切实际。

ACID隔离

让我们简要地谈谈什么是ACID隔离。它有四个级别(根据SQL-92标准),包括可串行性、已提交读、未提交读和可重复读。话虽如此,还有更多级别的隔离,比如快照隔离,它不是SQL标准,但被Firebase或MongoDB等多个数据库使用。如果你对此感兴趣,我推荐你阅读这篇文章。为了简明扼要,不打算详细说明每一级隔离的含义,但如果你想了解更多,请查看MySql文档

ACID隔离指的是数据库事务是ACID的,它们保证操作按照开发人员所期望的方式运行。一些符合acid的分布式数据库具有最高级别的隔离(可序列化事务),同时仍然具有快速的读写速度。但在Vitess的背景下,并没有错,因为跨多个分片的交易无法满足任何级别的隔离。

结论

所有这些,你一定想知道:为什么有人想要使用PlanetScale或Vitess? 对于许多公司和网站来说,原因是他们在没有更好的选择时选择了Vitess。请注意它是如何在2010年创建的。既然我们可以享受到符合acid的具有引用完整性的可伸缩数据库,那么转向这些新数据库将是我们最感兴趣的,技术变化很快,使您的数据库跟上速度是任何应用程序的关键组成部分

更多内容请查看该链接:dev.to/harshhhdev/…