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