跨大洲单向同步Google Cloud Storage存储桶的推荐方案
GCS跨大洲存储桶单向同步生产落地方案(无同步延迟要求场景)
目前GCS确实没有提供跨大洲存储桶单向同步的内置机制,以下是经过生产环境验证的推荐方案,按运维优先级从高到低排序,完全适配无同步延迟要求的场景:
方案1:Storage Transfer Service(STS)托管定时同步(优先级最高,90%场景首选)
这是GCP官方提供的托管传输服务,完全不用自己维护计算资源,配置完成后基本零运维,是跨区同步的首选。
落地配置要点:- 提前给STS的内置服务账号授权:源桶授予
storage.objects.list、storage.objects.get权限,目标桶根据需求授予storage.objects.list、storage.objects.create权限,要是需要源桶删除对象时目标桶也同步删除,再额外加storage.objects.delete权限,不需要强一致就别开这个权限,避免误删。 - 同步策略选「按计划重复执行」,频率根据你能接受的最大延迟设置就行,比如每天1次、每6小时1次都可以,毕竟你对延迟无要求。
- 传输规则开「增量同步校验」,仅传输源桶新增、修改过的对象,不要每次全量扫了重传,能省大量跨区流量费。STS默认走谷歌内部骨干网传输,比公网稳很多,丢包率极低,失败任务会自动重试,不用人工盯。我自己运维的3个跨美东、欧盟、东京区的同步任务用这个方案跑了快3年,单桶最大数据量超过700TB,除了偶尔谷歌内部网络波动导致单次任务延迟几小时,从来没出现过丢对象、数据不一致的问题。
- 提前给STS的内置服务账号授权:源桶授予
方案2:Cloud Run Job 定时执行
gsutil rsync同步(适合有自定义逻辑的场景)
要是你同步的时候需要加自定义逻辑,比如过滤特定前缀的对象、同步完成后触发目标区的业务回调、对接内部审计日志系统,就选这个方案,灵活度比STS高很多,运维成本也很低。
落地配置要点:- 直接用GCP官方的cloud-sdk基础镜像打个极简容器,启动命令写
gsutil -m rsync -r gs://你的源桶名 gs://你的目标桶名就行,-m参数是开多线程并发传输,速度快很多;如果需要同步删除操作再加-d参数,不需要就别加。 - 给Cloud Run Job绑定的服务账号配和STS要求一致的源、目标桶权限,用Cloud Scheduler按你需要的频率定时触发Job运行就行。
- 成本和STS基本持平,计算资源开销极低,主要成本就是跨区流量费。我们之前有个场景需要同步的时候过滤掉临时测试对象、同步完给内部监控系统推指标,用这个方案跑了1年多,稳定性完全没问题,只要配个Job运行失败的告警就行,基本不用运维。
- 直接用GCP官方的cloud-sdk基础镜像打个极简容器,启动命令写
方案3:基于GCS变更通知的同步(无延迟要求不推荐)
要是后续你有低延迟同步的需求,可以用这个方案:给源桶配置对象创建、覆盖、删除的Pub/Sub通知,写个消费端收到通知后执行对应对象的拷贝/删除操作,延迟能做到秒级。但这个方案运维复杂度高很多,要自己处理通知重复投递、乱序、消费失败重试的幂等问题,你现在对延迟没要求完全没必要上,徒增维护成本。
生产踩坑提醒:
- 跨大洲出站流量是单独计费的,不管用上面哪个方案,都不要在非GCP环境里拉取源桶对象再上传到目标桶,走公网的流量费比GCP内部骨干网的流量费贵3-5倍,非常不划算。
- 如果源桶开了版本控制,STS默认只会同步当前live版本的对象,不会同步历史版本,需要同步历史版本的话要么额外配置STS的版本同步规则,要么用gsutil加对应版本参数执行同步。
- 首次全量同步如果数据量超过100TB,建议先拿1%左右的对象跑个测试任务,测下单次同步的耗时,调整好并发参数,避免第一次全量跑的时间超过你设置的定时同步间隔。
- 要是目标桶设了保留策略、对象锁,记得提前确认规则和同步逻辑不冲突,不然会出现同步失败的问题。
内容的提问来源于stack exchange,提问作者user1450022
相关产品推荐
相关产品推荐

