使用资源池QoS保障关键业务带宽

默认情况下,阿里云账号下同一地域的所有Bucket共享带宽。当多个Bucket并发传输大量数据时,可能因带宽争抢导致关键业务传输延迟。通过配置资源池QoS流控可解决此问题:阈值流控防止某个Bucket占用过多带宽,优先级流控保障核心业务最小带宽,两种方案互补使用,确保重要业务稳定运行。

工作原理

阈值流控

为各层级对象(Bucket、BucketGroup)设置带宽上限,防止资源过度占用。

层级关系说明

资源池层级结构:资源池内部可以形成多层级的包含关系,实际场景中可能有以下几种层级结构。

场景1:纯 Bucket 扁平结构

image

场景2:BucketGroup 嵌套

image

场景3:BucketGroup 与 Bucket 混合

image

请求者流控维度(独立维度):请求者不是资源池的层级结构成员,而是一个独立的流控维度。

场景4:请求者流控与资源池层级流控同时生效

image

流控生效原则

基本原则

资源池: 最大100Gbps
├─ Bucket A: 最大40Gbps ← 即使空闲,也不能超过40Gbps
├─ Bucket B: 最大30Gbps
└─ Bucket C: 不限制 ← 可使用全部剩余带宽

约束规则

  1. 多层级限制同时生效:实际带宽取所有生效规则的最小值

  2. 下层带宽之和不能超过上层总带宽

  3. 请求者维度独立约束:与资源池层级约束同时生效,取最小值

示例

RAM用户访问Bucket时,同时受:

  • 请求者限制(20Gbps)← 独立维度

  • Bucket限制(30Gbps)← 资源池层级

实际最大带宽 = min(20Gbps, 30Gbps) = 20Gbps

优先级流控

在资源池层面配置3-10个优先级等级。优先级等级越大,优先级越高。为不同优先级的对象分配保底带宽,确保高优先级业务在资源竞争时优先获得带宽。如果没有为对象配置优先级等级,则使用默认优先级等级。如果没有为优先级等级配置保底带宽,则使用默认保底带宽。

核心机制

  1. 保底保障:每个优先级都有保底带宽,硬性保证一定可以达到该保底带宽

  2. 抢占机制:高优先级可以抢占低优先级超出保底带宽部分的带宽,且更高优先级优先抢占

  3. 空闲利用:低优先级也可以使用高优先级空闲的保底带宽,但较高优先级优先使用

  4. 配置约束:所有优先级保底带宽之和 ≤ 资源池总带宽

典型场景

以下场景资源池总限制100Gbps,优先级1到优先级3。

场景1:高优先级抢占低优先级超出保底的带宽

各优先级保底20Gbps,优先级1需求10Gbps,优先级2需求30Gbps,优先级3需求80Gbps。

优先级

保底

需求

实际分配

说明

优先级3

20Gbps

80Gbps

70Gbps

获得保底20 + 抢占优先级1空闲的10 + 资源池剩余40

优先级2

20Gbps

30Gbps

20Gbps

获得保底20,额外需求被优先级3抢占

优先级1

20Gbps

10Gbps

10Gbps

按需分配10,空闲保底10被优先级3抢占

最终分配:10 + 20 + 70 = 100Gbps

场景2:更高优先级优先抢占

各优先级保底25Gbps,优先级1需求0Gbps,优先级2需求5Gbps,优先级3需求40Gbps,优先级4需求60Gbps。

优先级

保底

需求

实际分配

说明

优先级4

25Gbps

60Gbps

60Gbps

获得保底25 + 高优先级抢占35

优先级3

25Gbps

40Gbps

35Gbps

获得保底25 + 次优先抢占剩余的10

优先级2

25Gbps

5Gbps

5Gbps

需求小于保底,按需分配5

优先级1

25Gbps

0Gbps

0Gbps

需求小于保底,按需分配0

最终分配:0 + 5 + 35 + 60 = 100Gbps

场景3:保底之和小于总带宽

各优先级保底10Gbps(总和40Gbps),优先级1需求50Gbps,优先级2需求50Gbps,优先级3需求30Gbps,优先级4需求20Gbps。

优先级

保底

需求

实际分配

说明

优先级4

10Gbps

20Gbps

20Gbps

最高优先级,需求全满足

优先级3

10Gbps

30Gbps

30Gbps

次高优先级,需求全满足

优先级2

10Gbps

50Gbps

40Gbps

获得保底10 + 剩余30

优先级1

10Gbps

50Gbps

10Gbps

仅获得保底,额外需求被抢占

最终分配:10 + 40 + 30 + 20 = 100Gbps

两种流控配合使用

对每个流控资源需要同时考虑阈值流控上限、优先级流控保底和实际需求的多维度影响。

生效原则

  • 阈值流控上限是硬限制:无论保底多高,最终不能超过阈值上限

  • 优先级保底是软保障:在阈值上限范围内尽量满足保底

配置示例

正常配置

Bucket A 同时配置:

  • 优先级流控:保底50Gbps ← 优先级维度

  • 阈值流控:最大80Gbps ← 资源池层级

结果:Bucket A 可用带宽为 50-80Gbps(至少50,最多80)

配置冲突

Bucket A 同时配置:

  • 优先级流控:保底80Gbps ← 优先级维度

  • 阈值流控:最大50Gbps ← 资源池层级

结果:Bucket A 实际可用带宽为 50Gbps(阈值流控上限优先,而不是80Gbps)

申请资源池

当阿里云账号下某个地域的带宽达到400 Gbps或以上时,可联系技术支持申请创建资源池。

提交工单时需提供以下信息:

地域:华东1(杭州)
资源池名称:qos-resource-pool-1
Bucket列表:qos-examplebucket-1, qos-examplebucket-2
总上传带宽:300 Gbps
内网上传带宽:100 Gbps
外网上传带宽:200 Gbps
总下载带宽:100 Gbps
内网下载带宽:50 Gbps
外网下载带宽:50 Gbps

配置阈值流控

适合需要限制带宽上限,防止某个对象占用过多资源的场景。

配置Bucket带宽上限

防止某个Bucket流量过大影响其他Bucket。

控制台

资源池QoS页面,单击目标资源池名称,然后单击资源池内目标Bucket右侧的修改流控配置,按照以上要求设置Bucket带宽。

ossutil

使用前,需安装ossutil

  1. 通过本地XML配置文件(qos.xml)配置指定Bucket的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 为指定Bucket(示例值为examplebucket)添加以上带宽配置。

    ossutil api invoke-operation --op-name put-bucket-qos-info --method PUT --bucket examplebucket --parameters qosInfo --body=file://qos.xml
  3. 查看Bucket的带宽配置。

    ossutil api invoke-operation --op-name get-bucket-qos-info --method GET --bucket examplebucket --parameters qosInfo

SDK

目前仅支持通过Python SDK V2Go SDK V2Bucket设置带宽上限。

  1. 通过本地qos.xml文件配置Bucket的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 为指定Bucket设置以上带宽配置。

    import alibabacloud_oss_v2 as oss
    
    def PutBucketQoSInfo():
       # 从环境变量中加载凭证信息,用于身份验证
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # 加载默认配置并获取配置对象
        cfg = oss.config.load_default()
    
        # 设置凭证提供者
        cfg.credentials_provider = credentials_provider
    
        # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
        cfg.region = "cn-hangzhou"
    
        # 使用配置对象初始化OSS客户端
        client = oss.Client(cfg)
    
        # 初始化qos_xml_body为空字符串
        qos_xml_body = ""
    
        # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中
        with open('qos.xml', 'r') as qos_file:
            qos_xml_body = qos_file.read()
    
        # 构造一个操作输入请求对象,用于设置存储空间的QoS信息
        req = oss.OperationInput(
            op_name = 'PutBucketQoSInfo',  # 操作名称,这里是指定设置存储空间QoS信息的操作
            method = 'PUT',  # HTTP方法类型,此处为PUT,表示更新资源
            parameters = {
                'qosInfo': '',  # 这里是参数列表,指定要设置的是QoS信息
            },
            headers = None,  # 请求头信息,如果不需要特殊设置则可以为None
            body = qos_xml_body,  # 请求体,包含之前从'qos.xml'文件读取的内容
            bucket = 'examplebucket',  # 目标存储空间的名称
        )
    
        # 调用客户端的invoke_operation方法执行请求,并接收响应
        resp = client.invoke_operation(req)
    
        # 打印响应的状态码
        print(resp.status_code)
    
        # 打印响应的头部信息
        print(resp.headers)
        
    if __name__ == "__main__":
        PutBucketQoSInfo()

API

调用PutBucketQoSInfo按以下示例限制Bucket带宽。

<QoSConfiguration>
  <TotalUploadBandwidth>100</TotalUploadBandwidth>
  <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
  <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
  <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
  <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
  <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
</QoSConfiguration>

配置Bucket请求者带宽上限

RAM用户

多个业务共享同一个Bucket,需要限制某个RAM用户的带宽,避免其过度占用。

控制台

  1. 查看RAM用户ID

  2. 资源池QoS页面,单击目标资源池名称,然后单击资源池内目标Bucket右侧的配置请求者流控,按照以上要求设置RAM用户访问Bucket的带宽。

ossutil

使用前,需安装ossutil

以下示例用于限制RAM用户访问资源池内某个Bucket的带宽:

  1. 通过本地XML配置文件(qos.xml)配置指定RAM用户访问资源池内某个Bucket的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>-1</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 查看RAM用户ID

  3. 为访问Bucket(示例值为examplebucket)的RAM用户(UID266xxxx)添加以上带宽配置。

    ossutil api invoke-operation --op-name put-bucket-requester-qos-info --method PUT --bucket=examplebucket --parameters requesterQosInfo --parameters qosRequester=266xxxx --body file://qos.xml
  4. (可选)获取该RAM用户访问资源池内某个Bucket的带宽配置。

    ossutil api invoke-operation --op-name get-bucket-requester-qos-info --method GET --bucket=examplebucket --parameters requesterQosInfo --parameters qosRequester=266xxxx

SDK

目前仅支持通过Python SDK V2Go SDK V2限制RAM用户访问Bucket的带宽上限。

  1. 通过本地qos.xml文件配置指定RAM用户访问资源池内某个Bucket的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>-1</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 查看RAM用户ID

  3. 为访问BucketRAM用户设置以上带宽配置。

    import alibabacloud_oss_v2 as oss
    
    def PutBucketRequesterQoSInfo():
        # 从环境变量中加载凭证信息,用于身份验证
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # 加载默认配置并获取配置对象
        cfg = oss.config.load_default()
    
        # 设置凭证提供者
        cfg.credentials_provider = credentials_provider
    
        # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
        cfg.region = "cn-hangzhou"
    
        # 使用配置对象初始化OSS客户端
        client = oss.Client(cfg)
    
        # 初始化qos_xml_body为空字符串
        qos_xml_body = ""
    
        # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中
        with open('qos.xml', 'r') as qos_file:
            qos_xml_body = qos_file.read()
    
        # 构造一个操作输入请求对象,用于设置存储空间的请求者QoS信息
        req = oss.OperationInput(
            op_name = 'PutBucketRequesterQoSInfo',  # 操作名称,这里是指定设置存储空间请求者QoS信息的操作
            method = 'PUT',  # HTTP方法类型,此处为PUT,表示更新资源
            parameters = {
                'requesterQosInfo': '',  # 参数列表,指定要设置的是请求者QoS信息
                'qosRequester': '2598732222222xxxx',  # 请求者的唯一标识符,用于区分不同的请求者
            },
            headers = None,  # 请求头信息,如果不需要特殊设置则可以为None
            body = qos_xml_body,  # 请求体,包含之前从'qos.xml'文件读取的内容
            bucket = 'examplebucket',  # 目标存储空间的名称
        )
    
        # 调用客户端的invoke_operation方法执行请求,并接收响应
        resp = client.invoke_operation(req)
    
        # 打印响应的状态码
        print(resp.status_code)
    
        # 打印响应的头部信息
        print(resp.headers)
    
        # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据
        print(resp.http_response.content)
    
    if __name__ == "__main__":
        PutBucketRequesterQoSInfo()

API

  1. 查看RAM用户ID

  2. 调用PutBucketRequesterQoSInfo按以下示例限制RAM用户访问Bucket的带宽。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>-1</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth>
    </QoSConfiguration>

RAM角色

使用Bucket存储静态资源并启用CDN加速。为使CDN能从私有Bucket获取文件,需开启私有Bucket回源。CDN通过RAM角色AliyunCDNAccessingPrivateOSSRole访问Bucket,需要限制其回源带宽。

控制台

  1. 查看RAM角色ID

  2. 资源池QoS页面,单击目标资源池名称,然后单击资源池内目标Bucket右侧的配置请求者流控,按照以上要求设置Bucket请求者带宽。

ossutil

使用前,需安装ossutil

  1. 通过本地XML配置文件(qos.xml)配置该角色访问指定Bucket的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>40</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 查看RAM角色ID

  3. 为该角色(角色ID362xxxx)添加访问指定Bucket(示例值为examplebucket)带宽配置。

    ossutil api invoke-operation --op-name put-bucket-requester-qos-info --method PUT --bucket=examplebucket --parameters requesterQosInfo --parameters qosRequester=362xxxx --body file://qos.xml
  4. (可选)列举资源池所有RAM角色的带宽配置。

    ossutil api invoke-operation --op-name list-resource-pool-requester-qos-infos --method GET --parameters resourcePool=examplePool  --parameters requesterQosInfo

SDK

目前仅支持通过Python SDK V2Go SDK V2限制RAM角色访问Bucket的带宽上限。

  1. 通过本地qos.xml文件配置指定RAM用户访问资源池内某个Bucket的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>40</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 查看RAM角色ID

  3. RAM角色设置以上带宽配置。

    import alibabacloud_oss_v2 as oss
    
    def PutBucketRequesterQoSInfo():
        # 从环境变量中加载凭证信息,用于身份验证
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # 加载默认配置并获取配置对象
        cfg = oss.config.load_default()
    
        # 设置凭证提供者
        cfg.credentials_provider = credentials_provider
    
        # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
        cfg.region = "cn-hangzhou"
    
        # 使用配置对象初始化OSS客户端
        client = oss.Client(cfg)
    
        # 初始化qos_xml_body为空字符串
        qos_xml_body = ""
    
        # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中
        with open('qos.xml', 'r') as qos_file:
            qos_xml_body = qos_file.read()
    
        # 构造一个操作输入请求对象,用于设置存储空间的请求者QoS信息
        req = oss.OperationInput(
            op_name = 'PutBucketRequesterQoSInfo',  # 操作名称,这里是指定设置存储空间请求者QoS信息的操作
            method = 'PUT',  # HTTP方法类型,此处为PUT,表示更新资源
            parameters = {
                'requesterQosInfo': '',  # 参数列表,指定要设置的是请求者QoS信息
                'qosRequester': '2598732222222xxxx',  # 请求者的唯一标识符,用于区分不同的请求者
            },
            headers = None,  # 请求头信息,如果不需要特殊设置则可以为None
            body = qos_xml_body,  # 请求体,包含之前从'qos.xml'文件读取的内容
            bucket = 'examplebucket',  # 目标存储空间的名称
        )
    
        # 调用客户端的invoke_operation方法执行请求,并接收响应
        resp = client.invoke_operation(req)
    
        # 打印响应的状态码
        print(resp.status_code)
    
        # 打印响应的头部信息
        print(resp.headers)
    
        # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据
        print(resp.http_response.content)
    
    if __name__ == "__main__":
        PutBucketRequesterQoSInfo()

API

  1. 查看RAM角色ID

  2. 调用PutBucketRequesterQoSInfo按以下示例限制RAM角色访问Bucket的带宽。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>40</ExtranetDownloadBandwidth>
    </QoSConfiguration>

配置BucketGroup带宽上限

将低优先级Bucket加入BucketGroup统一管理,限制其总带宽。

控制台

  1. 资源池QoS页面,单击目标资源池名称,然后单击创建BucketGroup,定义BucketGroup名称并按照要求设置BucketGroup带宽。

  2. 在目标资源池页面,单击目标Bucket右侧的配置BucketGroup,将低优先级Bucket加入BucketGroup。

ossutil

使用前,需安装ossutil

  1. scheduled-postsarchived-comments两个Bucket加入BucketGroup。

    1. scheduled-posts加入BucketGroup。

      ossutil api invoke-operation --op-name put-bucket-resource-pool-bucket-group --method PUT --bucket scheduled-posts --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup=test-group
    2. archived-comments加入BucketGroup。

      ossutil api invoke-operation --op-name put-bucket-resource-pool-bucket-group --method PUT --bucket archived-comments --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup=test-group
    3. (可选)获取BucketGroup中添加的Bucket列表。

      ossutil api invoke-operation --op-name list-resource-pool-bucket-groups --method GET --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup
  2. 通过本地XML配置文件(qos.xml)配置资源池内指定BucketGroup的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>20</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>10</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>30</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  3. BucketGroup配置带宽。

    ossutil api invoke-operation --op-name put-resource-pool-bucket-group-qos-info --method PUT --parameters resourcePoolBucketGroupQosInfo --parameters resourcePool pool-for-ai --parameters resourcePoolBucketGroup offline-group --body=file://qos.xml
  4. (可选)获取BucketGroup的带宽配置。

    ossutil api invoke-operation --op-name get-resource-pool-bucket-group-qos-info --method GET --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup=offline-group --parameters resourcePoolBucketGroupQoSInfo

SDK

目前仅支持通过Python SDK V2Go SDK V2限制BucketGroup的带宽上限。

  1. 将资源池内的两个Bucket分别加入BucketGroup。

    import alibabacloud_oss_v2 as oss
    
    def PutBucketResourcePoolBucketGroup():
        # 从环境变量中加载凭证信息,用于身份验证
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # 加载默认配置并获取配置对象
        cfg = oss.config.load_default()
    
        # 设置凭证提供者
        cfg.credentials_provider = credentials_provider
    
        # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
        cfg.region = "cn-hangzhou"
    
        # 使用配置对象初始化OSS客户端
        client = oss.Client(cfg)
    
        # 构造一个操作输入请求对象,用于将存储空间添加到指定的资源池存储空间组
        req = oss.OperationInput(
            op_name = 'PutBucketResourcePoolBucketGroup',  # 操作名称,这里是指定将存储空间添加到资源池存储空间组的操作
            method = 'PUT',  # HTTP方法类型,此处为PUT,表示更新资源
            parameters = {
                'resourcePoolBucketGroup': 'example-group',  # 存储空间组的唯一标识符,用于区分不同的存储空间组
                'resourcePool': 'example-resource-pool',               # 资源池的唯一标识符,用于区分不同的资源池
            },
            headers = None,  # 请求头信息,如果不需要特殊设置则可以为None
            body = None,  # 请求体,由于是PUT请求且无需传递额外数据,因此为None
            bucket = 'examplebucket',  # 目标存储空间的名称,表示要将该存储空间添加到指定的资源池存储空间组
        )
    
        # 调用客户端的invoke_operation方法执行请求,并接收响应
        resp = client.invoke_operation(req)
    
        # 打印响应的状态码
        print(resp.status_code)
    
        # 打印响应的头部信息
        print(resp.headers)
    
        # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据
        print(resp.http_response.content)
    
    if __name__ == "__main__":
        PutBucketResourcePoolBucketGroup()
  2. 通过本地XML配置文件(qos.xml)配置资源池内指定BucketGroup的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>20</TotalUploadBandwidth>
      <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>10</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>30</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  3. BucketGroup配置带宽。

    import alibabacloud_oss_v2 as oss
    
    def PutResourcePoolBucketGroupQoSInfo():
        # 从环境变量中加载凭证信息,用于身份验证
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # 加载默认配置并获取配置对象
        cfg = oss.config.load_default()
    
        # 设置凭证提供者
        cfg.credentials_provider = credentials_provider
    
        # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
        cfg.region = "cn-hangzhou"
    
        # 使用配置对象初始化OSS客户端
        client = oss.Client(cfg)
    
        # 初始化qos_xml_body为空字符串
        qos_xml_body = ""
    
        # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中
        with open('qos.xml', 'r') as qos_file:
            qos_xml_body = qos_file.read()
    
        # 构造一个操作输入请求对象,用于设置资源池存储空间组的QoS信息
        req = oss.OperationInput(
            op_name = 'PutResourcePoolBucketGroupQoSInfo',  # 操作名称,这里是指定设置资源池存储空间组QoS信息的操作
            method = 'PUT',  # HTTP方法类型,此处为PUT,表示更新资源
            parameters = {
                'resourcePoolBucketGroupQosInfo': '',  # 参数列表,指定要设置的是资源池存储空间组QoS信息
                'resourcePool': 'example-resource-pool',           # 资源池的唯一标识符,用于区分不同的资源池
                'resourcePoolBucketGroup': 'example-group',  # 存储空间组的唯一标识符,用于区分不同的存储空间组
            },
            headers = None,  # 请求头信息,如果不需要特殊设置则可以为None
            body = qos_xml_body,  # 请求体,包含之前从'qos.xml'文件读取的内容
            bucket = None,  # 目标存储空间的名称,这里不需要指定具体的存储空间,因此为None
        )
    
        # 调用客户端的invoke_operation方法执行请求,并接收响应
        resp = client.invoke_operation(req)
    
        # 打印响应的状态码
        print(resp.status_code)
    
        # 打印响应的头部信息
        print(resp.headers)
    
        # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据
        print(resp.http_response.content)
    
    if __name__ == "__main__":
        PutResourcePoolBucketGroupQoSInfo()

API

调用PutResourcePoolBucketGroupQoSInfo按以下示例限制BucketGroup的带宽。

<QoSConfiguration>
  <TotalUploadBandwidth>20</TotalUploadBandwidth>
  <IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
  <ExtranetUploadBandwidth>10</ExtranetUploadBandwidth>
  <TotalDownloadBandwidth>30</TotalDownloadBandwidth>
  <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
  <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
</QoSConfiguration>

配置资源池请求者带宽上限

多个RAM用户访问同一资源池的不同Bucket,需要限制各自带宽上限,防止某用户独占资源池带宽。

控制台

  1. 查看RAM用户IDRAM角色ID

  2. 资源池QoS页面,单击目标资源池名称。在资源池请求者列表页签,单击目标RAM用户或者RAM角色右侧的修改流控配置,按照要求设置资源池请求者带宽。

ossutil

使用前,需安装ossutil

  1. 通过本地XML配置文件(qos.xml)为RAM用户或者RAM角色配置访问资源池的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>50</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>50</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>200</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>150</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 查看RAM用户IDRAM角色ID

  3. RAM用户(UID266xxxx)添加以上带宽配置。

    ossutil api invoke-operation --op-name put-resource-pool-requester-qos-info --method PUT --parameters resourcePool=examplepool --parameters qosRequester=266xxxx --parameters requesterQosInfo --body=file://qos.xml
  4. (可选)列举资源池所有RAM用户的带宽配置。

    ossutil api invoke-operation --op-name list-resource-pool-requester-qos-infos --method GET --parameters resourcePool=examplePool  --parameters requesterQosInfo

SDK

目前仅支持通过Python SDK V2Go SDK V2限制RAM用户或RAM角色访问资源池的带宽上限。

  1. 通过本地qos.xml文件配置指定RAM用户或RAM角色访问资源池的带宽上限。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>50</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>50</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>200</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>150</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth>
    </QoSConfiguration>
  2. 查看RAM用户IDRAM角色ID

  3. RAM用户或RAM角色设置以上带宽配置。

    import alibabacloud_oss_v2 as oss
    
    def PutResourcePoolRequesterQoSInfo():
        # 从环境变量中加载凭证信息,用于身份验证
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # 加载默认配置并获取配置对象
        cfg = oss.config.load_default()
    
        # 设置凭证提供者
        cfg.credentials_provider = credentials_provider
    
        # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
        cfg.region = "cn-hangzhou"
    
        # 使用配置对象初始化OSS客户端
        client = oss.Client(cfg)
    
        # 初始化qos_xml_body为空字符串
        qos_xml_body = ""
    
        # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中
        with open('qos.xml', 'r') as qos_file:
            qos_xml_body = qos_file.read()
    
        # 构造一个操作输入请求对象,用于设置资源池请求者的QoS信息
        req = oss.OperationInput(
            op_name = 'PutResourcePoolRequesterQoSInfo',  # 操作名称,这里是指定设置资源池请求者QoS信息的操作
            method = 'PUT',  # HTTP方法类型,此处为PUT,表示更新资源
            parameters = {
                'requesterQosInfo': '',  # 参数列表,指定要设置的是请求者QoS信息
                'resourcePool': 'example-resource-pool',  # 资源池的唯一标识符,用于区分不同的资源池
                'qosRequester': '2598732222222xxxx',  # 请求者的唯一标识符,用于区分不同的请求者
            },
            headers = None,  # 请求头信息,如果不需要特殊设置则可以为None
            body = qos_xml_body,  # 请求体,包含之前从'qos.xml'文件读取的内容
            bucket = None,  # 目标存储空间的名称,这里不需要指定具体的存储空间,因此为None
        )
    
        # 调用客户端的invoke_operation方法执行请求,并接收响应
        resp = client.invoke_operation(req)
    
        # 打印响应的状态码
        print(resp.status_code)
    
        # 打印响应的头部信息
        print(resp.headers)
    
        # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据
        print(resp.http_response.content)
    
    if __name__ == "__main__":
        PutResourcePoolRequesterQoSInfo()

API

  1. 查看RAM用户IDRAM角色ID

  2. 调用PutResourcePoolRequesterQoSInfo按以下示例限制RAM用户或RAM角色访问资源池的带宽。

    <QoSConfiguration>
      <TotalUploadBandwidth>100</TotalUploadBandwidth>
      <IntranetUploadBandwidth>50</IntranetUploadBandwidth>
      <ExtranetUploadBandwidth>50</ExtranetUploadBandwidth>
      <TotalDownloadBandwidth>200</TotalDownloadBandwidth>
      <IntranetDownloadBandwidth>150</IntranetDownloadBandwidth>
      <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth>
    </QoSConfiguration>

配置优先级流控

适合需要保障核心业务最小带宽,在资源竞争时优先满足高优先级对象的场景。

配置资源池优先级

资源池中有多个Bucket,需要确保核心业务Bucket在带宽紧张时仍能获得足够带宽。

ossutil

  1. 创建优先级配置文件priority-qos.xml

    <PriorityQosConfiguration>
      <PriorityCount>3</PriorityCount>
      <DefaultPriorityLevel>1</DefaultPriorityLevel>
      
      <DefaultGuaranteedQosConfiguration>
        <TotalUploadBandwidth>10</TotalUploadBandwidth>
        <IntranetUploadBandwidth>5</IntranetUploadBandwidth>
        <ExtranetUploadBandwidth>5</ExtranetUploadBandwidth>
        <TotalDownloadBandwidth>20</TotalDownloadBandwidth>
        <IntranetDownloadBandwidth>10</IntranetDownloadBandwidth>
        <ExtranetDownloadBandwidth>10</ExtranetDownloadBandwidth>
      </DefaultGuaranteedQosConfiguration>
      
      <QosPriorityLevelConfiguration>
        <PriorityLevel>3</PriorityLevel>
        <GuaranteedQosConfiguration>
          <TotalUploadBandwidth>50</TotalUploadBandwidth>
          <TotalDownloadBandwidth>80</TotalDownloadBandwidth>
          <ExtranetUploadBandwidth>30</ExtranetUploadBandwidth>
          <IntranetUploadBandwidth>20</IntranetUploadBandwidth>
          <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth>
          <IntranetDownloadBandwidth>30</IntranetDownloadBandwidth>
        </GuaranteedQosConfiguration>
        <Subjects>
          <Bucket>critical-bucket</Bucket>
          <BucketGroup>core-group</BucketGroup>
        </Subjects>
      </QosPriorityLevelConfiguration>
      
      <QosPriorityLevelConfiguration>
        <PriorityLevel>2</PriorityLevel>
        <GuaranteedQosConfiguration>
          <TotalUploadBandwidth>30</TotalUploadBandwidth>
          <TotalDownloadBandwidth>50</TotalDownloadBandwidth>
          <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
          <IntranetUploadBandwidth>10</IntranetUploadBandwidth>
          <ExtranetDownloadBandwidth>30</ExtranetDownloadBandwidth>
          <IntranetDownloadBandwidth>20</IntranetDownloadBandwidth>
        </GuaranteedQosConfiguration>
        <Subjects>
          <Bucket>important-bucket</Bucket>
        </Subjects>
      </QosPriorityLevelConfiguration>
    </PriorityQosConfiguration>
  2. 应用配置。

    ossutil api invoke-operation --op-name put-resource-pool-priority-qos-configuration --method PUT --parameters resourcePool=hz-rp-03 --parameters priorityQos --body=file://priority-qos.xml
  3. 获取并验证配置。

    ossutil api invoke-operation --op-name get-resource-pool-priority-qos-configuration --method GET --parameters resourcePool=hz-rp-03 --parameters priorityQos

SDK

package main

import (
	"bytes"
	"context"
	"crypto/md5"
	"encoding/base64"
	"fmt"
	"os"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func PutResourcePoolPriorityQosConfiguration() {
	// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
	var region = "cn-hangzhou"

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 定义资源池名称
	resourcePool := "hz-rp-01"

	// 读取优先级QoS配置文件内容
	qosConf, err := os.ReadFile("priority-qos.xml")
	if err != nil {
		// 如果读取QoS配置文件时发生错误,则打印错误信息并退出程序
		fmt.Printf("failed to read qos.xml: %v\n", err)
		os.Exit(1)
	}

	// 计算输入数据的MD5值,并将其转换为Base64编码字符串
	calcMd5 := func(input []byte) string {
		if len(input) == 0 {
			return "1B2M2Y8AsgTpgAmY7PhCfg=="
		}
		h := md5.New()
		h.Write(input)
		return base64.StdEncoding.EncodeToString(h.Sum(nil))
	}

	// 创建操作输入参数,包括操作名称、方法类型、参数等
	input := &oss.OperationInput{
		OpName: "PutResourcePoolPriorityQoSConfiguration", // 操作名称
		Method: "PUT",                                     // HTTP方法类型
		Parameters: map[string]string{
			"priorityQos":  "",           // 优先级QoS信息相关参数
			"resourcePool": resourcePool, // 资源池名称
		},
		Headers: map[string]string{
			"Content-MD5": calcMd5(qosConf), // 设置请求体的MD5校验码,用于验证数据完整性
		},
		Body:   bytes.NewReader(qosConf), // 请求体,包含QoS配置内容
		Bucket: nil,                      // 此操作不针对特定存储空间
	}

	// 执行操作请求,并接收响应结果或错误
	res, err := client.InvokeOperation(context.TODO(), input)
	if err != nil {
		// 如果发生错误,则打印错误信息并退出程序
		fmt.Printf("invoke operation got error: %v\n", err)
		os.Exit(1)
	}

	// 打印操作结果
	fmt.Println("The result of PutResourcePoolPriorityQoSConfiguration:", res.Status)
}

API

PutResourcePoolPriorityQosConfiguration

配置资源池请求者优先级

多租户SaaS平台,不同等级的客户访问同一资源池,需要为VIP客户保障带宽,普通客户共享剩余资源。

ossutil

  1. 创建请求者优先级配置文件requester-priority-qos.xml

    <PriorityQosConfiguration>
      <PriorityCount>3</PriorityCount>
      <DefaultPriorityLevel>1</DefaultPriorityLevel>
      
      <DefaultGuaranteedQosConfiguration>
        <TotalUploadBandwidth>10</TotalUploadBandwidth>
        <IntranetUploadBandwidth>5</IntranetUploadBandwidth>
        <ExtranetUploadBandwidth>5</ExtranetUploadBandwidth>
        <TotalDownloadBandwidth>20</TotalDownloadBandwidth>
        <IntranetDownloadBandwidth>10</IntranetDownloadBandwidth>
        <ExtranetDownloadBandwidth>10</ExtranetDownloadBandwidth>
      </DefaultGuaranteedQosConfiguration>
      
      <QosPriorityLevelConfiguration>
        <PriorityLevel>3</PriorityLevel>
        <GuaranteedQosConfiguration>
          <TotalUploadBandwidth>60</TotalUploadBandwidth>
          <TotalDownloadBandwidth>100</TotalDownloadBandwidth>
          <ExtranetUploadBandwidth>40</ExtranetUploadBandwidth>
          <IntranetUploadBandwidth>20</IntranetUploadBandwidth>
          <ExtranetDownloadBandwidth>60</ExtranetDownloadBandwidth>
          <IntranetDownloadBandwidth>40</IntranetDownloadBandwidth>
        </GuaranteedQosConfiguration>
        <Subjects>
          <Requester>123456789012****</Requester>
          <Requester>234567890123****</Requester>
        </Subjects>
      </QosPriorityLevelConfiguration>
      
      <QosPriorityLevelConfiguration>
        <PriorityLevel>2</PriorityLevel>
        <GuaranteedQosConfiguration>
          <TotalUploadBandwidth>30</TotalUploadBandwidth>
          <TotalDownloadBandwidth>50</TotalDownloadBandwidth>
          <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
          <IntranetUploadBandwidth>10</IntranetUploadBandwidth>
          <ExtranetDownloadBandwidth>30</ExtranetDownloadBandwidth>
          <IntranetDownloadBandwidth>20</IntranetDownloadBandwidth>
        </GuaranteedQosConfiguration>
        <Subjects>
          <Requester>345678901234****</Requester>
        </Subjects>
      </QosPriorityLevelConfiguration>
    </PriorityQosConfiguration>
  2. 应用配置

    ossutil api invoke-operation --op-name put-resource-pool-requester-priority-qos-configuration --method PUT --parameters resourcePool=hz-rp-03 --parameters requesterPriorityQos --body=file://requester-priority-qos.xml
  3. (可选)获取并验证配置。

    ossutil api invoke-operation --op-name get-resource-pool-requester-priority-qos-configuration --method GET --parameters resourcePool=hz-rp-03 --parameters requesterPriorityQos

SDK

package main

import (
	"bytes"
	"context"
	"crypto/md5"
	"encoding/base64"
	"fmt"
	"os"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func PutResourcePoolRequesterPriorityQosConfiguration() {
	// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
	var region = "cn-hangzhou"

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 定义资源池名称
	resourcePool := "hz-rp-01"

	// 读取请求者优先级QoS配置文件内容
	qosConf, err := os.ReadFile("requester-priority-qos.xml")
	if err != nil {
		// 如果读取QoS配置文件时发生错误,则打印错误信息并退出程序
		fmt.Printf("failed to read qos.xml: %v\n", err)
		os.Exit(1)
	}

	// 计算输入数据的MD5值,并将其转换为Base64编码字符串
	calcMd5 := func(input []byte) string {
		if len(input) == 0 {
			return "1B2M2Y8AsgTpgAmY7PhCfg=="
		}
		h := md5.New()
		h.Write(input)
		return base64.StdEncoding.EncodeToString(h.Sum(nil))
	}

	// 创建操作输入参数,包括操作名称、方法类型、参数等
	input := &oss.OperationInput{
		OpName: "PutResourcePoolRequesterPriorityQoSConfiguration", // 操作名称
		Method: "PUT",                                              // HTTP方法类型
		Parameters: map[string]string{
			"requesterPriorityQos": "", // 请求者优先级QoS信息相关参数
			"resourcePool":         resourcePool, // 资源池名称
		},
		Headers: map[string]string{
			"Content-MD5": calcMd5(qosConf), // 设置请求体的MD5校验码,用于验证数据完整性
		},
		Body:   bytes.NewReader(qosConf), // 请求体,包含QoS配置内容
		Bucket: nil,                      // 此操作不针对特定存储空间
	}

	// 执行操作请求,并接收响应结果或错误
	res, err := client.InvokeOperation(context.TODO(), input)
	if err != nil {
		// 如果发生错误,则打印错误信息并退出程序
		fmt.Printf("invoke operation got error: %v\n", err)
		os.Exit(1)
	}

	// 打印操作结果
	fmt.Println("The result of PutResourcePoolRequesterPriorityQoSConfiguration:", res.Status)
}

API

PutResourcePoolRequesterPriorityQosConfiguration

监控与告警

监控带宽使用

在业务运行期间,可以在云监控-对象存储OSS资源池,实时查看资源池内关键业务的带宽使用情况,确保资源分配合理且业务运行稳定。

设置带宽告警

为确保关键业务稳定运行,可以通过云监控服务创建告警规则,当带宽使用率超过 80% 时自动触发告警,便于及时调整带宽配置应对业务高峰。

应用于生产环境

容量规划建议

1. 保底带宽之和建议小于资源池总带宽的50%。

预留50%以上的弹性空间用于动态调度,可有效提升资源池整体带宽利用率。

推荐配置:
资源池总带宽:100Gbps
优先级3保底:20Gbps
优先级2保底:20Gbps
优先级1保底:10Gbps
总计:50Gbps(预留50Gbps弹性空间)

2. 优先级数量建议3-5

过多优先级增加管理复杂度,建议根据业务重要性分为3-5级:

  • 核心业务(优先级1-2)

  • 重要业务(优先级3)

  • 普通业务(优先级4-5)

3. 阈值流控上限应高于优先级保底

确保高优先级对象在资源充足时能够使用更多带宽:

建议配置:
优先级流控:Bucket A 保底50Gbps
阈值流控:Bucket A 最大80Gbps
实际可用:50-80Gbps(至少50,最多80)

最佳实践

场景1:视频点播平台

  • 直播流:优先级3,保底50Gbps

  • 点播内容:优先级1,保底20Gbps

  • CDN回源:阈值流控限制最大100Gbps

场景2:多租户SaaS平台

  • 企业版客户:优先级3,分配保底带宽

  • 免费版客户:优先级1,共享剩余资源

  • 单租户上限:阈值流控防止单租户过度占用

场景3:数据湖分析

  • 实时分析:优先级2,保底30Gbps

  • 离线分析:优先级1,保底20Gbps

  • 归档数据:阈值流控限制最大10Gbps

风险防范

1. 定期审查配额使用情况

通过云监控查看各对象的带宽使用趋势,及时调整配额:

  • 高优先级对象保底带宽满足率持续<95%,考虑增加保底或降低低优先级保底

  • 低优先级对象长期无法使用,考虑降低高优先级保底或扩容资源池

2. 设置多级告警

  • 警告级(80%):提前预警,准备扩容方案

  • 严重级(90%):立即处理,启动应急预案

3. 避免配置冲突

  • 保底带宽之和不能超过资源池总带宽

  • 阈值流控上限应高于优先级保底

  • Bucket同属BucketGroup时,按BucketGroup优先级生效

4. 变更与回滚

  • 重要变更前,在测试环境验证配置

  • 保存当前配置,便于快速回滚

  • 业务低峰期执行变更操作

配额与限制

限制项

配额/限制

资源池

单个地域最多100个资源池

单个资源池最多100Bucket

单个资源池最多100BucketGroup

单个资源池最多为300个请求者配置流控

BucketGroup

名称限制3-30个字符

只支持小写字母、数字和短横线

优先级流控

优先级数量:3-10

优先级等级:正整数,≥1且≤优先级总数

保底带宽之和≤资源池总带宽

若无默认保底,则每个优先级都必须配置保底带宽

带宽参数

正整数:具体限制值(单位Gbps)

-1:不限制(共享资源池带宽)

0:禁止该类型流量(谨慎使用)

配置后生效延迟

5分钟内