文档

使用OSS加速器

更新时间:

随着互联网业务的发展,越来越多的业务对于数据的吞吐量有了更高的要求。为此,对象存储OSS推出加速器功能,可以缓存OSS中的热点文件(Object),提供高性能、高吞吐量的数据访问服务。

说明

无地域属性存储空间不支持使用OSS加速器。

前提条件

  • OSS加速器功能目前仅在华东1(杭州)、华东2(上海)、华北 3(张家口)、华南1(深圳)、华北2(北京)和新加坡地域公测。

  • 提交工单申请使用OSS加速器功能。

    白名单开通OSS加速器功能需要人工接入。提交工单申请后,您需要在工单沟通页面输入人工服务,然后单击联系售后工程师转入人工处理。

注意事项

  • 加速器支持按照容量提供对应的带宽(1 TB容量对应200 MB/s带宽)。最小配置容量为20 TB。

  • 加速器支持在线扩容和缩容。在线扩容约1分钟完成,在线缩容约1小时完成。

  • 当加速器缓存已满后,OSS会根据缓存文件的热度将低热度的文件替换为高热度文件。

  • 一个加速器可配置的Bucket数量无限制,每个Bucket最多可配置10条加速路径。

使用场景

OSS加速器适用于需要大量带宽,且数据重复读的场景。具体场景如下:

低时延数据共享

  • 需求背景

    客户在货柜上购买物品,先通过手机App扫描货柜的货物拍照上传,应用后端接收到图片后通过OSS加速器进行存储。后台的子系统随后进行内容安全分析和图片上条码的识别,条码识别后的结果反馈到应用后端进行扣费等操作。下载图片要求毫秒级完成。

  • 解决方案

    采用OSS加速器写时预热的模式。使用OSS加速器可以有效降低分析系统加载图片的延时情况,缩短交易链路。OSS加速器适合对延时敏感,多次重复读的业务。

    image

大数据分析

  • 需求背景

    公司的业务数据按天进行分区,归档到OSS作为长期数据进行存储。分析人员使用Hive或Spark等计算引擎对数据进行分析,但不确定查询范围。分析人员要求尽量减少查询分析时间。

  • 解决方案

    使用OSS加速器读时预热的模式。该模式适用于离线查询场景下数据量大,且不确定数据查询范围,无法准确预热的场景。例如,分析人员A查询的数据,数据会缓存在加速集群。而分析人员B查询的数据包含分析人员A查询的数据,从而加快数据分析进度。

    image

模型训练

  • 需求背景

    模型训练需要拉取训练数据集,将数据从OSS加载到训练机器时间较长,导致加载数据时计算资源利用率不高。当多个训练任务使用相同的数据集时,还会出现多次加载的情况。

  • 解决方案

    采用OSS加速器异步预热模式。OSS异步预热模式适用于数据量大,且数据查询以及分析范围确定的场景。对于批任务,下载任务通常存在带宽波峰的情况,OSS加速器提供弹性扩缩容能力,支持秒级修改容量和带宽配额。您可以在任务启动前扩大配额,任务完成后缩小配额,节省日常使用成本。

    image

多级加速

  • 需求背景

    客户端缓存和服务端加速并不冲突,希望根据业务情况能够达到多级加速的效果。

  • 解决方案

    OSS加速器与客户端缓存搭配使用。Alluxio推荐co-locate的部署方式,与计算集群并置。当读取的数据未命中Alluxio缓存时,会从后端存储来读取数据。对于OSS加速器,采用读时预热,并在第一次获取数据时进行预热。由于客户端主机缓存空间的限制,Alluxio中每个文件和目录都会设置TTL。当TTL到期后缓存会被淘汰,以便节约空间。此时,OSS加速器中的数据并不会马上淘汰,其缓存空间可以存放数百TB的数据。当再次读取Alluxio中未命中的数据时,可以直接从OSS加速器加载,实现两级加速。

    image

功能优势

  • 缓存空间大

    OSS加速器继承了OSS海量数据存储的优点,能够提供数TB至数百TB的缓存空间 ,支持直接缓存数仓中的多个表或者分区。

  • 吞吐能力

    加速器的吞吐能力显著提升,带宽随容量大小线性增长,能有效解决多种应用场景的读吞吐的挑战。

  • 弹性伸缩

    计算任务通常是周期性任务,每个任务所需资源存在差异。加速器可根据您的需求进行在线扩容或缩容,可有效避免资源浪费,降低您的使用成本。

    OSS加速器提供秒级调整配额的弹性能力。对于批任务,下载流量通常存在波峰,OSS加速器可以提供秒级扩缩容量(数十TB到数百TB)和带宽(数Gbps到上百Gbps)配额的能力。您可以在任务启动前扩大配额,任务完成后缩小配额,节约日常使用成本。

  • 低延迟

    OSS加速器可以为业务提供更低的下载延迟,尤其适用于大文件的下载场景。对于容器化场景,云数据湖、数仓场景有较好的效果。

  • 存算分离

    加速器可满足计算资源和存储资源分离。面对不同的计算任务,您无需再自建不同缓存进行匹配,满足多业务场景的吞吐加速。

  • 数据一致

    加速器提供了传统缓存方案不具备的数据一致性。当OSS上的文件被更新时,加速器能自动识别并缓存更新后的文件,以确保计算引擎读取的都是更新后的数据。

  • 多种预热策略

    OSS加速器能够自动识别OSS上更新的文件,确保引擎读取到最新数据。OSS加速器提供以下预热策略。

    • 写时预热:数据写入时同步预热。

    • 读时预热:数据读取时未命中加速器,将其预热到缓存集群。

    • 异步预热:通过命令触发批量预热。

  • 多级加速

    您还可以结合客户端缓存以及OSS加速器构建多级缓存,实现更优的加速效果。

    • 通过OSS缓存计算集群中的普通数据。

    • 通过OSS加速器缓存计算集群中的热数据。

    • 通过客户端缓存来缓存计算集群中的极热数据。

使用流程

加速器创建完成后会拥有一个地域专属的加速域名。例如华东2(上海)地域的加速域名为http://oss-cache-cn-shanghai-g.aliyuncs.com。当您与加速器在同一专有网络VPC时,您可以通过加速域名访问加速器内的资源,流程如下图所示:

image

流程说明如下:

  • 写请求

    未开启同步预热时,客户端向加速域名发送的写请求会直接转发至OSS Bucket,流程与使用OSS默认域名一致。

    开启同步预热后,客户端向加速域名发送的写请求会直接转发至OSS Bucket和OSS加速器。

  • 读请求

    1. 客户端向加速域名发送的读请求会被转发给OSS加速器。

    2. 加速器在收到读请求后会在缓存空间内查找目标文件:

      • 若缓存空间存在目标文件,则文件直接返回给客户端。

      • 若缓存空间没有目标文件,加速器会向绑定的OSS请求目标文件。OSS在收到请求后,会将目标文件缓存到加速器中,加速器将文件返回给客户端。

性能表现

  • 下载响应延迟统计

    通过OSS以及OSS加速器多次下载10 MB的Object进行测试,统计其响应延迟(单位ms)分位数,结果显示降低10倍延迟。

    以下图表中的P50表示50%的请求符合当前统计的延迟情况,P999表示99.9%的请求符合当前统计的延迟情况。

    image
  • 云上数据湖及数仓场景

    某用户分别对本地盘、原生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分钟

创建加速器

  1. 创建加速器。

    1. 登录OSS管理控制台

    2. 在左侧导航栏,选择数据服务 > OSS加速器

    3. OSS加速器页面,单击创建OSS加速器

    4. 创建OSS加速器面板,按以下说明配置各项参数。

      参数

      说明

      OSS 加速器名称

      设置加速器的名称。长度必须在3~63字符之间。

      可用区

      选择加速器可用区。

      加速域名

      用于访问加速器的加速域名。

      最大带宽

      设置加速器的最大带宽,单位为MB/s。

      最大带宽应为大于或等于4000,且能被1000整除的整数。

      加速器容量

      指定最大带宽后将自动显示加速器的容量大小,单位为TB。

    5. 单击确定

  2. 设置加速策略。

    1. 单击目标加速器右侧的设置加速路径

    2. 设置加速路径面板,单击新增,然后按以下说明配置各项参数。

      参数

      说明

      Bucket名称

      选择加速器对应的目标Bucket。

      重要

      如果目标Bucket此前已被其他加速器加速,此操作会覆写已有的配置。

      加速策略

      选择加速器的策略。

      • 指定路径加速:指定文件目录访问路径,最多可添加10条。指定后,加速器将只加速指定目录下的文件。例如您需要加速根目录下example目录的文件,则填写example/

      • 加速整个Bucket:加速Bucket内所有文件。

      缓存策略

      选中同步预热。此时,通过PutObject或者AppendObject方式向OSS写入数据时,数据会同时写入OSS Bucket以及OSS加速器。

    3. 单击保存

      您还可以单击新增,然后按操作指引新增多个使用加速器的目标Bucket。

使用加速器

通过加速器加速整个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指定路径

image

您可以通过以下两种形式的Endpoint实现以上数据读写分流场景。

  • oss-cn-beijing.aliyuncs.com:通过OSS域名上传数据以及下载normal_data/*下的常规数据。

  • oss-cache-cn-beijing-h.aliyuncs.com:通过OSS加速域名加速下载hot_data/*下的热数据。

示例代码如下:

public class Demo {
    // 请确保已设置环境变量AccessKeyId和AccessKeySecret。
    private static String acceskeyId = System.getenv("AccessKeyId");
    private static String accessKeySecret = System.getenv("AccessKeySecret");

    // 使用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;
    }
}

修改加速器容量

您可以通过以下步骤对加速器进行扩容或缩容。

  1. OSS加速器页面,单击目标加速器右侧的编辑

  2. 修改OSS加速器面板,修改加速器容量

    加速器扩容或缩容的值必须是5的整数倍,且加速器的最低容量不得低于20 TB。扩容约1分钟完成,缩容约1小时完成。

  3. 单击确定

查看加速器带宽数据

您可以通过OSS管理控制台以及云监控SDK查看加速器带宽数据。

方式一:通过OSS管理控制台

  1. OSS加速器页面,单击加速器统计数据页签。

  2. 加速器统计数据页签,选择OSS加速器名称以及加速器Bucket,然后选择查看最近15分钟、最近30分钟或者自定义起始与结束时间内的加速器带宽数据,并单击搜索test

方式二:通过云监控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 {
        // 构建阿里云客户端前,请确保已设置环境变量AccessKeyId和AccessKeySecret。
        private static String acceskeyId = System.getenv("AccessKeyId");
        private static String accessKeySecret = System.getenv("AccessKeySecret");
        // 构建阿里云客户端,用于发起请求。
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", acceskeyId, 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());
        }
    }
}
  • 本页导读 (1)
文档反馈