引入全局副本凭证
现在,你可以创建全局副本凭证,从而让读取请求自动路由到距离最近的只读副本,无论你身处全球何地。
所有 PlanetScale 集群都至少包含一个主节点和位于同一区域内的两个副本,这些副本分布在三个可用区中。随着今天功能的发布,现在可以通过创建一个专用于副本使用的单独密码,更轻松地利用这些额外的计算资源。全局副本凭证会自动在区域内副本间进行负载均衡。
新的凭证还能无缝地路由到延迟最低的只读区域,即使你添加或移除新的只读区域,也无需对代码进行任何更改。这项架构基于 PlanetScale 全球网络(PlanetScale Global Network),它允许这一切的发生且无需重新连接数据库。这意味着添加一个新的只读区域后,你可以立即开始使用它。
如果你已经为每个只读区域单独配置了副本凭证,现在可以将它们替换为一个单一的全局副本凭证。
如何使用全局副本凭证
使用全局副本凭证非常简单:只需在 PlanetScale 仪表板中点击“连接”(Connect),选择“副本”(Replica),即可生成新的凭证。你也可以通过 CLI 或 API 来生成凭证。如果你已安装 CLI,想在 MySQL 控制台中尝试副本凭证,运行以下命令即可:
pscale shell --replica
详见副本文档获取更多信息。
PlanetScale 仪表板中创建全局副本凭证的截图
构建 PlanetScale 全球网络
过去几年间,我们一直在悄然构建一种类似 CDN 的数据库连接层,这一层被称为 PlanetScale 全球网络(PlanetScale Global Network)。
这个网络层负责以下任务:
- 终止每个全球的 MySQL 连接;
- 处理 RPC API(例如支持 database-js);
- 实现几乎无限扩展的连接池;
- TLS 终止;
- 将连接路由到你的数据库。
从高层次来看,连接数据库的第一步是连接到我们的边缘网络(Edge Network)。这个步骤类似于 CDN:首跳是离你地理位置最近或离你的应用程序最近的节点。无论你是在隔壁的 AWS 数据中心,还是处于全球另一端,连接都会首先进入我们的边缘网络。
进入我们的网络后,我们会在离你的应用程序最近的最外层完全终止 MySQL 连接和 TLS 握手。在这里进行的连接池类似于在你的数据中心运行 ProxySQL 实例。从最外层开始,连接可以通过隧道复用并回传到你的源数据库,只需要少量长期保持的加密连接,而这些连接已处于预热状态,可以随时使用。
这种架构的直接效果是 TCP 和 TLS 握手变得更快,因为网络延迟降低了,传输路径也更短。通过在离你最近的节点终止连接,握手可以更快完成。通过在 MySQL 连接层完成这种优化,是我们与传统 CDN 或网络加速器的主要区别。类似于 HTTP 代理,MySQL 连接池能够在距离你更近的范围内完成完整的 MySQL 握手,同时减少地理上的交互距离。
什么是凭证?
凭证在 PlanetScale 全球网络中由三个部分组成:凭证(Credential)、路由(Route)和终端节点(Endpoint)。其中:
- 路由是共享给我们边缘网络所有地理区域的,而凭证保留在你唯一的数据库集群区域内;
- 终端节点是你连接到我们的主机名,通常类似于
aws.connect.psdb.cloud
或gcp.connect.psdb.cloud
。
路由和凭证存储在 etcd 中,可以实时监听变更,并对变更或删除进行即时响应。
路由(Route)
在实践中,路由看起来像这样:
message Route { string branch = 1; repeated string cluster = 2; fixed64 expiration = 3; ... }
你会注意到,路由中没有包含身份验证信息,也不是认证的权威来源。它实际上是一个将用户名映射到集群列表的映射关系。这些集群列表表示此数据库分支(branch)运行的区域。
比如对于包含单个主节点的普通凭证,路由可能是:
Route(branch="abc123", cluster=["us-east-1"])
而对于副本凭证(包含多个只读区域),这些集群列表将扩展为所有相关区域的列表,例如:
Route(branch="abc123", cluster=["us-east-1", "us-west-2"])
现在我们拥有一个路由,可以在多个选项中选择最佳路径。
凭证(Credential)
虽然凭证的实现细节很多在内部,我们不会深入讨论,但凭证实际上代表了关于认证的真实来源,只存在于与数据库在同一集群中的区域。它大致格式如下:
enum TabletType { TABLET_TYPE_UNSPECIFIED = 0; TABLET_TYPE_PRIMARY = 1; TABLET_TYPE_REPLICA = 2; TABLET_TYPE_RDONLY = 3; } message Credential { string branch = 1; bytes password_sha256 = 2; psdb.data.v1.Role role = 3; fixed64 expiration = 4; TabletType tablet_type = 5; }
这里包含了关于凭证的更多信息,包括创建时分配的角色/ACL、密码验证所需的信息,以及一个 TabletType
字段,用以指明凭证是针对主节点、副本节点或只读数据库。这些信息完全自动化,仅为内部表示用途。
虽然路由只是用户名到集群列表的映射,但凭证包含了连接到底层数据库所需的全部信息,包括正确的 ACL(访问控制列表)以及目标 TabletType
。
终端节点(Endpoint)
终端节点是连接的起点。在产品中,我们提供了两种不同的主机名选项:“Direct”和“Optimized”:
- “Direct”形式为
{region}.connect.psdb.cloud
,显式表示区域里的边缘节点。你可以选择任何公共区域作为第一跳,通过它路由到正确的目的地。 - “Optimized”形式为
{provider}.connect.psdb.cloud
,依赖于基于延迟的 DNS 解析器,例如 AWS 的 Route53 延迟路由策略。这实现了将aws.connect.psdb.cloud
解析为离你最近的边缘节点的效果,无论你是通过本地机器连接还是位于数据库旁边的数据中心,都会被路由到最近的区域,从而实现类似 CDN 的效果。
综合起来
这些部分结合起来,我们可以构建一个能够根据地理位置路由到任何副本的系统。
起始连接池在边缘网络,与 HTTP 和 MySQL 协议保持一致。在连接建立后,无论你的数据库位于何处,连接都会在我们的网络边缘节点上终止。当新区域添加时,底层路由会进行变更以加入新的集群。
由于我们在所有区域之间保持热连接,并定期测量延迟(类似于网状网络),我们可以实时排序这些集群列表,并根据最低延迟选择“下一跳”。如果某个区域出现故障(比如整个区域停机),我们可以选择排列中的下一个选项。
最终,连接已经在我们网络首次建立,因此路由可以在单次查询基础上动态使用,无需重新连接即可实时路由到延迟最低的下一跳。
当添加或移除只读区域时,我们只需更新路由,并维护一个已排序的列表即可。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2025/09/14/introducing-global-replica-credentials/