All Products
Search
Document Center

ApsaraDB RDS:Jadwalkan konfigurasi RCU untuk instans serverless

Last Updated:Mar 30, 2026

ApsaraDB RDS for MySQL versi serverless secara otomatis melakukan skalabilitas vertikal terhadap RDS Capacity Units (RCU) berdasarkan pemanfaatan CPU dan penggunaan memori. Dalam 99,8% kasus, proses skalabilitas vertikal selesai dalam hitungan detik (intra-host). Namun, jika host saat ini tidak dapat menyediakan sumber daya yang cukup, diperlukan skalabilitas vertikal antar-host—proses ini memakan waktu 3 hingga 5 menit dan dapat memengaruhi beban kerja Anda. Untuk mencegah gangguan selama periode sibuk yang telah diketahui, gunakan tugas terjadwal untuk menaikkan nilai minimum RCU sebelum puncak trafik.

Cara kerja

Auto scaling memicu skalabilitas vertikal ketika pemanfaatan CPU atau penggunaan memori mencapai 60%–80%. Terdapat dua jenis skalabilitas vertikal:

Scale-up TypeDurasiDampak koneksiFrekuensi
Intra-hostDetikTidak ada99,8% kasus
Inter-host3–5 menitDapat memengaruhi beban kerja AndaSaat host tidak dapat menyediakan sumber daya yang cukup

Mengatur MinCapacity dan MaxCapacity ke nilai yang sama akan mengunci instans pada kapasitas tetap selama periode tertentu, sehingga menghilangkan risiko skalabilitas vertikal selama periode tersebut.

Tugas terjadwal memanggil API ModifyDBInstanceSpec untuk menaikkan MinCapacity sebelum periode sibuk dimulai, lalu mengembalikan nilai aslinya setelah periode tersebut berakhir.

Kasus penggunaan

  • Lindungi periode puncak yang diketahui: Cadangkan rentang RCU tetap selama periode sibuk yang dapat diprediksi (misalnya, pekerjaan batch atau puncak jam kerja) untuk menghilangkan risiko skalabilitas vertikal antar-host.

Contoh skenario

Cadangkan 4–8 RCU selama satu jam puncak dari pukul 08.00 hingga 09.00. Karena skalabilitas vertikal antar-host dapat memakan waktu hingga 5 menit, naikkan nilai minimum 10 menit lebih awal—yaitu pukul 07.50. Kembalikan rentang default (0,5–8 RCU) pada pukul 09.00.

image

Dua pekerjaan terjadwal tersebut menggunakan parameter berikut:

WaktuMinCapacityMaxCapacityEfek
07.5048Menaikkan nilai minimum 10 menit sebelum puncak; memicu skalabilitas vertikal antar-host jika diperlukan
09.000,58Mengembalikan rentang default setelah periode puncak

Prasyarat

Sebelum memulai, pastikan Anda telah:

Jadwalkan tugas dalam Python

Contoh ini menggunakan APScheduler dengan BlockingScheduler dan pemicu cron.

Persiapan

  1. Instal Python dan instal dependensi SDK Alibaba Cloud.

  2. Instal APScheduler:

    pip install apscheduler
  3. Unduh proyek contoh SDK untuk ModifyDBInstanceSpec:

    1. Buka halaman ModifyDBInstanceSpec di OpenAPI Explorer.

    2. Pada tab Parameters, atur nilai berikut:

      ParameterNilai
      DBInstanceIdrm-bp1t8v93k6e15****
      PayTypeServerless
      DirectionServerless
      MaxCapacity8,0
      MinCapacity0,5
      AutoPausefalse
      SwitchForcetrue
    3. Pada tab SDK Sample Code, pilih Python dari dropdown Languages lalu klik Download Project. > Note: Unduh proyek contoh SDK V2.0.

    4. Ekstrak paket tersebut dan buka direktori _alibabacloud_sample_.

Konfigurasikan tugas terjadwal

Tambahkan konten tugas terjadwal APScheduler ke file sample.py dan gunakan pemicu cron untuk mengatur waktu eksekusi. Pemicu cron hour=7, minute=50 dijalankan setiap hari pukul 07.50; hour=9, minute=0 dijalankan pukul 09.00.

# -*- coding: utf-8 -*-
# File ini dibuat secara otomatis, jangan edit. Terima kasih.
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:
        """
        Gunakan ID AccessKey dan rahasia AccessKey Anda untuk menginisialisasi client.
        @return: Client
        @throws Exception
        """
        # Jika kode proyek bocor, pasangan Kunci Akses mungkin ikut bocor dan keamanan sumber daya dalam akun Anda bisa terganggu. Kode contoh berikut hanya disediakan sebagai referensi.
        # Untuk keamanan, gunakan kredensial akses temporary yang disediakan oleh Layanan Token Keamanan (STS). Untuk informasi lebih lanjut, lihat https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-php-access-credentials.
        config = open_api_models.Config(
            # Wajib. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID telah dikonfigurasi.
            access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            # Wajib. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET telah dikonfigurasi.
            access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        )
        # Untuk informasi lebih lanjut tentang titik akhir, kunjungi https://api.aliyun.com/product/Rds.
        config.endpoint = f'rds.aliyuncs.com'
        return Rds20140815Client(config)

    # Panggil API ModifyDBInstanceSpec untuk memperbarui konfigurasi instans RDS serverless.
    @staticmethod
    def modify_db_instance_spec(config: Dict[str, float]) -> None:
        """
        Ubah spesifikasi instans DB - fungsi inti tugas
        """
        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:
            # Tangani exception dengan hati-hati dalam skenario bisnis sesungguhnya. Jangan abaikan exception dalam proyek Anda. Dalam contoh ini, pesan error dicetak ke layar.
            print(error.message)
            print(error.data.get("Recommend"))
            UtilClient.assert_as_string(error.message)

    @staticmethod
    def main(args: List[str]) -> None:
        # Inisialisasi penjadwal.
        scheduler = BlockingScheduler()

        # Rentang RCU untuk puncak 08.00-09.00: min=4, max=8.
        # Dijadwalkan pukul 07.50 agar skalabilitas vertikal antar-host selesai sebelum puncak dimulai.
        config_8am = {
            'max_capacity': 8,
            'min_capacity': 4,
            'auto_pause': False,
            'switch_force': True
        }

        # Rentang RCU default dipulihkan setelah puncak: min=0,5, max=8.
        config_9am = {
            'max_capacity': 8,
            'min_capacity': 0.5,
            'auto_pause': False,
            'switch_force': True
        }

        # Buat tugas terjadwal menggunakan pemicu 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:])

Ganti rm-bp1t8v93k6e15**** dengan ID instans Anda yang sebenarnya. Nilai hour dan minute dalam scheduler.add_job mengikuti format waktu 24 jam; sesuaikan nilainya agar sesuai dengan periode puncak Anda.

Jadwalkan tugas dalam Java

Contoh ini menggunakan Spring Schedule. Diperlukan Java 1.8 atau versi yang lebih baru.

Persiapan

  1. Lengkapi prasyarat RAM user dan variabel lingkungan.

  2. Unduh paket contoh demo.zip dan ekstrak ke mesin lokal Anda.

Konfigurasikan tugas terjadwal

Buka ScheduleTask.java dan perbarui ekspresi cron serta parameter agar sesuai dengan periode puncak Anda. Format cron adalah "Detik Menit Jam Hari Bulan Minggu". Misalnya, @Scheduled(cron = "0 0 8 * * ? ") dijalankan setiap hari pukul 08.00.00.

Kode berikut mengatur rentang RCU menjadi [4, 8] pada pukul 07.50 dan mengembalikan [0,5, 8] pada pukul 09.00:

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);
    }
}

Sesuaikan parameter berikut agar sesuai dengan lingkungan dan kebutuhan Anda:

ParameterDeskripsiContoh
RegionIdID wilayah instanscn-hangzhou
DBInstanceIdID instansrm-bp1t8v93k6e15****
PayTypeMetode penagihanServerless
DirectionJenis perubahan spesifikasiServerless
MaxCapacityJumlah maksimum RCU8,0
MinCapacityJumlah minimum RCU0,5
AutoPauseApakah akan mengaktifkan mulai dan berhenti otomatisfalse
SwitchForceApakah akan mengaktifkan penskalaan paksatrue

Untuk sintaks ekspresi cron, lihat referensi anotasi Spring @Scheduled.

Langkah berikutnya