釋放 AI 的強大力量

100 萬免費代幣

88% 價格優惠

立即啟用
本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

定時配置Serverless執行個體的RCU

更新時間:2025-02-26 13:01

Serverless執行個體RCUAuto Scaling的耗時通常為秒級,極小機率下可能因為跨機彈性擴容而耗時3~5分鐘。如果您對特定時段的穩定性有嚴格要求,您可以定時配置Serverless執行個體的RCU,提前增加RCU數量。本文將介紹如何對RCU的範圍進行周期性配置。

使用情境

  • Serverless執行個體會根據CPU和記憶體的負載情況進行Auto Scaling。自動彈性擴容的條件為CPU或記憶體使用量率達到60%~80%的閾值範圍。若在特定時段對CPU或記憶體的效能穩定性有較高要求,可提前手動調整RCU的下限配置。

  • 彈性擴容的方式分為本地彈性擴容和跨機彈性擴容兩種。其中本地彈性擴容的耗時為秒級,跨機彈性擴容的耗時約為3~5分鐘。在99.8%的情境下,本地的秒級彈性擴容可以滿足Serverless的彈性擴容需求。然而,在本地資源不足的情況下,Serverless執行個體的彈性擴容需要跨機進行。由於跨機需要的時間較長,可能會對業務造成一定程度的影響。在特定時段內,為避免因自動彈性擴容未能及時完成而造成的影響,建議提前將RCU的上限和下限設定為相同的數值。

解決方案

使用定時任務調用ModifyDBInstanceSpec - 變更RDS執行個體API介面,在特定時段修改RCU的上下限,特定時段結束後恢複到預設的RCU上下限。

使用樣本

如果需要在特定時段提升RCU下限,建議在該時段前10分鐘,定時提升RCU下限,為可能出現的跨機情況預留一定時間,以確保特定時段內執行個體的穩定性。

例如,某項業務在早高峰時間08:00~09:00希望保證4~8 RCU的配置,可以在07:50分將RCU的下限提升至4,在09:00再恢複到0.5~8 RCU的預設配置。

image
Python樣本
Java樣本

本樣本使用APScheduler配置定時任務。

  1. 完成RAM授權、準備Python環境、配置環境變數、安裝環境依賴等操作。

    1. 建立RAM使用者並完成授權

    2. 準備Python環境

    3. 配置環境變數

    4. 安裝依賴

  2. 開啟命令列視窗執行如下命令,安裝APScheduler。

    pip install apscheduler
  3. 下載範例程式碼。

    1. 訪問ModifyDBInstanceSpec,進入該介面在OpenAPI門戶的調試地址。

    2. 參數配置頁簽,配置如下參數。

    3. 參數

      描述

      取值

      DBInstanceId

      執行個體 ID。

      rm-bp1t8v93k6e15****

      PayType

      執行個體當前的付費類型。

      Serverless

      Direction

      執行個體變更配置類型。

      Serverless

      MaxCapacity

      RCU(Rds Capacity Unit)自動擴縮範圍的上限。

      8.0

      MinCapacity

      RCU(Rds Capacity Unit)自動擴縮範圍的下限。

      0.5

      AutoPause

      是否開啟Serverless執行個體的智能暫停和啟動。

      false

      SwitchForce

      是否開啟Serverless執行個體的強制擴縮容。

      true

    4. 在右側的SDK樣本頁簽,選擇Python語言,單擊下載完整工程按鈕,下載範例程式碼包。

    5. 說明

      建議下載SDK V2.0版本樣本工程。

    6. 本地解壓並進入alibabacloud_sample目錄。

  4. 修改代碼,配置定時任務。

    修改sample.py,增加APScheduler定時任務的內容,使用Cron觸發器以設定定時任務的執行時間。例如,scheduler.add_job(my_scheduled_job, 'cron', hour=8, minute=0)代表每天的08時00分00秒。若您計劃每日07:50設定RCU範圍為[4, 8],並在每日09:00將RCU範圍恢複為[0.5, 8],範例程式碼如下。

    sample.py

    # -*- coding: utf-8 -*-
    # This file is auto-generated, don't edit it. Thanks.
    import os
    import sys
    from typing import List, Dict
    from alibabacloud_rds20140815.client import Client as Rds20140815Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_rds20140815 import models as rds_20140815_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_console.client import Client as ConsoleClient
    from alibabacloud_tea_util.client import Client as UtilClient
    from apscheduler.schedulers.blocking import BlockingScheduler
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> Rds20140815Client:
            """
            使用AK&SK初始化帳號Client
            @return: Client
            @throws Exception
            """
            # 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
            # 建議使用更安全的 STS 方式。
            config = open_api_models.Config(
                # 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            # Endpoint 請參考 https://api.aliyun.com/product/Rds
            config.endpoint = f'rds.aliyuncs.com'
            return Rds20140815Client(config)
    
        # 調用API修改執行個體serverless配置。
        @staticmethod
        def modify_db_instance_spec(config: Dict[str, float]) -> None:
            """
            Modify DB instance spec - the core task function
            """
            client = Sample.create_client()
            serverless_configuration = rds_20140815_models.ModifyDBInstanceSpecRequestServerlessConfiguration(
                max_capacity=config['max_capacity'],
                min_capacity=config['min_capacity'],
                auto_pause=config['auto_pause'],
                switch_force=config['switch_force']
            )
            modify_dbinstance_spec_request = rds_20140815_models.ModifyDBInstanceSpecRequest(
                dbinstance_id='rm-bp1t8v93k6e15****',
                direction='Serverless',
                pay_type='Serverless',
                serverless_configuration=serverless_configuration
            )
            runtime = util_models.RuntimeOptions(
                read_timeout=50000,
                connect_timeout=50000
            )
            try:
                resp = client.modify_dbinstance_spec_with_options(modify_dbinstance_spec_request, runtime)
                ConsoleClient.log(UtilClient.to_jsonstring(resp))
            except Exception as error:
                # 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
                print(error.message)
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
        @staticmethod
        def main(args: List[str]) -> None:
            """
    
            :rtype: object
            """
            # 初始化Scheduler
            scheduler = BlockingScheduler()
    
            # 配置8點的serverless參數
            config_8am = {
                'max_capacity': 8,
                'min_capacity': 4,
                'auto_pause': False,
                'switch_force': True
            }
    
            # 配置9點的serverless參數
            config_9am = {
                'max_capacity': 8,
                'min_capacity': 0.5,
                'auto_pause': False,
                'switch_force': True
            }
    
            # 配置定時任務
            scheduler.add_job(Sample.modify_db_instance_spec, 'cron', hour=7, minute=50, args=[config_8am])
            scheduler.add_job(Sample.modify_db_instance_spec, 'cron', hour=9, minute=0, args=[config_9am])
    
            try:
                scheduler.start()
            except (KeyboardInterrupt, SystemExit):
                pass
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    
    

本樣本使用Spring Schedule配置定時任務。

說明

本樣本需要安裝Java 1.8以上開發環境。

  1. 完成RAM授權、配置環境變數等操作。

    1. 建立RAM使用者並完成授權

    2. 配置環境變數

  2. 下載樣本程式並在本地解壓。

  3. 修改ScheduleTask.java的內容,根據實際情況配置定時任務。

    配置Cron運算式以設定定時任務的執行時間。其中,cron = "秒 分 時 日 月 周",詳情請參見Cron

    例如,@Scheduled(cron = "0 0 8 * * ? ") 代表每天的08時00分00秒。若您計劃每日07:50設定RCU範圍為[4, 8],並在每日09:00將RCU範圍恢複為[0.5, 8],範例程式碼如下。

    ScheduleTask.java

    package com.example.demo;
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ScheduleTask {
      
        @Scheduled(cron = "0 50 7 * * ? ")
        public void scheduleTask8am() {
            ModifySpecParams params = new ModifySpecParams();
            params.setRegionId("cn-hangzhou");
            params.setDBInstanceId("rm-bp1t8v93k6e15****");
            params.setDirection("Serverless");
            params.setPayType("Serverless");
            params.setAutoPause(false);
            params.setSwitchForce(true);
            params.setMaxCapacity(8);
            params.setMinCapacity(4);
            ModifyDBInstanceSpec.modify(params);
        }
    
        @Scheduled(cron = "0 0 9 * * ? ")
        public void scheduleTask9am() {
            ModifySpecParams params = new ModifySpecParams();
            params.setRegionId("cn-hangzhou");
            params.setDBInstanceId("rm-bp1t8v93k6e15****");
            params.setDirection("Serverless");
            params.setPayType("Serverless");
            params.setAutoPause(false);
            params.setSwitchForce(true);
            params.setMaxCapacity(8);
            params.setMinCapacity(0.5);
            ModifyDBInstanceSpec.modify(params);
        }
    }

    部分參數的含義如下,請用實際數值進行替換。

    參數

    描述

    樣本

    RegionId

    執行個體所屬地區。

    cn-hangzhou

    DBInstanceId

    執行個體ID。

    rm-bp1t8v93k6e15****

    PayType

    執行個體當前的付費類型。

    Serverless

    Direction

    執行個體變更配置類型。

    Serverless

    MaxCapacity

    RCU自動擴縮範圍的上限。

    8.0

    MinCapacity

    RCU自動擴縮範圍的下限。

    0.5

    AutoPause

    是否開啟Serverless執行個體的智能暫停和啟動。

    false

    SwitchForce

    是否開啟Serverless執行個體的強制擴縮容。

    true

  • 本頁導讀 (1, M)
  • 使用情境
  • 解決方案
  • 使用樣本
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare