Serverless實例RCU彈性伸縮的耗時通常為秒級,極小概率下可能因為跨機彈性擴容而耗時3~5分鐘。如果您對特定時段的穩定性有嚴格要求,您可以定時配置Serverless實例的RCU,提前增加RCU數量。本文將介紹如何對RCU的范圍進行周期性配置。
使用場景
Serverless實例會根據CPU和內存的負載情況進行彈性伸縮。自動彈性擴容的條件為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的默認配置。
Python示例
本示例使用APScheduler配置定時任務。
完成RAM授權、準備Python環境、配置環境變量、安裝環境依賴等操作。
打開命令行窗口執行如下命令,安裝APScheduler。
pip install apscheduler
下載示例代碼。
訪問ModifyDBInstanceSpec,進入該接口在OpenAPI門戶的調試地址。
在參數配置頁簽,配置如下參數。
在右側的SDK示例頁簽,選擇Python語言,單擊下載完整工程按鈕,下載示例代碼包。
本地解壓并進入alibabacloud_sample目錄。
參數
描述
取值
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
說明建議下載SDK V2.0版本示例工程。
修改代碼,配置定時任務。
修改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],示例代碼如下。# -*- 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:])
Java示例
本示例使用Spring Schedule配置定時任務。
本示例需要安裝Java 1.8以上開發環境。
完成RAM授權、配置環境變量等操作。
下載示例程序并在本地解壓。
示例程序請參見demo.zip。
修改
ScheduleTask.java
的內容,根據實際情況配置定時任務。配置Cron表達式以設定定時任務的執行時間。其中,
cron = "秒 分 時 日 月 周"
,詳情請參見Cron。例如,
@Scheduled(cron = "0 0 8 * * ? ")
代表每天的08時00分00秒。若您計劃每日07:50設置RCU范圍為[4, 8],并在每日09:00將RCU范圍恢復為[0.5, 8],示例代碼如下。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