原文发布于微信公众号:腾讯云存储(关注有惊喜)
前言
上一篇内容我们说到了 COS 是什么“要对象存储做什么,我有女朋友就够了!”的文章。本文将着重介绍如何尽可能的提高腾讯云对象存储 COS 的可用性。
COS 提供了基于 HTTP/HTTPS 的上传接口,对于 UGC 的场景,客户端直传 COS 的用法十分普遍。由于 COS 的存储桶是分布在具体的某个地域,比如某个客户的存储桶位于上海园区,但是其客户遍布全国各地乃至全球海外,偏远地区以及跨国的访问及其不稳定,如何在错综复杂的网络环境下提高客户端上传文件的成功率成为让客户头疼的问题,下面我们将带着这个问题一步步去寻求答案。
一. 客户端断点续传
客户端的上传内容一般分为图片类的小文件以及视频类的大文件,腾讯云对象存储 COS 提供了简单上传以及分块上传这两种接口来上传不同大小的文件。
- 对于小于1MB的图片类小文件,直接使用简单上传接口即可。
- 对于大于1MB的视频类大文件,使用分块上传接口把大文件切分为多个小的分块来上传(每个分块大小为1MB - 5GB,最后一个分块可以小于1MB)。
我们知道,在网络传输中分块越小,那么传输成功率越高,也方便对小的分块进行快速重试。
分块上传文件,分为以下3个步骤:
1. 初始化一个分块上传,服务端返回一个用于分块上传的UploadId;
2. 并发上传多个分块文件;
3. 完成指定 UploadId 的分块上传,合成一个完整的文件;
扫描 COS 的访问日志,我们发现有不少用户没能以最优雅的方式使用分块上传接口。分块上传方式上传一个大文件时(分块数最多10000个),在其中某一个分块上传失败之后,就立马放弃掉这个文件,重新发起一个新的上传任务,这样浪费了大量的时间来进行重试,使得上传的效率低下。
COS 后端会永久保存一个未完成上传的 UploadId(可以主动使用碎片清理接口来清理未完成的分块上传),如果我们可以记录下步骤1中的 UploadId,列出已经上传的分块,重新从断点处进行续传则可以大大提高上传接口的可用性。
COS 提供了多种语言的 SDK 封装好了对应的断点续传接口,在对应的 COS SDK 中找到高级上传接口即可使用断点续传功能。
二. 跨地域复制
COS最新推出的跨地域复制功能,可以在不同存储区域的存储桶中自动、异步地复制增量对象。利用此特性可以做到跨区域级别的容灾、就近访问提高可用性。随着公司越来越多的业务出海,如何提高跨国访问的可用性成为业务的痛点,使用跨地域复制功能可以极大提升业务的可用性。
1、跨地域复制架构
开启跨地域复制的两个存储桶必须提前打开版本控制功能,并且位于 COS 的不同区域,COS 现在已经支持双向以及一对多的同步配置。客户对文件产生的所有增量操作,包括删除文件操作(开启多版本的情况下删除文件操作实际上是创建一个 0 字节的特殊 delete marker 文件)都会经由源桶通知 costrsf 模块,任务入 CMQ 队列成功之后则返回成功,后续由 costrsf 模块异步的同步文件到目的存储桶,所有的元信息以及访问控制信息 ACL 都会原封不动的同步到目的端,需要注意的是,目的端文件的版本号会和源文件的版本号也保持一致。源文件会维持一个 x-cos-replication-status 字段来保存跨地域复制任务的状态,客户可以通过 HEAD Object 接口来查询文件的复制状态。
这里大家可能会有一个疑问,为什么跨地域复制必须提前打开版本控制功能。
我们设想一个非常常见的场景,如果源桶同时上传了多个路径相同的文件或者目的桶也在上传同名文件,由于跨地域复制的任务是异步进行的,无法保证文件写入的最终一致性。由于源文件和目的文件的版本号是保持一致的,而且版本号是根据时间戳生成的,那么在索引侧就是有序的,最终可以保证多个版本的文件都能按照正确的时序投递到目的存储桶。
2、在COS控制台上设置跨地域复制
控制台支持一对一以及一对多的跨地域复制设置。
进入控制台在左侧导航栏单击【存储桶列表】,然后选择单击需要配置跨地域复制的源存储桶,进入存储桶详情界面。
单击左侧的【高级配置】,进入存储桶的高级配置页,向下找到【跨地域复制】管理项,单击【新增规则】进入跨地域复制规则配置状态。
3、在SCF控制台上设置跨地域复制回调
公司的游戏业务需要将游戏安装包分发到海外的存储桶,使用跨地域复制功能,可以就近上传到广州的存储桶,保证上传的成功率和速度,然后自动复制到海外的存储桶中。如何通知到业务方安装包已经成功同步到海外存储桶,首先想到的方案是通过查询接口,不停的轮询源文件x-cos-replication-status 状态,当 x-cos-replication-status=Complete 时,则可以认为文件同步成功。
更为优雅的方式则是当跨地域复制完成时,由 COS 发出回调消息到 SCF 触发特定的业务逻辑来通知到业务方。
三. 全球加速
1、全球加速原理
腾讯云对象存储 COS 全球加速功能利用全局链路的自动测速功能,智能路由解析用户请求,选择最优网络访问链路,实现请求的就近接入。
利用全球分布的云机房,帮助全球各地用户快速访问最近的接入层,提升业务访问成功率和稳定性。
使用全球加速功能就近接入之后,客户端到接入层的"加速"实际上是,由稳定快速的内网专线网络传输链路,来代替外网不稳定的跨国或跨地域的访问链路。
2、使用方式及加速效果
利用博瑞第三方测评工具,我们将 COS 的存储桶设置在了上海园区,使用COS的普通上传域名以及加速上传域名,在全球各个拨测点进行1MB大小文件的上传测试,从上图我们可以明显的看到亚洲、欧洲、美洲的上传效果得到了显著的提升。对于中国本土的上传提升效果,我们将使用加速效果已经得到某个客户认可的某款 APP 的实测数据来进行展示。
上图是某客户 UGC APP 采样了中国西北地区的普通域名和加速域名上传接口的成功率数据,我们可以清晰的看到新疆、西藏、内蒙古等地的上传成功率都维持在99%之上,西北地区的上传成功率平均提高了2%~3%。客户反馈,APP 端上的整体成功率由97%提升到了99.5%,显著的加速效果,让我们得到了客户的认可。
目前 COS 全球加速功能暂时处于产品公测期,如果您需要使用,可提交内测申请。相比于跨地域复制,用户不需要支付跨地域存储桶的存储费用,也不需要维护额外的逻辑去通知业务方复制任务的成功。只需要在 SDK 中按照以下方式改变 endpoint 即可:
# appid 已在配置中移除,请在参数 Bucket 中带上 appid。Bucket 由 BucketName-APPID 组成
# 1. 设置用户配置, 包括 secretId,secretKey 以及 Region
secret_id = 'COS_SECRETID' # 替换为用户的 secretId
secret_key = 'COS_SECRETKEY' # 替换为用户的 secretKey
region = 'ap-beijing' # 替换为用户的 Region
endpoint = 'cos.accelerate.myqcloud.com' # 替换为加速域名的 endpoint
config = CosConfig(Region=region, Endpoint=endpoint, SecretId=secret_id, SecretKey=secret_key)
# 2. 获取客户端对象
client = CosS3Client(config)
四. 总结
COS 提供了多种扩展功能来提高用户的可用性,如果上传点比较固定或者希望同时具备异地容灾以及就近访问的功能,可以选择跨地域复制功能,如果不希望支付额外的存储费用来提高 UGC 场景下的上传成功率,那么可以选择 COS 全球加速。
更多好礼请点击领取COS限时1元礼包!