すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:サーバーレスインスタンスの RCU 構成をスケジュール設定する

最終更新日:Mar 29, 2026

Serverless ApsaraDB RDS for MySQL では、CPU 利用率およびメモリ使用量に基づいて、RDS Capacity Units (RCU) を自動的にスケールアップします。99.8 % のケースにおいて、スケールアップは数秒以内(ホスト内)で完了します。ただし、現在のホストが十分なリソースを提供できない場合、ホスト間スケールアップが必要となり、所要時間は 3~5 分かかり、ワークロードに影響を及ぼす可能性があります。この影響を既知の高負荷期間に及ぼさないよう、トラフィックピーク前に RCU の最小値を事前に上昇させる定期タスクを設定してください。

仕組み

自動スケーリングは、CPU 利用率またはメモリ使用量が 60 %~80 % に達した際にスケールアップをトリガーします。スケールアップには以下の 2 種類があります:

スケールアップの種類所要時間接続への影響発生頻度
ホスト内数秒なし99.8 % のケース
ホスト間3~5 分ワークロードに影響を及ぼす可能性ありホストが十分なリソースを提供できない場合

MinCapacityMaxCapacity を同一の値に設定すると、指定されたタイムウィンドウ内でインスタンスの容量が固定され、その期間中のスケールアップリスクが解消されます。

定期タスクは、ModifyDBInstanceSpec API を呼び出して、高負荷期間開始前に MinCapacity を上昇させ、終了後に元の値に復元します。

ユースケース

  • 既知のピーク期間を保護する:予測可能な高負荷期間(例:バッチジョブ実行時や営業時間帯のピーク)中に、固定範囲の RCU を確保することで、ホスト間スケールアップのリスクを回避します。

シナリオ例

08:00~09:00 のピーク時間帯に、4~8 RCU を確保します。ホスト間スケールアップには最大 5 分かかるため、ピーク開始の 10 分前(07:50)に最小値を上昇させます。ピーク終了後(09:00)にデフォルト範囲(0.5~8 RCU)へ復元します。

image

以下の 2 つの定期タスクでは、次のパラメーターを使用します:

実行時刻MinCapacityMaxCapacity効果
07:5048ピーク開始の 10 分前に最小値を上昇。必要に応じてホスト間スケールアップを実行
09:000.58ピーク期間終了後にデフォルト範囲へ復元

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

  • ModifyDBInstanceSpec API を呼び出す権限を持つ RAM ユーザーが存在すること。詳細については、「RAM ユーザーの作成と権限付与」をご参照ください。

  • スケジューラを実行するマシン上で、環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されていること。詳細については、「環境変数の設定」をご参照ください。

Python によるタスクのスケジュール設定

本例では、APScheduler を使用し、BlockingScheduler と cron トリガーを組み合わせます。

準備

  1. Python のインストールおよびAlibaba Cloud SDK の依存関係のインストールを行います。

  2. APScheduler をインストールします:

    pip install apscheduler
  3. ModifyDBInstanceSpec の SDK サンプルプロジェクトをダウンロードします:

    1. ModifyDBInstanceSpec のページを OpenAPI Explorer で開きます。

    2. パラメーター タブで、以下の値を設定します:

      パラメーター
      DBInstanceIdrm-bp1t8v93k6e15****
      PayTypeServerless
      DirectionServerless
      MaxCapacity8.0
      MinCapacity0.5
      AutoPausefalse
      SwitchForcetrue
    3. SDK サンプルコード タブで、言語 ドロップダウンから Python を選択し、プロジェクトのダウンロード をクリックします。注: SDK V2.0 のサンプルプロジェクトをダウンロードしてください。

    4. パッケージを解凍し、_alibabacloud_sample_ ディレクトリを開きます。

定期タスクの設定

APScheduler の定期タスクの内容を sample.py ファイルに追加し、cron トリガーで実行時刻を設定します。cron トリガー hour=7, minute=50 は毎日 07:50 に実行され、hour=9, minute=0 は毎日 09:00 に実行されます。

# -*- coding: utf-8 -*-
# このファイルは自動生成されたものです。編集しないでください。ご協力ありがとうございます。
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:
        """
        AccessKey ID および AccessKey Secret を使用してクライアントを初期化します。
        @return: クライアント
        @throws Exception
        """
        # プロジェクトコードが漏洩すると、AccessKey ペアも漏洩し、アカウント内のリソースのセキュリティが脅かされる可能性があります。以下のサンプルコードは参考用です。
        # セキュリティ上の理由から、Security Token Service (STS) が提供する一時的なアクセス認証情報を使用してください。詳細については、https://www.alibabacloud.com/help/ja/sdk/developer-reference/v2-manage-php-access-credentials をご参照ください。
        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']
        )
        # エンドポイントの詳細については、https://api.aliyun.com/product/Rds をご参照ください。
        config.endpoint = f'rds.aliyuncs.com'
        return Rds20140815Client(config)

    # ModifyDBInstanceSpec API を呼び出して、サーバーレス RDS インスタンスの構成を更新します。
    @staticmethod
    def modify_db_instance_spec(config: Dict[str, float]) -> None:
        """
        DB インスタンス仕様の変更 — コアとなるタスク関数
        """
        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:
        # スケジューラを初期化します。
        scheduler = BlockingScheduler()

        # 08:00~09:00 のピーク時の RCU 範囲:min=4、max=8。
        # ホスト間スケールアップが完了するよう、ピーク開始の 10 分前に 07:50 にスケジュール設定します。
        config_8am = {
            'max_capacity': 8,
            'min_capacity': 4,
            'auto_pause': False,
            'switch_force': True
        }

        # ピーク終了後のデフォルト RCU 範囲:min=0.5、max=8。
        config_9am = {
            'max_capacity': 8,
            'min_capacity': 0.5,
            'auto_pause': False,
            'switch_force': True
        }

        # cron トリガーを使用して定期タスクを作成します。
        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:])

rm-bp1t8v93k6e15**** をご利用の実際のインスタンス ID に置き換えてください。hour および minute の値は、scheduler.add_job 内の 24 時間表記に従います。ご利用のピーク期間に合わせて調整してください。

Java によるタスクのスケジュール設定

本例では、Spring Schedule を使用します。Java 1.8 以降が必要です。

準備

  1. RAM ユーザーおよび環境変数の前提条件 を完了します。

  2. demo.zip サンプルパッケージをダウンロードし、ローカルマシンに解凍します。

定期タスクの設定

ScheduleTask.java を開き、cron 式およびパラメーターをご利用のピーク期間に合わせて更新します。cron のフォーマットは "秒 分 時 日 月 曜日" です。たとえば、@Scheduled(cron = "0 0 8 * * ? ") は毎日 08:00:00 に実行されます。

以下のコードでは、07:50 に RCU 範囲を [4, 8] に設定し、09:00 に [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インスタンスのリージョン IDcn-hangzhou
DBInstanceIdインスタンス IDrm-bp1t8v93k6e15****
PayType課金方法Serverless
Direction仕様変更の種類Serverless
MaxCapacityRCU の最大数8.0
MinCapacityRCU の最小数0.5
AutoPause自動起動・停止機能を有効にするかどうかfalse
SwitchForce強制スケーリングを有効にするかどうかtrue

cron 式の構文については、「Spring @Scheduled アノテーションのリファレンス」をご参照ください。

次のステップ