托管一个高性能、可靠且可扩展的数据库并非易事。PlanetScale致力于提供一个简洁易用的界面,但在后台为实现这种简洁,运用了大量复杂的技术。在这篇文章中,我们将探索PlanetScale数据库的构成以及我们如何利用这些组件。

从Vitess和Kubernetes开始

在深入了解PlanetScale数据库的底层之前,我们首先需要了解几个概念。具体来说,我们会讨论Vitess是什么、Kubernetes是什么以及它们如何为PlanetScale上的数据库做出贡献。

什么是Vitess?

Vitess是一个具有横向扩展能力的、与MySQL兼容的数据库平台,最初是为了解决YouTube的可扩展性问题而设计的。简单来说,Vitess允许你跨多个服务器运行多个MySQL实例,并让它们在应用程序中看起来像一个单一的MySQL实例。除了扩展性,Vitess还提供了许多其他优势:

  • Vitess可以自动重写并优化可能影响数据库性能的查询。
  • 每个Vitess集群都配备一个负载均衡器,可以处理数百万个同时连接。
  • 内置缓存机制处理同时发送的重复查询,不必多次访问数据库,而是给每个客户端返回相同的数据集。

在本文的后续部分,我们将更深入地探讨PlanetScale如何使用Vitess,以及构建在Vitess之上的其他功能如何增强用户体验。不过,本节最重要的是:
PlanetScale的每个数据库和分支都是一个独立的集群。

PlanetScale使用的Vitess组件

在每个由PlanetScale托管的Vitess集群中,有几个主要组件:

  • 集群内每个MySQL实例称为“Tablet”,它是运行了一个mysqld实例和一个称为vttablet的辅助进程的单元。这就是数据存储的地方,每个集群至少有一个Tablet。
  • vtgate负责接受查询并将其路由到适当的Tablet,还可将查询拆分并派发到多个Tablet。
  • 整个集群由一个vtctld实例控制,这是管理界面,供PlanetScale内部系统使用以执行管理操作。

Vitess和Kubernetes

容器提供了一种以易于分发的格式托管应用程序和系统的方法,无论它们运行于何种主机系统。Kubernetes是一种编排工具,它允许基础设施工程师定义运行这些应用程序和保持在线所需的容器和资源。当处于集群中时,Kubernetes会尝试自动分配应用程序的负载到多个主机,并在故障发生时自动启动新的资源以替换离线的资源。Kubernetes中的个体资源称为Pod,Pod是集群内运行的一个或多个容器的集合。
上述Vitess组件均可运行于Kubernetes环境中,结合了弹性基础设施的优势与Vitess的横向扩展能力,从而为每个PlanetScale数据库提供支持。

PlanetScale如何使用Vitess

PlanetScale在内部使用Kubernetes来启动托管Vitess集群所需的资源。PlanetScale中的每个数据库都会获得它自己的Vitess集群,其中包含保持该数据库在线和抗故障所需的整个基础设施。当你创建一个数据库时,我们会通知我们自己的Kubernetes环境需要创建一个新的Vitess集群。一旦你的数据库创建完成,它至少会包含以下组件:

  • 一个用于存储数据和服务查询的vttablet Pod。
  • 一个用于管理Vitess集群的vtctld Pod。
  • 一个或多个用于代理流量到vttablet Pod的vtgate Pod,以及必要时的负载均衡。

Vitess与数据库分支

如果每个PlanetScale数据库在创建时都使用了上述技术,那么你可能会问:“PlanetScale如何处理数据库分支?”有趣的是:PlanetScale中的每个分支实际上就是一个独立的数据库,这意味着它也会获得一个专属的Vitess集群。它与本文前面介绍的数据库集群完全一致,唯一的主要区别在于,当你创建一个分支时,我们会为它启动一个新的Vitess集群,(通过vtctld组件)将源数据库分支的架构应用到你刚创建的分支上。

高级边缘连接与路由

MySQL协议的设计远早于云计算的时代。通常,MySQL服务器与连接到它的应用程序在同一个网络中,而不是通过公共互联网连接。如果连接质量下降,数据库连接可能会被中断,导致应用程序宕机或数据丢失。当通过广泛的地理距离连接你的数据库时,这个问题可能会更加突出。
为了解决这个问题,PlanetScale提供了一个跨支持的云提供商和世界各地区域的边缘路由基础设施。当应用程序连接到PlanetScale中的数据库时,会在离应用程序最近的节点建立连接,然后通过全球网络把连接代理到数据库所在的主区域,以访问实际存储的数据。
由于TLS明文终止点更接近用户代码且在我们的内部网络中路由流量,数据库连接的质量得以提升,从而实现更低的延迟和更快的数据访问。

强化你的数据库

至此,你已经拥有一个功能强大、高可用的数据库。但我们不会止步于此。下面是我们为你的数据库增加的一些额外功能:

在线架构变更基础设施

对数据库进行架构更改可能令人紧张,因为某些更改可能导致表锁定,从而使应用程序陷入等待,直到更改完成。在线架构变更工具用于通过各种方法执行架构更改,避免表锁定。然而,这些工具需要一定的专业知识才能正确管理。
PlanetScale将此功能直接集成,利用Vitess的强大能力来调度和执行在线架构更改,并清理迁移过程中不再使用的旧表。这种方法支持数据库分支和部署请求的概念。

数据库分支与部署请求

使用PlanetScale数据库时,你可以通过数据库分支来应用和测试架构更改,而不会影响生产数据库。当你希望合并两个分支之间的更改时,可以创建一个部署请求来检查更改并将其应用到上游分支。部署请求还具有其他优势,比如系统能够检测表的更改是否会破坏底层数据,从而避免意外的数据丢失。此外,还会运行一系列检查,确保更改与整体系统兼容,并不会对目标数据库分支造成任何问题。

架构回退

当部署请求被合并时,我们采用一种称为“影子表”(shadow table)的概念,这是一种隐藏表,用于存储原始表的更新后的架构。同步过程中,数据会被同步到影子表和现有表之间。当部署请求被应用后,我们会交换两张表的任务角色,使影子表成为活动表,原始表变为影子表。这样,如果修改后的架构对应用造成问题,你可以随时回退至旧的架构。

自动化、验证备份

所有PlanetScale数据库都预配置了加密自动备份,并可以根据需要配置额外备份时间表。每次备份时,会先恢复上一版本备份到单独的MySQL实例,然后将更改的数据复制过来,以确保备份有效,防止数据丢失。

主节点与副本

每个PlanetScale数据库的生产分支都有至少一个副本。这些副本存储在不同可用区以保障高可用,并在灾难发生时快速自动切换。

内置监控与洞察工具

PlanetScale还搭载了一系列性能监控工具及查询优化机制,包括时间序列数据图表、异常日志、聚合统计等。

安全与访问控制

除了支持常规MySQL连接字符串,PlanetScale还提供细粒度权限控制、单点登录、服务令牌支持以及GitHub Secrets Scanning合作伙伴功能,确保用户数据的安全。

MySQL版本自动更新

我们还能自动更新至最新版本的MySQL,并确保更新能成功应用以及必要时轻松回滚。

总结

我们简化了在PlanetScale上创建数据库的流程,但如你所见,无论是在创建数据库还是在构建常用工具时,其背后都包含了大量的复杂技术,以确保数据库能够顺利运行。



什么构成了PlanetScale Vitess数据库?插图

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

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

本文链接:http://folen.top/2025/09/13/planetscale-vitess-database/