文档

使用OSS加速器

更新时间:

随着AI、数据仓库、大数据分析等业务发展,越来越多运行在OSS上的业务对于数据的访问延迟和吞吐量有了更高的要求。OSS推出加速器功能,可以将OSS中的热点文件(Object)缓存在NVMe SSD高性能存储介质上,提供毫秒级低延迟和高吞吐量的数据访问服务。

说明

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

前提条件

OSS加速器功能目前在华东1(杭州)、华东2(上海)、华北2(北京)、华北6(乌兰察布)、华南1(深圳)、新加坡地域公测。

注意事项

  • 公测期间,加速器可以为单个Bucket提供50 GB~100 GB高速介质缓存空间。如果您的业务场景需要更高的容量,请提交工单申请提升容量。

  • 公测期间,加速器可以为单个Bucket提供的加速带宽为4 Gbps。如果您的业务场景需要更高的带宽,请提交工单申请提升带宽。

费用说明

OSS加速器目前处于公测阶段,公测期间免费提供最大100 GB的加速器配置容量。公测结束后,您需要根据加速器配置的实际容量按量付费。

使用场景

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

模型推理

  • 需求背景

    AIGC模型推理需要拉取加载模型文件,在推理的调试过程中,还需要不断切换新的模型文件进行尝试。随着模型文件的不断增大,推理服务器拉取模型文件所需时间会越来越长。

  • 解决方案

    采用OSS加速器异步预热或者读时预热模式。OSS异步预热模式适用于明确知晓热点模型文件范围的场景,读时预热适用于不确定模型文件范围的场景。如果您知晓热点模型文件的列表,可以配置相应的加速器空间,并通过加速器SDK将指定的OSS文件提前放入加速器空间中。您也可以根据经验配置一定大小的加速器空间,加速器会在数据读取时自动缓存文件至加速器高性能介质中,供下次读取时快速访问。加速器的空间可根据加速效果随时进行扩缩调整。如果您的推理程序需要通过本地目录方式访问OSS,您需要部署ossfs

    image

低时延数据共享

  • 需求背景

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

  • 解决方案

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

    image

大数据分析

  • 需求背景

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

  • 解决方案

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

    image

多级加速

  • 需求背景

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

  • 解决方案

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

    image

功能优势

  • 低延迟

    OSS加速器的NVMe SSD介质可以为业务提供的毫秒级下载延迟,尤其适用于大文件的下载场景。对于推理模型下载,数仓热数据查询有较好的效果。

  • 吞吐能力

    加速器的带宽随容量大小线性增长,并提供高达百GB/s的突发吞吐能力。

  • 弹性伸缩

    计算任务通常是周期性任务,每个任务所需资源存在差异。加速器可根据您的需求进行在线扩容或缩容,可有效避免资源浪费,降低您的使用成本。加速器支持最低50 GB,最大百TB的缓存空间。OSS加速器继承了OSS海量数据存储的优点,支持直接缓存数仓中的多个表或者分区。

  • 高吞吐密度

    加速器可以为少量数据提供极大的吞吐能力,可以满足少量热数据的突发读取需求。

  • 存算分离

    OSS加速器相较于计算服务器上的缓存空间,可以脱离计算服务器独立且在线调整空间和性能。

  • 数据一致

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

  • 多种预热策略

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

    • 同步预热:数据写入OSS时,将数据同步缓存至加速器空间。

    • 读时预热:数据读取时未命中,加速器会自动将其缓存至加速器空间。

    • 异步预热:通过命令,将OSS中数据批量缓存至加速器空间。

工作原理

加速器创建完成后会拥有一个地域专属的内网加速域名。例如华北2(北京)地域的加速域名为http://cn-beijing-internal.oss-data-acc.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分钟

  • 加速器吞吐

    加速器根据配置的空间大小,为加速器上缓存的数据提供吞吐带宽。每TB的加速器空间提供4 Gbps的最大免费吞吐。加速器提供的吞吐不会影响OSS提供的标准吞吐能力。

    例如华南1(深圳)地域,OSS提供100 Gbps的标准吞吐能力。开启加速器并配置10 TB加速器空间后,加速器会为加速器上缓存的数据提供额外的40 Gbps低延迟吞吐。针对批量离线计算应用,您可以通过大规模并发大块读取的方式充分利用100 Gbps标准吞吐能力。对实时业务,您可以通过将数据缓存至加速器的NVMe SSD介质中,获得额外的低延迟40 Gbps吞吐。

创建加速器

  1. 创建加速器。

    1. 登录OSS管理控制台

    2. 单击Bucket 列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择Bucket配置 > OSS加速器

    4. OSS加速器页面,单击设置

    5. 开通提示对话框,选中我已阅读服务试用条款,然后单击下一步

    6. 创建OSS加速器面板,配置加速器容量,然后单击下一步

  2. 创建加速路径。

    1. 创建加速路径面板,按照以下说明配置各项参数。

      参数

      说明

      加速策略

      选择加速器的策略。

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

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

      同步预热

      建议开启同步预热。开启后,客户端通过加速器域名调用PutObject或者AppendObject方式向OSS写入数据时,数据会同时写入OSS Bucket以及OSS加速器,下次读取数据时可以通过OSS加速器获得更低延迟。

    2. 单击确认创建,然后在弹出的请确认设置中的计费项对话框,单击确定

使用加速器

通过加速器加速整个Bucket或者指定路径的数据说明如下。

加速整个Bucket

通过Java SDK在ossClient初始化时,全局使用OSS加速域名实现加速整个Bucket的数据传输。

// 填写OSS加速器域名。
String acclerator_oss_endpoint = "http://cn-beijing-internal.oss-data-acc.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-hangzhou.aliyuncs.com";

    // 使用OSS加速器Endpoint下载数据。
    private static String acclerator_oss_endpoint = "https://cn-hangzhou-internal.oss-data-acc.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加速器页面的基本信息区域,单击右上角的Dingtalk_20240315162315.jpg图标。

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

  3. 单击确定

  • 本页导读 (1)