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