Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Configure scheduled tasks to adjust the number of RCUs for a serverless RDS instance

Última atualização: Jun 26, 2026

O ApsaraDB RDS for MySQL Serverless dimensiona as RDS Capacity Units (RCUs) automaticamente com base na carga. A maioria dos aumentos de escala é concluída em segundos. No entanto, quando um aumento de escala exige a migração para um host diferente, o processo pode levar de 3 a 5 minutos — tempo suficiente para causar instabilidade durante uma janela de pico conhecida.

Para evitar essa instabilidade, fixe os valores mínimo e máximo de RCUs antes do início da janela de pico e restaure-os ao término. Este tópico mostra como automatizar esse fluxo de trabalho com uma tarefa agendada usando Python ou Java.

Como funciona

Dois tipos de aumento de escala podem ocorrer:

  • Aumento de escala no mesmo host — A instância escala dentro do mesmo host. Concluído em segundos. Cobre 99,8% dos cenários.

  • Aumento de escala entre hosts — A instância migra para um host diferente. Leva de 3 a 5 minutos. Acionado quando o host atual não consegue fornecer recursos suficientes.

O dimensionamento automático é ativado quando a utilização de CPU ou o uso de memória atinge 60–80%. Se um aumento de escala entre hosts ocorrer durante um horário de pico, a janela de 3 a 5 minutos pode causar instabilidade.

A solução: chame a API ModifyDBInstanceSpec de forma agendada para fixar o intervalo de RCUs em um valor fixo antes da janela de pico. Ao final da janela, uma segunda chamada agendada restaura o intervalo padrão.

Quando usar o ajuste agendado de RCUs

Use essa abordagem quando você souber antecipadamente que uma janela de tempo específica exige capacidade estável do banco de dados — por exemplo:

  • Tráfego de pico previsível — Horário comercial, jobs em lote ou relatórios agendados que impõem carga consistente ao banco de dados.

  • Prevenção de instabilidade por aumento de escala entre hosts — Fixe o mínimo de RCUs em um valor alto o suficiente para evitar uma migração entre hosts durante a janela de pico.

Como escolha o intervalo de RCUs

Ao defina MinCapacity para a janela de pico, considere o seguinte:

  • Defina o mínimo alto o suficiente para cobrir a carga de pico esperada. Um valor mínimo de RCU mais alto reduz a probabilidade de acionar um aumento de escala entre hosts durante a janela.

  • Inicie a tarefa 10 minutos antes. Caso seja necessário um aumento de escala entre hosts ao elevar o mínimo, esse tempo de antecedência permite que ele seja concluído antes do início do pico.

  • Restaure o padrão ao término. Execute uma segunda tarefa ao final da janela de pico para redefinir o intervalo de RCUs, permitindo que a instância reduza a escala quando a carga diminuir.

Pré-requisitos

Antes de começar, verifique se você possui:

Cenário de exemplo

O horário de pico é das 08:00 às 09:00. O intervalo padrão de RCUs é 0,5–8. Durante o horário de pico, o mínimo deve ser 4 para garantir capacidade suficiente.

Agende duas tarefas:

Horário

Ação

MinCapacity

MaxCapacity

07:50

Elevar o mínimo

4

8

09:00

Restaurar o padrão

0,5

8

Inicie às 07:50 — 10 minutos antes do pico — para permitir que um eventual aumento de escala entre hosts seja concluído antes da abertura da janela.

image

Schedule with Python

Este exemplo usa APScheduler com um gatilho cron.

Etapa 1: Instalar as dependências

Instale o Python e instale as dependências do SDK do Alibaba Cloud RDS; em seguida, instale o APScheduler:

pip install apscheduler

Etapa 2: Baixe o código de exemplo do SDK

  1. Acesse a página de depuração do ModifyDBInstanceSpec no OpenAPI Explorer.

  2. Na aba Parameters, defina os seguintes valores:

    Parâmetro

    Descrição

    Valor

    DBInstanceId

    ID da instância

    rm-bp1t8v93k6e15****

    PayType

    Método de faturamento

    Serverless

    Direction

    Tipo de alteração de especificação

    Serverless

    MaxCapacity

    Número máximo de RCUs

    8.0

    MinCapacity

    Número mínimo de RCUs

    0.5

    AutoPause

    Ativar início e parada automáticos

    false

    SwitchForce

    Ativar dimensionamento forçado

    true

  3. Na aba SDK Sample Code, selecione Python no menu suspenso Languages e clique em Download Project para baixe o pacote de exemplo.

    Baixe o projeto de exemplo do SDK V2.0.
  4. Extraia o pacote em sua máquina e acesse o diretório alibabacloud_sample.

Etapa 3: Adicionar tarefas agendadas ao código de exemplo

Abra sample.py e substitua o conteúdo pelo código a seguir. Todos os exemplos usam um gatilho cron via scheduler.add_job(..., 'cron', hour=H, minute=M) para definir o horário de execução.

# -*- 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:
        """
        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 endpoint information, see https://api.aliyun.com/product/Rds.
        config.endpoint = f'rds.aliyuncs.com'
        return Rds20140815Client(config)

    @staticmethod
    def modify_db_instance_spec(config: Dict[str, float]) -> None:
        """
        Call ModifyDBInstanceSpec to update the RCU range of the serverless instance.
        """
        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()

        # At 07:50, raise the minimum to 4 RCUs to prepare for the 08:00 peak.
        config_8am = {
            'max_capacity': 8,
            'min_capacity': 4,
            'auto_pause': False,
            'switch_force': True
        }

        # At 09:00, restore the default range of 0.5–8 RCUs.
        config_9am = {
            'max_capacity': 8,
            'min_capacity': 0.5,
            'auto_pause': False,
            'switch_force': True
        }

        # cron trigger: hour=H, minute=M runs the task at H:M every day.
        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:])

Key parameters:

Parâmetro

Descrição

Exemplo

max_capacity

Número máximo de RCUs

8

min_capacity

Número mínimo de RCUs

4 (pico) / 0.5 (padrão)

auto_pause

Ativar início e parada automáticos

False

switch_force

Ativar dimensionamento forçado

True

hour, minute

Horário do gatilho cron (formato 24h)

hour=7, minute=50 executa diariamente às 07:50

Schedule with Java

Este exemplo usa Spring Schedule. É necessário Java 1.8 ou superior.

Etapa 1: Configure os pré-requisitos

Crie um usuário RAM e conceda permissões e configure as variáveis de ambiente.

Etapa 2: Baixe o pacote de exemplo

Baixe e extraia demo.zip em sua máquina.

Etapa 3: Configure tarefas agendadas em ScheduleTask.java

Abra ScheduleTask.java e configure as expressões cron para o seu agendamento. A anotação @Scheduled usa o formato "Second Minute Hour Day Month Week". Para a sintaxe completa das expressões cron, consulte a referência do Spring @Scheduled).

O exemplo a seguir define o intervalo de RCUs como [4, 8] às 07:50 e o restaura para [0,5, 8] às 09:00:

package com.example.demo;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduleTask {

    // At 07:50 every day, raise the minimum to 4 RCUs before the 08:00 peak.
    @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);
    }

    // At 09:00 every day, restore the default range of 0.5–8 RCUs.
    @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);
    }
}

Referência rápida de expressões cron:

Expressão cron

Significado

0 50 7 * * ?

Todos os dias às 07:50:00

0 0 8 * * ?

Todos os dias às 08:00:00

0 0 9 * * ?

Todos os dias às 09:00:00

Key parameters:

Parâmetro

Descrição

Exemplo

RegionId

ID da região da instância

cn-hangzhou

DBInstanceId

ID da instância

rm-bp1t8v93k6e15****

PayType

Método de faturamento

Serverless

Direction

Tipo de alteração de especificação

Serverless

MaxCapacity

Número máximo de RCUs

8.0

MinCapacity

Número mínimo de RCUs

0.5 (padrão) / 4 (pico)

AutoPause

Ativar início e parada automáticos

false

SwitchForce

Ativar dimensionamento forçado

true

Próximos passos