Spanner数据复制 #

一、复制概述 #

1.1 复制架构 #

text
Spanner复制架构
├── 同步复制
│   ├── 多数副本确认
│   ├── 强一致性
│   └── 自动故障转移
│
├── 多区域复制
│   ├── 跨区域数据同步
│   ├── 全球低延迟读取
│   └── 灾难恢复
│
└── 副本类型
    ├── 读写副本
    ├── 只读副本
    └── 见证副本

1.2 复制优势 #

text
数据复制优势:
├── 高可用性: 99.999% SLA
├── 数据安全: 多副本存储
├── 低延迟: 就近读取
├── 灾难恢复: 跨区域备份
└── 负载均衡: 读请求分散

二、副本类型 #

2.1 读写副本 #

text
读写副本特点:
├── 参与Paxos投票
├── 可成为Leader
├── 支持读写操作
├── 默认副本类型
└── 通常每个区域2个

2.2 只读副本 #

text
只读副本特点:
├── 不参与Paxos投票
├── 只同步数据
├── 只支持读取
├── 扩展读能力
└── 降低成本

2.3 见证副本 #

text
见证副本特点:
├── 参与Paxos投票
├── 不存储完整数据
├── 成本较低
├── 用于达成多数
└── 适合多区域配置

三、区域配置 #

3.1 单区域配置 #

bash
# 创建区域实例
gcloud spanner instances create my-instance \
    --config=regional-us-central1 \
    --description="Regional Instance" \
    --nodes=1
text
区域配置特点:
├── 数据存储在单个区域
├── 通常3个副本
├── 读写延迟低
├── 成本相对较低
└── 适用单区域应用

3.2 多区域配置 #

bash
# 创建多区域实例
gcloud spanner instances create my-global-instance \
    --config=nam-eur-asia1 \
    --description="Global Instance" \
    --nodes=3
text
多区域配置特点:
├── 数据跨区域复制
├── 全球低延迟读取
├── 更高可用性
├── 成本较高
└── 适用全球应用

3.3 可用配置 #

text
常用配置:
├── regional-us-central1: 美国中部
├── regional-europe-west1: 欧洲西部
├── regional-asia-east1: 亚洲东部
├── nam3: 美国东部+美国中部
├── nam-eur-asia1: 北美+欧洲+亚洲
└── 更多配置参考GCP文档

四、读写路由 #

4.1 写入路由 #

text
写入路由规则:
├── 所有写入发送到Leader
├── Leader在主区域
├── 多数副本确认后返回
└── 保证强一致性

4.2 读取路由 #

java
// 强读: 从Leader读取
try (ResultSet rs = client.singleUse()
    .executeQuery(Statement.of("SELECT * FROM users"))) {
    // 处理结果
}

// 过期读: 从最近副本读取
try (ResultSet rs = client.singleUse(
        TimestampBound.ofMaxStaleness(10, TimeUnit.SECONDS))
    .executeQuery(Statement.of("SELECT * FROM users"))) {
    // 处理结果
}

4.3 读选项 #

java
import com.google.cloud.spanner.TimestampBound;

// 强读(默认)
TimestampBound.strong()

// 过期读(最大过期时间)
TimestampBound.ofMaxStaleness(10, TimeUnit.SECONDS)

// 过期读(精确过期时间)
TimestampBound.ofExactStaleness(10, TimeUnit.SECONDS)

// 时间戳读
TimestampBound.ofReadTimestamp(timestamp)

// 最新读(可能等待)
TimestampBound.ofMinReadTimestamp(timestamp)

五、高可用配置 #

5.1 区域高可用 #

text
区域配置高可用:
├── 3个副本在同一区域
├── 任意1个副本故障不影响
├── 自动故障转移
├── 99.99%可用性
└── RPO=0, RTO<1分钟

5.2 多区域高可用 #

text
多区域配置高可用:
├── 副本分布在不同区域
├── 整个区域故障不影响
├── 自动故障转移
├── 99.999%可用性
└── RPO=0, RTO<1分钟

5.3 故障转移 #

text
故障转移流程:
1. 检测Leader故障
2. Paxos选举新Leader
3. 新Leader开始服务
4. 客户端自动重连
5. 整个过程<1分钟

六、多区域部署 #

6.1 部署架构 #

text
多区域部署示例(nam-eur-asia1):
┌─────────────────────────────────────────────────────────────┐
│                     Spanner Instance                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  North America │  │   Europe    │  │    Asia     │         │
│  │  (Primary)     │  │ (Secondary) │  │ (Secondary) │         │
│  │  读写副本      │  │  读写副本   │  │  只读副本   │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

写入: 发送到北美Leader
读取: 从最近区域读取

6.2 配置选择 #

text
配置选择建议:
├── 单区域用户: 区域配置
├── 多区域用户: 多区域配置
├── 全球用户: nam-eur-asia1
├── 灾备需求: 跨洲配置
└── 成本敏感: 区域配置

6.3 延迟优化 #

java
// 使用过期读降低延迟
try (ResultSet rs = client.singleUse(
        TimestampBound.ofMaxStaleness(1, TimeUnit.SECONDS))
    .executeQuery(Statement.of("SELECT * FROM products"))) {
    // 从最近副本读取,最多1秒过期
}

// 使用只读事务
try (ReadOnlyTransaction transaction = client.readOnlyTransaction(
        TimestampBound.ofMaxStaleness(5, TimeUnit.SECONDS))) {
    // 一致性快照读取
}

七、复制监控 #

7.1 关键指标 #

text
复制监控指标:
├── replication_lag: 复制延迟
├── leader: 当前Leader位置
├── replica_count: 副本数量
├── availability: 可用性
└── latency: 读写延迟

7.2 Cloud Monitoring #

bash
# 创建告警策略
gcloud alpha monitoring policies create \
    --display-name="Spanner Replication Lag" \
    --condition-display-name="Replication Lag > 10s" \
    --condition-filter='resource.type="spanner_instance" AND metric.type="spanner.googleapis.com/replication/replication_lag"' \
    --condition-threshold-value=10 \
    --condition-threshold-duration=300s

7.3 查看复制状态 #

sql
-- 查看实例信息
SELECT * FROM INFORMATION_SCHEMA.INSTANCES;

-- 查看副本信息(需要特定权限)
-- 通过GCP控制台查看更直观

八、灾难恢复 #

8.1 灾难恢复策略 #

text
灾难恢复策略:
├── 多区域部署
│   └── 自动故障转移
│
├── 备份恢复
│   └── 定期备份
│
├── 跨区域备份
│   └── 备份复制到其他区域
│
└── 时间点恢复
    └── 恢复到任意时间点

8.2 备份配置 #

bash
# 创建备份
gcloud spanner backups create my-backup \
    --instance=my-instance \
    --database=my-database \
    --retention-period=7d

# 查看备份
gcloud spanner backups list --instance=my-instance

# 从备份恢复
gcloud spanner databases restore my-restored-db \
    --instance=my-instance \
    --source-backup=my-backup

8.3 恢复流程 #

text
灾难恢复流程:
1. 检测故障
2. 评估影响范围
3. 选择恢复策略
   ├── 自动故障转移(多区域)
   ├── 从备份恢复
   └── 时间点恢复
4. 验证数据完整性
5. 切换应用
6. 监控运行状态

九、复制最佳实践 #

9.1 配置建议 #

text
配置建议:
├── 根据用户分布选择配置
├── 考虑成本和性能平衡
├── 预留足够的节点
├── 配置监控告警
└── 定期测试故障转移

9.2 读取优化 #

text
读取优化建议:
├── 使用过期读降低延迟
├── 选择合适的过期时间
├── 使用只读事务
├── 利用缓存
└── 监控读取延迟

9.3 写入优化 #

text
写入优化建议:
├── 批量写入减少延迟
├── 避免热点主键
├── 合理设计Schema
├── 使用交错表
└── 监控写入延迟

十、总结 #

复制配置对比:

配置 可用性 延迟 成本
区域配置 99.99%
多区域配置 99.999%

最佳实践:

text
1. 选择合适的配置
   └── 根据业务需求

2. 使用过期读
   └── 降低读取延迟

3. 配置监控告警
   └── 及时发现问题

4. 定期测试恢复
   └── 确保灾难恢复能力

5. 监控复制延迟
   └── 保证数据一致性

下一步,让我们学习数据分区!

最后更新:2026-03-27