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