PlanetScale 简介 #
什么是无服务器数据库? #
在了解 PlanetScale 之前,我们需要先理解"无服务器数据库"(Serverless Database)的概念。无服务器数据库是一种云数据库服务模式,用户无需管理服务器基础设施,只需关注数据库本身的使用。
text
┌─────────────────────────────────────────────────────────────┐
│ 传统数据库 vs 无服务器数据库 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统数据库: │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 购买服务器│ ──> │ 安装配置 │ ──> │ 运维管理 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ❌ 需要预估容量 │
│ ❌ 需要运维人员 │
│ ❌ 扩展困难 │
│ ❌ 高可用复杂 │
│ │
│ 无服务器数据库: │
│ ┌─────────┐ ┌─────────┐ │
│ │ 创建数据库│ ──> │ 直接使用 │ │
│ └─────────┘ └─────────┘ │
│ ✅ 自动扩展 │
│ ✅ 无需运维 │
│ ✅ 按需付费 │
│ ✅ 内置高可用 │
│ │
└─────────────────────────────────────────────────────────────┘
什么是 PlanetScale? #
PlanetScale 是一个无服务器 MySQL 数据库平台,专为现代云原生应用设计。它基于 Vitess 构建,提供了数据库分支、非阻塞 Schema 变更、自动扩展等强大功能。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ PlanetScale │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 无服务器 │ │ MySQL 兼容 │ │ 数据库分支 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 零停机迁移 │ │ 自动扩展 │ │ 高可用性 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
PlanetScale 的历史 #
发展历程 #
text
2010年 ─── Vitess 项目启动
│
│ YouTube 内部开发
│ 解决 MySQL 扩展问题
│
2018年 ─── Vitess 开源
│
│ CNCF 孵化项目
│ 社区快速发展
│
2021年 ─── PlanetScale 成立
│
│ Vitess 核心团队创建
│ 提供托管服务
│
2022年 ─── PlanetScale 正式发布
│
│ 数据库分支功能
│ 免费套餐推出
│
至今 ─── 快速发展
│
│ 企业客户增长
│ 功能持续完善
Vitess 的背景 #
Vitess 是 YouTube 开发的 MySQL 数据库集群管理工具,用于解决 YouTube 海量视频数据的存储和查询问题:
| 指标 | 数据 |
|---|---|
| 每日查询量 | 数十亿次 |
| 数据量 | PB 级别 |
| MySQL 实例 | 数千个 |
| 运行时间 | 10+ 年 |
PlanetScale 的核心特点 #
1. 数据库分支 #
PlanetScale 最具创新性的功能是数据库分支,类似于 Git 的代码分支:
text
┌─────────────────────────────────────────────────────────────┐
│ 数据库分支示意 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ main │ │
│ │ (生产分支) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ feature-a │ │ feature-b │ │ hotfix │ │
│ │ (开发分支) │ │ (开发分支) │ │ (修复分支) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 每个分支可以独立进行 Schema 变更 │
│ 变更完成后通过 Deploy Request 合并到 main │
│ │
└─────────────────────────────────────────────────────────────┘
分支的优势:
text
✅ 隔离开发
- 开发分支不影响生产数据
- 可以自由测试 Schema 变更
- 团队成员并行开发
✅ 安全部署
- 变更经过审核
- 自动检测冲突
- 支持回滚
✅ 版本控制
- Schema 变更有历史记录
- 可以追溯每次变更
- 类似 Git 的工作流
2. 非阻塞 Schema 变更 #
传统的 MySQL DDL 操作会锁表,导致服务中断:
text
┌─────────────────────────────────────────────────────────────┐
│ 传统 DDL vs PlanetScale │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统 MySQL DDL: │
│ │
│ ALTER TABLE users ADD COLUMN age INT; │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 表锁定中... ████████████████████████ 阻塞写入 │ │
│ │ 大表可能需要数小时 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ PlanetScale: │
│ │
│ 创建分支 -> 执行 DDL -> Deploy Request -> 自动应用 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 在线变更 ░░░░░░░░░░░░░░░░░░░░░░░░░░░ 不阻塞写入 │ │
│ │ 后台执行,用户无感知 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3. 自动扩展 #
text
┌─────────────────────────────────────────────────────────────┐
│ 自动扩展机制 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 读取扩展: │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ App │────>│ 读取副本1│ │ 读取副本2│ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ │ ┌────┴───────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 主数据库 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 写入扩展: │
│ - 分片(Sharding) │
│ - 自动数据分布 │
│ - 透明路由 │
│ │
└─────────────────────────────────────────────────────────────┘
4. 高可用性 #
text
┌─────────────────────────────────────────────────────────────┐
│ 高可用架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 应用层 │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PlanetScale 代理层 │ │
│ │ (自动故障转移、负载均衡) │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 主节点 │ │ 副本1 │ │ 副本2 │ │
│ │ (Primary) │ │ (Replica) │ │ (Replica) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 主节点故障时自动切换到副本 │
│ 99.95% SLA 可用性保证 │
│ │
└─────────────────────────────────────────────────────────────┘
PlanetScale vs 其他数据库服务 #
对比分析 #
| 特性 | PlanetScale | AWS RDS | Google Cloud SQL | Supabase |
|---|---|---|---|---|
| 数据库分支 | ✅ | ❌ | ❌ | ❌ |
| 非阻塞 DDL | ✅ | ❌ | ❌ | ❌ |
| 自动扩展 | ✅ | 部分 | 部分 | ✅ |
| MySQL 兼容 | ✅ | ✅ | ✅ | ❌ (PostgreSQL) |
| 无服务器 | ✅ | ❌ | ❌ | ✅ |
| 免费套餐 | ✅ | ❌ | ❌ | ✅ |
选择建议 #
text
┌─────────────────────────────────────────────────────────────┐
│ 选择指南 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 选择 PlanetScale 的场景: │
│ ✅ 需要数据库分支功能 │
│ ✅ 频繁进行 Schema 变更 │
│ ✅ 团队协作开发 │
│ ✅ 需要零停机迁移 │
│ ✅ Serverless / JAMstack 应用 │
│ ✅ 与 Vercel/Netlify 集成 │
│ │
│ 选择其他方案的场景: │
│ ✅ 需要存储过程、触发器(PlanetScale 不支持) │
│ ✅ 需要 PostgreSQL 特有功能 │
│ ✅ 已深度绑定 AWS/GCP 生态 │
│ │
└─────────────────────────────────────────────────────────────┘
PlanetScale 的限制 #
不支持的功能 #
text
⚠️ 外键约束
- 为了支持分片,不强制外键
- 需要在应用层处理关系
⚠️ 存储过程和触发器
- 不支持存储过程
- 不支持触发器
- 业务逻辑应在应用层
⚠️ 某些 SQL 特性
- 不支持 SAVEPOINT
- 不支持 XA 事务
- 部分函数受限
解决方案 #
text
┌─────────────────────────────────────────────────────────────┐
│ 替代方案 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 外键约束: │
│ - 在应用层验证数据关系 │
│ - 使用事务保证一致性 │
│ - 使用 ORM 的关联功能 │
│ │
│ 存储过程: │
│ - 将逻辑移到应用代码 │
│ - 使用云函数处理复杂逻辑 │
│ - 更易于测试和维护 │
│ │
│ 触发器: │
│ - 使用应用事件系统 │
│ - 使用消息队列处理异步任务 │
│ - 使用 CDC (变更数据捕获) │
│ │
└─────────────────────────────────────────────────────────────┘
PlanetScale 的应用场景 #
1. JAMstack 应用 #
text
┌─────────────────────────────────────────────────────────────┐
│ JAMstack 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ 前端 │ Next.js / Nuxt.js / Astro │
│ │ (静态) │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ API │ Vercel / Netlify Functions │
│ │ (Serverless)│ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ PlanetScale │ 无服务器 MySQL │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
2. SaaS 应用 #
text
多租户架构:
- 每个租户独立数据
- 自动扩展支持增长
- 分支功能支持定制开发
3. 微服务架构 #
text
服务解耦:
- 每个服务独立数据库
- 数据库分支支持独立开发
- 自动扩展应对流量波动
定价模式 #
免费套餐 #
| 资源 | 免费额度 |
|---|---|
| 数据库 | 1 个 |
| 存储 | 5 GB |
| 行读取 | 10 亿行/月 |
| 行写入 | 1000 万行/月 |
| 分支 | 2 个 |
付费套餐 #
text
Scout Plan: $29/月起
- 更多存储空间
- 更高读写配额
- 多区域支持
- 优先支持
Business Plan: 自定义定价
- 无限数据库
- 企业级 SLA
- 专属支持
- 高级安全功能
学习路径 #
text
入门阶段
├── PlanetScale 简介(本文)
├── 快速开始
└── 核心概念
基础阶段
├── 数据库管理
├── 分支操作
└── Schema 变更
进阶阶段
├── 数据库连接
├── 数据迁移
├── 性能优化
└── 安全配置
下一步 #
现在你已经了解了 PlanetScale 的基本概念,接下来学习 快速开始,创建你的第一个 PlanetScale 数据库!
最后更新:2026-03-29