PlanetScale 核心概念 #
本章将深入介绍 PlanetScale 的核心概念,帮助你全面理解这个无服务器 MySQL 平台的工作原理。
架构概览 #
PlanetScale 技术架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ PlanetScale 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 应用层 │ │
│ │ Node.js / Python / Go / Java / ... │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ PlanetScale 连接层 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Proxy │ │ Router │ │ Topology │ │ │
│ │ │ 代理层 │ │ 路由层 │ │ 拓扑管理 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Vitess 层 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ VTGate │ │ VTTablet │ │ VTOrc │ │ │
│ │ │ 查询网关 │ │ 数据代理 │ │ 编排器 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MySQL 层 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Primary │ │ Replica │ │ Replica │ │ │
│ │ │ 主节点 │ │ 副本1 │ │ 副本2 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Vitess 组件说明 #
| 组件 | 说明 |
|---|---|
| VTGate | 查询网关,接收 SQL 请求,路由到正确的分片 |
| VTTablet | 数据代理,管理 MySQL 实例,处理查询 |
| VTOrc | 编排器,管理集群拓扑,处理故障转移 |
| VSchema | 虚拟 Schema,定义分片规则 |
组织与数据库 #
组织(Organization) #
text
┌─────────────────────────────────────────────────────────────┐
│ 组织结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Organization(组织) │
│ ├── 名称:唯一标识 │
│ ├── 成员:团队成员管理 │
│ ├── 数据库:属于组织的数据库 │
│ └── 设置:组织级配置 │
│ │
│ 示例: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Organization: my-company │ │
│ │ ├── Members: │ │
│ │ │ ├── alice@company.com (Admin) │ │
│ │ │ ├── bob@company.com (Developer) │ │
│ │ │ └── charlie@company.com (Viewer) │ │
│ │ ├── Databases: │ │
│ │ │ ├── production-db │ │
│ │ │ ├── staging-db │ │
│ │ │ └── analytics-db │ │
│ │ └── Plan: Business │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
数据库(Database) #
text
┌─────────────────────────────────────────────────────────────┐
│ 数据库属性 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Database(数据库) │
│ ├── 名称:唯一标识(小写字母、数字、连字符) │
│ ├── 区域:部署的数据中心 │
│ ├── 集群大小:Hobby / Scaler / Business │
│ ├── 分支:数据库分支列表 │
│ └── 状态:creating / ready / error │
│ │
│ 命名规范: │
│ ✅ my-database │
│ ✅ production-db-1 │
│ ✅ user-service │
│ ❌ MyDatabase(大写) │
│ ❌ my_database(下划线) │
│ ❌ my-database-(结尾连字符) │
│ │
└─────────────────────────────────────────────────────────────┘
数据库分支 #
分支类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 生产分支(Production Branch) │
│ - 通常是 main 分支 │
│ - 包含真实生产数据 │
│ - 受保护,不能直接修改 Schema │
│ - 可以创建密码用于应用连接 │
│ │
│ 2. 开发分支(Development Branch) │
│ - 从生产分支创建 │
│ - Schema 可以自由修改 │
│ - 可以包含测试数据 │
│ - 变更通过 Deploy Request 合并 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ main (生产) │ │
│ │ ├── 真实数据 │ │
│ │ ├── 受保护 │ │
│ │ └── 应用连接 │ │
│ │ │ │
│ │ develop (开发) │ │
│ │ ├── 测试数据 │ │
│ │ ├── Schema 变更 │ │
│ │ └── 开发测试 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
分支操作流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支工作流 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 创建开发分支 │
│ ┌─────────────┐ │
│ │ main │ │
│ └──────┬──────┘ │
│ │ │
│ │ pscale branch create db feature-x │
│ ▼ │
│ ┌─────────────┐ │
│ │ feature-x │ │
│ └─────────────┘ │
│ │
│ 2. 在开发分支修改 Schema │
│ ALTER TABLE users ADD COLUMN phone VARCHAR(20); │
│ │
│ 3. 创建 Deploy Request │
│ pscale deploy-request create db feature-x │
│ │
│ 4. 审核并部署 │
│ pscale deploy-request deploy db 1 │
│ │
│ 5. 变更应用到生产 │
│ ┌─────────────┐ │
│ │ main │ ← 包含新 Schema │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
分支数据 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支数据说明 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 开发分支的数据: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Schema(结构) │ │
│ │ ├── 可以修改 │ │
│ │ ├── 通过 Deploy Request 合并 │ │
│ │ └── 支持 Schema 对比 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Data(数据) │ │
│ │ ├── 不从生产复制 │ │
│ │ ├── 需要手动添加测试数据 │ │
│ │ └── 或使用数据导入功能 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 注意:开发分支不会自动同步生产数据 │
│ │
└─────────────────────────────────────────────────────────────┘
Schema 变更 #
非阻塞 DDL #
text
┌─────────────────────────────────────────────────────────────┐
│ 传统 DDL 问题 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统 MySQL DDL: │
│ │
│ ALTER TABLE large_table ADD COLUMN new_col INT; │
│ │
│ 问题: │
│ ├── 表锁定,阻塞读写 │
│ ├── 大表可能需要数小时 │
│ ├── 影响生产服务 │
│ └── 需要维护窗口 │
│ │
│ PlanetScale 解决方案: │
│ │
│ 1. 在开发分支执行 DDL │
│ 2. 创建 Deploy Request │
│ 3. 后台在线执行变更 │
│ 4. 无锁、无阻塞 │
│ │
└─────────────────────────────────────────────────────────────┘
在线 Schema 变更原理 #
text
┌─────────────────────────────────────────────────────────────┐
│ VReplication 工作原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 步骤 1:创建新表结构 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 原表 │ │ 新表 │ │
│ │ (a, b) │ │ (a, b, c) │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 步骤 2:复制数据 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 原表 │────>│ 新表 │ │
│ │ 数据复制 │ │ 数据写入 │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 步骤 3:同步增量 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 原表 │────>│ 新表 │ │
│ │ 持续同步 │ │ 保持同步 │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 步骤 4:原子切换 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 原表 │ │ 新表 │ ← 成为新主表 │
│ │ (rename) │ │ (active) │ │
│ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
连接与认证 #
连接方式 #
text
┌─────────────────────────────────────────────────────────────┐
│ 连接方式对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 连接字符串(推荐用于生产) │
│ mysql://user:pass@host/db?sslaccept=strict │
│ ├── 适合应用连接 │
│ ├── 需要创建密码 │
│ └── 支持 SSL 加密 │
│ │
│ 2. CLI Shell │
│ pscale shell db branch │
│ ├── 适合开发调试 │
│ ├── 无需密码 │
│ └── 需要登录认证 │
│ │
│ 3. 代理连接 │
│ pscale connect db branch │
│ ├── 本地开发使用 │
│ ├── 创建本地代理 │
│ └── localhost:3306 │
│ │
└─────────────────────────────────────────────────────────────┘
密码管理 #
text
┌─────────────────────────────────────────────────────────────┐
│ 密码管理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 创建密码: │
│ pscale password create my-db main my-app-password │
│ │
│ 密码属性: │
│ ├── 名称:标识用途 │
│ ├── 角色:reader / writer / admin │
│ ├── 过期时间:可设置 │
│ └── 可撤销:随时删除 │
│ │
│ 角色权限: │
│ ┌─────────────┬───────────────────────────────────────┐ │
│ │ 角色 │ 权限 │ │
│ ├─────────────┼───────────────────────────────────────┤ │
│ │ reader │ SELECT │ │
│ │ writer │ SELECT, INSERT, UPDATE, DELETE │ │
│ │ admin │ ALL PRIVILEGES │ │
│ └─────────────┴───────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
区域与高可用 #
区域概念 #
text
┌─────────────────────────────────────────────────────────────┐
│ 区域分布 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 全球区域 │ │
│ │ │ │
│ │ ┌─────────┐ │ │
│ │ │ us-east │ │ │
│ │ └─────────┘ │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │us-west │ │eu-west │ │ │
│ │ └─────────┘ └─────────┘ │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ap-south │ │ap-north │ │ │
│ │ └─────────┘ └─────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 选择原则: │
│ - 选择离用户最近的区域 │
│ - 区域一旦选定无法更改 │
│ - 多区域部署需要付费计划 │
│ │
└─────────────────────────────────────────────────────────────┘
高可用架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ 高可用保证 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 主从复制: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────────┐ │ │
│ │ │ Primary │ ← 写入 │ │
│ │ │ (主节点) │ │ │
│ │ └──────┬──────┘ │ │
│ │ │ 复制 │ │
│ │ ├──────────────┐ │ │
│ │ ▼ ▼ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Replica │ │ Replica │ ← 读取 │ │
│ │ │ (副本1) │ │ (副本2) │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 自动故障转移: │
│ - 主节点故障时自动切换 │
│ - 副本提升为新主节点 │
│ - 99.95% SLA 可用性 │
│ │
└─────────────────────────────────────────────────────────────┘
分片(Sharding) #
分片概念 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分片原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 单表数据量过大时,PlanetScale 支持分片: │
│ │
│ 未分片: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ users 表 │ │
│ │ 1亿条数据 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 分片后: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Shard 1 │ │ Shard 2 │ │ Shard 3 │ │
│ │ users │ │ users │ │ users │ │
│ │ id: 1-33M │ │ id: 33-66M │ │ id: 66-100M│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 分片键(Sharding Key): │
│ - 用于决定数据存储在哪个分片 │
│ - 通常选择高基数字段(如 user_id) │
│ - 查询时带上分片键效率最高 │
│ │
└─────────────────────────────────────────────────────────────┘
分片策略 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分片策略选择 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 不分片(默认) │
│ - 适合大多数应用 │
│ - 数据量 < 100GB │
│ - 简单易用 │
│ │
│ 2. 水平分片 │
│ - 按分片键分布数据 │
│ - 适合超大规模数据 │
│ - 需要设计分片键 │
│ │
│ 分片决策: │
│ ├── 数据量 < 100GB → 不分片 │
│ ├── 数据量 100GB-1TB → 考虑分片 │
│ └── 数据量 > 1TB → 建议分片 │
│ │
└─────────────────────────────────────────────────────────────┘
限制与约束 #
功能限制 #
text
┌─────────────────────────────────────────────────────────────┐
│ 不支持的功能 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ❌ 外键约束 │
│ 原因:影响分片和性能 │
│ 替代:应用层处理关系 │
│ │
│ ❌ 存储过程 │
│ 原因:难以扩展和维护 │
│ 替代:应用代码实现逻辑 │
│ │
│ ❌ 触发器 │
│ 原因:影响性能和可预测性 │
│ 替代:应用事件系统 │
│ │
│ ❌ SAVEPOINT │
│ 原因:分布式事务限制 │
│ │
│ ❌ XA 事务 │
│ 原因:跨分片事务复杂 │
│ │
└─────────────────────────────────────────────────────────────┘
大小限制 #
text
┌─────────────────────────────────────────────────────────────┐
│ 容量限制 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 免费套餐: │
│ ├── 存储:5 GB │
│ ├── 读取:10 亿行/月 │
│ ├── 写入:1000 万行/月 │
│ └── 分支:2 个 │
│ │
│ 付费套餐: │
│ ├── 存储:按需扩展 │
│ ├── 读取/写入:按需扩展 │
│ └── 分支:无限 │
│ │
│ 单表限制: │
│ ├── 行数:无限制(可分片) │
│ ├── 单行大小:约 64KB │
│ └── 列数:建议 < 100 │
│ │
└─────────────────────────────────────────────────────────────┘
下一步 #
现在你已经理解了 PlanetScale 的核心概念,接下来学习 数据库管理,掌握数据库的创建、配置和管理操作!
最后更新:2026-03-29