Google Spanner简介 #
一、什么是Spanner #
Google Spanner是Google开发的全球分布式数据库系统,是第一个将数据分布在全球范围内、同时支持外部一致事务的数据库。它将关系型数据库的结构化数据和NoSQL系统的可扩展性完美结合。
1.1 发展历史 #
text
2012年 - Spanner论文发表
├── OSDI会议发表Spanner论文
├── 揭示TrueTime技术
└── 外部一致性实现
2017年 - Cloud Spanner正式发布
├── Google Cloud Platform托管服务
├── 面向企业用户
└── 99.999%可用性SLA
2020年 - PostgreSQL接口支持
├── 兼容PostgreSQL方言
├── 降低迁移成本
└── 扩大用户群体
2024年 - 持续创新
├── 变更流(Change Streams)
├── 图数据库功能
└── AI集成能力
1.2 核心定位 #
| 特性 | 说明 |
|---|---|
| 全球分布式 | 数据可跨区域分布,就近访问 |
| 强一致性 | TrueTime保证外部一致性 |
| 水平扩展 | 自动分片,线性扩展 |
| SQL支持 | 标准SQL查询语言 |
| 高可用 | 多副本同步复制 |
二、核心特点 #
2.1 TrueTime API #
TrueTime是Spanner的核心创新,提供了全局统一的时间戳服务。
text
TrueTime返回时间区间 [earliest, latest]
├── 真实时间一定在区间内
├── 区间大小取决于时钟同步精度
└── 通常在1-10毫秒之间
应用场景
├── 外部一致性事务
├── 快照隔离
├── 时间戳排序
└── 跨区域同步
2.2 外部一致性 #
Spanner保证的外部一致性是分布式系统中最强的一致性级别:
text
事务T1在事务T2之前提交
↓
T1的提交时间戳 < T2的提交时间戳
↓
所有观察者看到相同的事务顺序
2.3 数据分布 #
text
实例(Instance)
├── 计算资源配置
├── 节点数量
└── 区域配置
数据库(Database)
├── Schema定义
├── 数据存储
└── 表和索引
分片(Split)
├── 数据按主键范围分片
├── 自动负载均衡
└── 跨节点分布
2.4 复制机制 #
| 复制类型 | 说明 | 使用场景 |
|---|---|---|
| 同步复制 | 写入需多数副本确认 | 强一致性要求 |
| 多区域复制 | 跨区域数据复制 | 全球应用 |
| 自动故障转移 | 主节点故障自动切换 | 高可用 |
三、应用场景 #
3.1 金融交易系统 #
text
需求
├── 强一致性
├── 高可用性
├── 全球部署
└── 合规要求
Spanner优势
├── ACID事务保证
├── 99.999%可用性
├── 跨区域部署
└── 时间戳审计
3.2 游戏后端 #
text
需求
├── 低延迟
├── 高并发
├── 全球玩家
└── 实时更新
Spanner优势
├── 就近区域访问
├── 自动扩展
├── 强一致性
└── 灵活Schema
3.3 电商系统 #
text
需求
├── 库存一致性
├── 订单处理
├── 用户数据
└── 分析报表
Spanner优势
├── 分布式事务
├── 交错表优化
├── 二级索引
└── 变更流集成
3.4 物联网平台 #
text
需求
├── 海量数据写入
├── 时序数据
├── 实时查询
└── 全球设备
Spanner优势
├── 高吞吐写入
├── 时间戳索引
├── 分区查询
└── 多区域部署
四、与其他数据库对比 #
4.1 vs MySQL/PostgreSQL #
| 特性 | Spanner | MySQL/PostgreSQL |
|---|---|---|
| 扩展性 | 自动水平扩展 | 垂直扩展为主 |
| 分布式 | 原生分布式 | 需要中间件 |
| 一致性 | 外部一致性 | 强一致性 |
| 全球部署 | 原生支持 | 需要复制方案 |
| 运维 | 全托管 | 自行运维 |
4.2 vs MongoDB #
| 特性 | Spanner | MongoDB |
|---|---|---|
| 数据模型 | 关系型 | 文档型 |
| 一致性 | 强一致性 | 可配置 |
| 事务 | 分布式ACID | 单文档/多文档 |
| SQL | 标准SQL | 聚合管道 |
| Schema | 强类型 | 灵活Schema |
4.3 vs TiDB #
| 特性 | Spanner | TiDB |
|---|---|---|
| 部署方式 | 云托管 | 自托管/云托管 |
| 时间同步 | TrueTime | TSO |
| 一致性 | 外部一致性 | 线性一致性 |
| 成本 | 按使用付费 | 硬件成本 |
| MySQL兼容 | 部分兼容 | 高度兼容 |
五、Spanner实例配置 #
5.1 实例配置类型 #
text
区域配置(Regional)
├── 数据存储在单个区域
├── 读写延迟低
└── 成本相对较低
多区域配置(Multi-region)
├── 数据跨区域复制
├── 全球低延迟读取
└── 更高可用性
5.2 节点数量规划 #
text
节点数量 = max(存储需求/1TB, CPU需求)
示例计算
├── 存储: 5TB数据 → 5个节点
├── CPU: 10000 QPS → 10个节点
└── 最终: max(5, 10) = 10个节点
5.3 计费模型 #
| 资源 | 计费方式 |
|---|---|
| 节点 | 按小时计费 |
| 存储 | 按GB/月计费 |
| 网络 | 出站流量计费 |
| 备份 | 按存储量计费 |
六、Spanner限制 #
6.1 Schema限制 #
text
表限制
├── 单表最大列数: 1024
├── 主键最大列数: 16
├── 单行最大大小: 10GB
└── 单列最大大小: 10GB
索引限制
├── 单表最大索引数: 200
├── 索引键最大大小: 8KB
└── 交错深度最大: 7层
6.2 事务限制 #
text
事务大小
├── 单事务最大行数: 100,000
├── 单事务最大数据: 100MB
├── 事务超时: 10分钟
└── 并发事务: 受节点数限制
6.3 查询限制 #
text
查询限制
├── 单查询返回行数: 无限制(流式)
├── 查询超时: 可配置
├── 并发查询: 受节点数限制
└── JOIN表数: 无明确限制
七、快速体验 #
7.1 创建实例 #
bash
# 使用gcloud CLI创建实例
gcloud spanner instances create my-instance \
--config=regional-us-central1 \
--description="My Spanner Instance" \
--nodes=1
7.2 创建数据库 #
bash
# 创建数据库
gcloud spanner databases create my-database \
--instance=my-instance
7.3 创建表 #
sql
CREATE TABLE users (
user_id INT64 NOT NULL,
name STRING(100) NOT NULL,
email STRING(100),
created_at TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP())
) PRIMARY KEY (user_id);
7.4 插入数据 #
sql
INSERT INTO users (user_id, name, email)
VALUES (1, 'John Doe', 'john@example.com');
7.5 查询数据 #
sql
SELECT * FROM users WHERE user_id = 1;
八、总结 #
Spanner核心优势:
| 优势 | 说明 |
|---|---|
| 全球一致性 | TrueTime保证外部一致性 |
| 无限扩展 | 自动分片,水平扩展 |
| 高可用性 | 99.999%可用性SLA |
| 全托管 | 无需运维,按需付费 |
| SQL支持 | 标准SQL,学习成本低 |
适用场景判断:
text
适合Spanner
├── 需要全球部署
├── 需要强一致性
├── 需要水平扩展
├── 预算充足
└── 希望减少运维
不适合Spanner
├── 单区域小规模应用
├── 最终一致性可接受
├── 预算有限
├── 需要复杂存储过程
└── 特殊硬件需求
下一步,让我们学习如何安装和配置Spanner!
最后更新:2026-03-27