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

ApsaraDB RDS:サーバーレスRDSインスタンスのRCU数を調整するためのスケジュールタスクの設定

最終更新日:Aug 27, 2024

ほとんどの場合、サーバーレスApsaraDB RDS for MySQLインスタンスのRDS容量単位 (RCU) スケーリングは数秒以内に完了します。 いくつかのケースでは、RCUスケーリングは、ホスト間スケールアップのために完了するのに3〜5分を必要とし得る。 特定の期間内の安定性に関する厳しい要件がある場合は、スケジュールされたタスクを設定して、サーバーレスRDSインスタンスのRCUの数を調整できます。 このトピックでは、スケジュールされたタスクを設定してRCUの数を調整する方法について説明します。

シナリオ

  • システムは、CPU使用率とメモリ使用量に基づいて、サーバーレスRDSインスタンスで自動スケーリングを実行します。 CPU使用率またはメモリ使用率が60% 〜80% の範囲内にある場合、自動スケールアップがトリガーされます。 特定の期間内のCPUまたはメモリリソースの安定性に対する要件が高い場合は、事前にRCUの最小数を調整する必要があります。

  • ホスト内スケールアップとホスト間スケールアップがサポートされています。 ホスト内のスケールアップは数秒以内に完了でき、ホスト間のスケールアップは3〜5分以内に完了できます。 99.8% のシナリオでは、ホスト内のスケールアップがビジネス要件を満たすことができます。 サーバーレスRDSインスタンスが存在するホストが十分なリソースを提供できない場合は、ホスト間でRCUをスケールアップする必要があります。 ホスト間のスケールアップを完了するには長い時間が必要で、ワークロードに影響を与える可能性があります。 自動スケールアップの失敗による影響を防ぐために、特定の期間、RCUの最大数と最小数を同じ値に設定することを推奨します。

ソリューション

ModifyDBInstanceSpec操作を呼び出して、特定の期間内のRCUの最大数と最小数を変更するスケジュール済みタスクを作成します。 期間が経過した後、変更はロールバックされます。

特定の期間のRCUの最小数を増やす場合は、スケジュールされたタスクを作成して、その期間の10分前にRCUの最小数を増やすことをお勧めします。 ホスト間スケールアップが必要な場合は、ホスト間スケールアップを完了させ、一定期間内のインスタンスの安定性を確保します。

たとえば、08:00から09:00までのピーク時に4〜8個のRCUを予約する場合、07:50にRCUの最小数を4に増やし、09:00に0.5〜8個のRCUのデフォルト設定に復元できます。

image

Pythonのサンプルコード

このセクションでは、APSchedulerを使用してスケジュールタスクを構成する方法の例を示します。 詳細については、「ユーザーガイド」をご参照ください。

  1. 次の操作を完了します。

    1. RAMユーザーを作成し、RAMユーザーに権限を付与します

    2. Pythonのインストール

    3. 環境変数の設定

    4. 依存関係のインストール

  2. CLIを開き、次のコマンドを実行してAPSchedulerをインストールします。

    pip install apscheduler
  3. サンプルコードをダウンロードします。

    1. のデバッグページに移動します。 OpenAPI ExplorerのModifyDBInstanceSpec

    2. [パラメーター] タブで、次のパラメーターを設定します。

    3. パラメーター

      説明

      DBInstanceId

      インスタンス ID 。

      rm-bp1t8v93k6e15 ****

      PayType

      インスタンスの課金方法です。

      Serverless

      方向

      インスタンスの仕様変更タイプ。

      Serverless

      MaxCapacity

      RCUの最大数。

      8.0

      MinCapacity

      RCUの最小数。

      0.5

      自動一時停止

      サーバーレスRDSインスタンスの自動起動および停止機能を有効にするかどうかを指定します。

      false

      SwitchForce

      サーバーレスRDSインスタンスの強制スケーリング機能を有効にするかどうかを指定します。

      true

    4. [SDKサンプルコード] タブで、[Python] (言語用) を選択し、[プロジェクトのダウンロード] をクリックしてサンプルコードパッケージをダウンロードします。

    5. 説明

      SDK V2.0のサンプルプロジェクトをダウンロードすることを推奨します。

    6. オンプレミスデバイスでパッケージを解凍し、alibabacloud_sampleディレクトリに移動します。

  4. スケジュールされたタスクを設定するコードを変更します。

    APSchedulerスケジュールタスクの内容をsample.pyファイルに追加し、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:
            """
            Use your AccessKey ID and AccessKey secret to initialize a client.
            @return: Client
            @throws Exception
            """
            # If the project code is leaked, the AccessKey pair may be leaked and the security of resources within your account may be compromised. The following sample code is provided only for reference. 
            # For security purposes, we recommend that you use temporary access credentials that are provided by Security Token Service (STS). For more information, see https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-php-access-credentials. 
            config = open_api_models.Config(
                # Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured. ,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured. ,
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            # For more information about endpoints, visit https://api.aliyun.com/product/Rds.
            config.endpoint = f'rds.aliyuncs.com'
            return Rds20140815Client(config)
    
        # Call an API operation to modify the configuration of the serverless RDS instance. 
        @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:
                # Handle exceptions with caution in your actual business scenario. Do not ignore exceptions in your project. In this example, error messages are printed to the screen. 
                print(error.message)
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
        @staticmethod
        def main(args: List[str]) -> None:
            """
    
            :rtype: object
            """
            # Initialize the scheduler.
            scheduler = BlockingScheduler()
    
            # Configure the parameters of the serverless RDS instance to meet the requirements for 8:00.
            config_8am = {
                'max_capacity': 8,
                'min_capacity': 4,
                'auto_pause': False,
                'switch_force': True
            }
    
            # Configure the parameters of the serverless RDS instance to meet the requirements for 9:00.
            config_9am = {
                'max_capacity': 8,
                'min_capacity': 0.5,
                'auto_pause': False,
                'switch_force': True
            }
    
            # Create a scheduled task.
            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以降をインストールする必要があります。

  1. 次の操作を完了します。

    1. RAMユーザーを作成し、RAMユーザーに権限を付与します

    2. 環境変数の設定

    3. 依存関係のインストール

  2. サンプルパッケージをダウンロードし、オンプレミスデバイスに解凍します。

    サンプルパッケージの詳細については、「demo.zip」をご参照ください。

  3. ScheduleTask.javaの内容を変更し、ビジネス要件に基づいてスケジュールタスクを設定します。

    CRON式を設定して、スケジュールされたタスクの実行時間を指定します。 cron = "2分時間日月週" は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

    インスタンスのリージョン ID です。

    cn-hangzhou

    DBInstanceId

    インスタンス ID 。

    rm-bp1t8v93k6e15 ****

    PayType

    インスタンスの課金方法です。

    Serverless

    方向

    インスタンスの仕様変更タイプ。

    Serverless

    MaxCapacity

    RCUの最大数。

    8.0

    MinCapacity

    RCUの最小数。

    0.5

    自動一時停止

    サーバーレスRDSインスタンスの自動起動および停止機能を有効にするかどうかを指定します。

    false

    SwitchForce

    サーバーレスRDSインスタンスの強制スケーリング機能を有効にするかどうかを指定します。

    true