ARTICLE · 软件编程
Cloudflare 将 D1 控制平面扩展至数百万个数据库
一语总结Cloudflare 重新设计了 D1 控制平面架构,通过使用 Postgres 存储事务元数据、ClickHouse 进行分析、Workers KV 提供路由,并结合分布式缓存和心跳协调机制,将规模扩展至数百万个数据库,同时避免集中式瓶颈。
Cloudflare 重新设计了 D1 无服务器 SQL 数据库的控制平面,通过将边缘的查询处理与集中的管理操作分离,支持数百万个数据库。该架构使用 Postgres 作为事务元数据的唯一事实来源,使用 ClickHouse 进行分析,并使用 Workers KV 存储全球复制的路由数据。系统每 30 秒通过带有逐数据库随机抖动的心跳机制,将每个 D1 Durable Object 与 Postgres 进行协调,从而能够自动修正创建或删除操作失败的问题。边缘 API Workers 负责身份验证和速率限制,Eyeball Workers 则将查询直接路由至 Durable Objects。异步用量更新和预聚合的账户总量可避免写入激增冲击 Postgres,而 Hyperdrive 缓存则能在清除缓存时防止亚稳态故障。系统通过分布式元数据缓存、连接池和最终一致性实现可扩展性。
- D1 控制平面采用多层架构:Postgres 存储事务元数据,ClickHouse 负责分析,Workers KV 提供全球复制的路由数据。
这种职责分离让查询处理能够继续在边缘运行,同时集中式管理操作可独立扩展,从而避免数据平面出现瓶颈。
- 系统每 30 秒通过带有逐数据库随机抖动的心跳机制,将每个 D1 Durable Object 与 Postgres 进行协调,从而能够自动修正操作失败的问题。
如果对象成为孤立对象,系统会自动将其标记为已删除;如果更新失败,路由元数据也会得到修复,因此无需人工干预即可实现最终一致性。
- 边缘 API Workers 负责身份验证、授权和速率限制,Eyeball Workers 则使用 D1 Bindings 将查询直接路由至 Durable Objects。
这种设计避免在查询路径中重复进行授权检查,并将 Postgres 排除在数据平面之外,从而降低延迟并提升可扩展性。
- 异步用量更新和预聚合的账户总量可在高流量场景下保护 Postgres,避免写入激增。
通过批量写入并持续维护增量存储变化,该系统能够避免拥有数百万个数据库的账户发生写入争用。
Cloudflare 将 D1 控制平面扩展至数百万个数据库
Cloudflare 重新设计了 D1 无服务器 SQL 数据库的控制平面,通过将边缘的查询处理与集中的管理操作分离,支持数百万个数据库。该架构使用 Postgres 作为事务元数据的唯一事实来源,使用 ClickHouse 进行分析,并使用 Workers KV 存储全球复制的路由数据。系统每 30 秒通过带有逐数据库随机抖动的心跳机制,将每个 D1 Durable Object 与 Postgres 进行协调,从而能够自动修正创建或删除操作失败的问题。边缘 API Workers 负责身份验证和速率限制,Eyeball Workers 则将查询直接路由至 Durable Objects。异步用量更新和预聚合的账户总量可避免写入激增冲击 Postgres,而 Hyperdrive 缓存则能在清除缓存时防止亚稳态故障。系统通过分布式元数据缓存、连接池和最终一致性实现可扩展性。
文章金句
"心跳机制可以容忍数据略有过时,因此可以通过 Hyperdrive 的多层缓存或 Postgres 只读副本来提供数据。该心跳流程使 Durable Object 能够自我修正,确保数据库的创建和删除状态与事实来源 Postgres 保持一致。
"你可能也会好奇,既然已经有 Hyperdrive Caching,为什么还要使用 Workers KV。Workers KV 是持久化数据存储,而不只是缓存:如果某个条目从 KV 的边缘缓存中淘汰,读取请求会由 KV 自身的存储提供,而不是由 Postgres 提供,从而使 Postgres 不进入数据平面。
"如果发生灾难性的缓存清除,一百万个数据库同时尝试获取路由信息,就会导致亚稳态故障。