随着互联网业务的发展,越来越多的业务对于数据的吞吐量有了更高的要求。为此,对象存储OSS推出加速器功能,可以缓存OSS中的热点文件(Object),提供高性能、高吞吐量的数据访问服务。
前提条件
- OSS加速器功能目前仅在华东1(杭州)、华东2(上海)、华北 3(张家口)、华南1(深圳)、华北2(北京)和新加坡地域公测。
- 已提交工单申请使用OSS加速器功能。
白名单开通OSS加速器功能需要人工接入。提交工单申请后,您需要在工单沟通页面输入人工服务,然后单击联系售后工程师转入人工处理。
注意事项
- 加速器支持在线扩容和缩容。在线扩容约1分钟完成,在线缩容约1小时完成。
- 当加速器缓存已满后,OSS会根据缓存文件的热度将低热度的文件替换为高热度文件。
- 一个加速器可配置的Bucket数量无限制,每个Bucket最多可配置10条加速路径。
使用场景
OSS加速器适用于需要大量带宽,且数据重复读的场景。具体场景如下:
低时延数据共享
- 需求背景
客户在货柜上购买物品,先通过手机App扫描货柜的货物拍照上传,应用后端接收到图片后通过OSS加速器进行存储。后台的子系统随后进行内容安全分析和图片上条码的识别,条码识别后的结果反馈到应用后端进行扣费等操作。下载图片要求毫秒级完成。
- 解决方案
采用OSS加速器写时预热的模式。使用OSS加速器可以有效降低分析系统加载图片的延时情况,缩短交易链路。OSS加速器适合对延时敏感,多次重复读的业务。
大数据分析
- 需求背景
公司的业务数据按天进行分区,归档到OSS作为长期数据进行存储。分析人员使用Hive或Spark等计算引擎对数据进行分析,但不确定查询范围。分析人员要求尽量减少查询分析时间。
- 解决方案
使用OSS加速器读时预热的模式。该模式适用于离线查询场景下数据量大,且不确定数据查询范围,无法准确预热的场景。例如,分析人员A查询的数据,数据会缓存在加速集群。而分析人员B查询的数据包含分析人员A查询的数据,从而加快数据分析进度。
模型训练
- 需求背景
模型训练需要拉取训练数据集,将数据从OSS加载到训练机器时间较长,导致加载数据时计算资源利用率不高。当多个训练任务使用相同的数据集时,还会出现多次加载的情况。
- 解决方案
采用OSS加速器异步预热模式。OSS异步预热模式适用于数据量大,且数据查询以及分析范围确定的场景。对于批任务,下载任务通常存在带宽波峰的情况,OSS加速器提供弹性扩缩容能力,支持秒级修改容量和带宽配额。您可以在任务启动前扩大配额,任务完成后缩小配额,节省日常使用成本。
多级加速
- 需求背景
客户端缓存和服务端加速并不冲突,希望根据业务情况能够达到多级加速的效果。
- 解决方案
OSS加速器与客户端缓存搭配使用。Alluxio推荐co-locate的部署方式,与计算集群并置。当读取的数据未命中Alluxio缓存时,会从后端存储来读取数据。对于OSS加速器,采用读时预热,并在第一次获取数据时进行预热。由于客户端主机缓存空间的限制,Alluxio中每个文件和目录都会设置TTL。当TTL到期后缓存会被淘汰,以便节约空间。此时,OSS加速器中的数据并不会马上淘汰,其缓存空间可以存放数百TB的数据。当再次读取Alluxio中未命中的数据时,可以直接从OSS加速器加载,实现两级加速。
功能优势
- 缓存空间大
OSS加速器继承了OSS海量数据存储的优点,能够提供数TB至数百TB的缓存空间 ,支持直接缓存数仓中的多个表或者分区。
- 吞吐能力
加速器的吞吐能力显著提升,带宽随容量大小线性增长,能有效解决多种应用场景的读吞吐的挑战。
- 弹性伸缩
计算任务通常是周期性任务,每个任务所需资源存在差异。加速器可根据您的需求进行在线扩容或缩容,可有效避免资源浪费,降低您的使用成本。
OSS加速器提供秒级调整配额的弹性能力。对于批任务,下载流量通常存在波峰,OSS加速器可以提供秒级扩缩容量(数十TB到数百TB)和带宽(数Gbps到上百Gbps)配额的能力。您可以在任务启动前扩大配额,任务完成后缩小配额,节约日常使用成本。
- 低延迟
OSS加速器可以为业务提供更低的下载延迟,尤其适用于大文件的下载场景。对于容器化场景,云数据湖、数仓场景有较好的效果。
- 存算分离
加速器可满足计算资源和存储资源分离。面对不同的计算任务,您无需再自建不同缓存进行匹配,满足多业务场景的吞吐加速。
- 数据一致
加速器提供了传统缓存方案不具备的数据一致性。当OSS上的文件被更新时,加速器能自动识别并缓存更新后的文件,以确保计算引擎读取的都是更新后的数据。
- 多种预热策略
OSS加速器能够自动识别OSS上更新的文件,确保引擎读取到最新数据。OSS加速器提供以下预热策略。
- 写时预热:数据写入时同步预热。
- 读时预热:数据读取时未命中加速器,将其预热到缓存集群。
- 异步预热:通过命令触发批量预热。
- 多级加速
您还可以结合客户端缓存以及OSS加速器构建多级缓存,实现更优的加速效果。
- 通过OSS缓存计算集群中的普通数据。
- 通过OSS加速器缓存计算集群中的热数据。
- 通过客户端缓存来缓存计算集群中的极热数据。
使用流程
http://oss-cache-cn-shanghai-g.aliyuncs.com
。当您与加速器在同一专有网络VPC时,您可以通过加速域名访问加速器内的资源,流程如下图所示:
- 写请求
未开启同步预热时,客户端向加速域名发送的写请求会直接转发至OSS Bucket,流程与使用OSS默认域名一致。
开启同步预热后,客户端向加速域名发送的写请求会直接转发至OSS Bucket和OSS加速器。
- 读请求
- 客户端向加速域名发送的读请求会被转发给OSS加速器。
- 加速器在收到读请求后会在缓存空间内查找目标文件:
- 若缓存空间存在目标文件,则文件直接返回给客户端。
- 若缓存空间没有目标文件,加速器会向绑定的OSS请求目标文件。OSS在收到请求后,会将目标文件缓存到加速器中,加速器将文件返回给客户端。
对于未缓存的文件,加速器根据自身容量提供320 Mbps/TB的回源带宽。
性能表现
- 下载响应延迟统计
通过OSS以及OSS加速器多次下载10 MB的Object进行测试,统计其响应延迟(单位ms)分位数,结果显示降低10倍延迟。
- 云上数据湖及数仓场景
某用户分别对本地盘、原生OSS以及OSS加速器作为存储介质进行测试。
- 延迟情况
场景 Local Cache FS (本地) OSS OSS Cache (加速器) 点查 382ms 2451ms 1160ms 1000条数据抽取 438ms 3786ms 1536ms 10%不连续查询 130564ms 345707ms 134659ms 全量扫描测试 171548ms 398681ms 197134ms - 性能情况
- 在线查询时,OSS加速器读命中RT是直读OSS的2~2.5倍。全量扫描、10%随机查询性能是直读OSS的2~2.5倍,约为Local ESSD CacheFs本地读性能的85%。
- 在线查询时,OSS加速器单个请求固有延迟为8~10ms。1000条随机查询、点查性能是直读OSS的1.5~3倍,约为Local ESSD CacheFs本地读性能的30%。
- 容器及自动驾驶仿真训练场景
大量容器同时启动获取镜像,地图,日志数据。仿真训练的整体时长降低60%。
类型 数据量 容器数 峰值带宽 数据加载 OSS 50 TB 2500个 50 Gb/s 约2.2小时 OSS加速器 50 TB 2500个 200 Gb/s 约40分钟
- 延迟情况
创建加速器
- 创建加速器。
- 设置加速策略。
使用加速器
通过加速器加速整个Bucket或者指定路径的数据说明如下。
加速整个Bucket
通过Java SDK在ossClient初始化时,全局使用OSS加速域名实现加速整个Bucket的数据传输。
// 填写OSS加速器域名。
String acclerator_oss_endpoint = "http://oss-cache-cn-beijing-h.aliyuncs.com";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(normal_oss_endpoint, accessKeyId, accessKeySecret);
OSSObject ob = ossClient.getObject(bucketName,objectname);
OSSObject ob = ossClient.putObject(bucketName,objectname,inputStream);
加速Bucket指定路径

您可以通过以下两种形式的Endpoint实现以上数据读写分流场景。
oss-cn-beijing.aliyuncs.com
:通过OSS域名上传数据以及下载normal_data/*下的常规数据。oss-cache-cn-beijing-h.aliyuncs.com
:通过OSS加速域名加速下载hot_data/*下的热数据。
示例代码如下:
public class Demo {
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
private static String accessKeyId = "yourAccessKeyId";
private static String accessKeySecret = "yourAccessKeySecret";
// 使用OSS Endpoint上传数据至OSS Bucket。
private static String normal_oss_endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 使用OSS加速器Endpoint下载数据。
private static String acclerator_oss_endpoint = "https://oss-cache-cn-beijing-h.aliyuncs.com";
// 填写Bucket名称,例如examplebucket。
private static String bucketName = "examplebucket";
// 填写用于存储热数据的Object名称。
private static String object_hot = "hot_data/filetest";
// 填写用于存储常规数据的Object名称。
private static String object_normal = "normal_data/filetest";
// 填写上传的文件内容。
private static String content = "helloworld";
public static void main(String[] args) throws IOException {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(normal_oss_endpoint, accessKeyId, accessKeySecret);
// 将object_hot的数据上传到标准OSS。
uploadFile(object_hot, ossClient);
// 将object_normal的数据上传到标准OSS。
uploadFile(object_normal, ossClient);
// 通过OSS加速器下载hot_data/filetest。
downloadFile(object_hot, ossClient);
// 通过OSS下载normal_data/filetest。
downloadFile(object_normal, ossClient);
// 关闭OSSClient。
ossClient.shutdown();
}
public static void printObjectContent(OSSObject ob) throws IOException {
//// 读取文件内容。
BufferedReader reader = new BufferedReader(new InputStreamReader(ob.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) { break; }
System.out.println("content:" + line);
}
}
/*
*全部上传到OSS。
*/
public static void uploadFile(String objectName, OSS ossClient) {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(content.getBytes());
InputStream contentInputStream = (InputStream) byteArrayInputStream;
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, contentInputStream);
// 如果不显式设置Endpoint,将使用ossclient初始化时设置的值。
PutObjectResult result = ossClient.putObject(putObjectRequest);
System.out.println("Put objectName:" + objectName + " to " + normal_oss_endpoint + " resultID:" + result.getRequestId());
putObjectRequest.setEndPoint(normal_oss_endpoint);
}
/*
*根据objectName的前缀判断需要使用的Endpoint。
*/
public static Object downloadFile(String objectName, OSS ossClient) throws IOException {
String endpoint = "";
if (objectName.startsWith("normal_data")) {
endpoint = normal_oss_endpoint;
} else if (objectName.startsWith("hot_data")) {
endpoint = acclerator_oss_endpoint;
}
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName);
// 如果不显式设置Endpoint,将使用ossclient初始化时设置的值。
getObjectRequest.setEndPoint(endpoint);
OSSObject ob = ossClient.getObject(getObjectRequest);
System.out.println("Get Object" + objectName + " from " + endpoint + " resultID" + ob.getRequestId());
printObjectContent(ob);
return ob;
}
}
修改加速器容量
您可以通过以下步骤对加速器进行扩容或缩容。
- 在OSS加速器页面,单击目标加速器右侧的编辑。
- 在修改OSS加速器面板,修改加速器容量。加速器扩容或缩容的值必须是5的整数倍,且加速器的最低容量不得低于20 TB。扩容约1分钟完成,缩容约1小时完成。
- 单击确定。
查看加速器带宽数据
您可以通过OSS管理控制台以及云监控SDK查看加速器带宽数据。
方式一:通过OSS管理控制台
- 在OSS加速器页面,单击加速器统计数据页签。
- 在加速器统计数据页签,选择OSS加速器名称以及加速器Bucket,然后选择查看最近15分钟、最近30分钟或者自定义起始与结束时间内的加速器带宽数据,并单击搜索。
方式二:通过云监控SDK
以下代码用于通过云监控Java SDK查看加速器带宽数据。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.cms.model.v20190101.DescribeMetricListRequest;
import com.aliyuncs.cms.model.v20190101.DescribeMetricListResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.text.ParseException;
public class DescribeMetricListSample {
public static void main(String[] args) throws ParseException {
// 构建阿里云客户端,用于发起请求。
// 构建阿里云客户端时需要设置AccessKey ID和AccessKey Secret。
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "AccessKeyId", "AccessKeySecret");
IAcsClient client = new DefaultAcsClient(profile);
// 构建请求。
DescribeMetricListRequest request = new DescribeMetricListRequest();
request.setRegionId("cn-hangzhou");
/*
CacheRecv:流入(上传)数据量(单位为Byte)
CacheSendBandwidth:流入带宽(单位为bps)
CacheSend:流出(下载)流量(单位为Byte)
CacheRecvBandwidth:流出带宽(单位为bps)
CacheOriginRecv:回源流入(下载)数据量(单位为Byte)
CacheOriginRecvBandwidth:回源流入带宽(单位为bps)
CacheOriginSend:回源流入(上传)数据量(单位为Byte)
CacheOriginSendBandwidth:回源流入带宽(单位为bps)
*/
request.setMetricName("CacheRecvBandwidth");
request.setNamespace("acs_oss_dashboard");
/*
userId: 填写用户的UID。
instanceId:填写加速器名称。
BucketName:填写加速器Bucket。如果不填写该选项,默认查询所有加速器Bucket的带宽数据。
*/
//request.setDimensions("{\"userId\":\"187792400570****\",\"instanceId\":\"accelerate-test\",\"BucketName\":\"examplebucket\"}");
request.setDimensions("{\"userId\":\"187792400570****\",\"instanceId\":\"accelerate-test\"}");
try {
DescribeMetricListResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}