O ApsaraDB RDS for MySQL Serverless dimensiona automaticamente as RDS Capacity Units (RCUs) com base na utilização da CPU e no uso de memória. Em 99,8% dos casos, o scale-up é concluído em segundos (intra-host). No entanto, quando o host atual não fornece recursos suficientes, um scale-up inter-host torna-se necessário. Esse processo leva de 3 a 5 minutos e pode afetar suas cargas de trabalho. Para evitar impactos durante uma janela de pico conhecida, use uma tarefa agendada para elevar o mínimo de RCU antes do aumento de tráfego.
Como funciona
O Auto Scaling aciona um scale-up quando a utilização da CPU ou o uso de memória atinge entre 60% e 80%. Dois tipos de scale-up são possíveis:
|
Tipo de scale-up
|
Duração
|
Impacto na conexão
|
Frequência
|
|
Intra-host
|
Segundos
|
Nenhum
|
99,8% dos casos
|
|
Inter-host
|
3–5 minutos
|
Pode afetar suas cargas de trabalho
|
Quando o host não fornece recursos suficientes
|
Defina MinCapacity e MaxCapacity com o mesmo valor fixa a instância em uma capacidade específica por uma janela de tempo. Isso elimina o risco de scale-up durante esse período.
A tarefa agendada chama a API ModifyDBInstanceSpec para aumentar o MinCapacity antes do início de um período de pico e restaura os valores originais ao término dele.
Cenário de exemplo
Reserve de 4 a 8 RCUs durante uma hora de pico, das 08:00 às 09:00. Como um scale-up inter-host pode levar até 5 minutos, aumente o mínimo com 10 minutos de antecedência, às 07:50. Restaure a faixa padrão (0,5–8 RCUs) às 09:00.

Os dois jobs agendados usam os seguintes parâmetros:
|
Horário
|
**MinCapacity**
|
**MaxCapacity**
|
Efeito
|
|
07:50
|
4
|
8
|
Eleva o mínimo 10 min antes do pico; aciona scale-up inter-host se necessário
|
|
09:00
|
0,5
|
8
|
Restaura a faixa padrão após a janela de pico
|
Pré-requisitos
Antes de começar, verifique se você tem:
Schedule the task in Python
Este exemplo usa o APScheduler com um BlockingScheduler e gatilhos cron.
Configuração inicial
Instale o Python e instale as dependências do SDK da Alibaba Cloud.
-
Instale o APScheduler:
-
Baixe o projeto de amostra do SDK para ModifyDBInstanceSpec:
Abra a página ModifyDBInstanceSpec no OpenAPI Explorer.
-
Na aba Parameters, defina os seguintes valores:
|
Parâmetro
|
Valor
|
|
DBInstanceId
|
rm-bp1t8v93k6e15****
|
|
PayType
|
Serverless
|
|
Direction
|
Serverless
|
|
MaxCapacity
|
8,0
|
|
MinCapacity
|
0,5
|
|
AutoPause
|
false
|
|
SwitchForce
|
true
|
Na aba SDK Sample Code, selecione Python no menu suspenso Languages e clique em Download Project. > Note: Baixe o projeto de amostra do SDK V2.0.
Descompacte o pacote e abra o diretório _alibabacloud_sample_.
Configure a tarefa agendada
Adicione o conteúdo da tarefa agendada do APScheduler ao arquivo sample.py e use um gatilho cron para configurar o horário de execução. O gatilho cron hour=7, minute=50 dispara às 07:50 todos os dias; já o hour=9, minute=0 dispara às 09:00.
# -*- 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, use temporary access credentials 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 the ModifyDBInstanceSpec API to update the serverless RDS instance configuration.
@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:
# Initialize the scheduler.
scheduler = BlockingScheduler()
# RCU range for 08:00-09:00 peak: min=4, max=8.
# Scheduled at 07:50 to allow inter-host scale-up to complete before peak starts.
config_8am = {
'max_capacity': 8,
'min_capacity': 4,
'auto_pause': False,
'switch_force': True
}
# Default RCU range restored after peak: min=0.5, max=8.
config_9am = {
'max_capacity': 8,
'min_capacity': 0.5,
'auto_pause': False,
'switch_force': True
}
# Create scheduled tasks using cron triggers.
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:])
Substitua rm-bp1t8v93k6e15**** pelo ID real da sua instância. Os valores de hour e minute em scheduler.add_job seguem o formato de 24 horas; ajuste-os para corresponder à sua janela de pico.
Schedule the task in Java
Este exemplo usa o Spring Schedule. É necessário Java 1.8 ou superior.
Configure a tarefa agendada
Abra o arquivo ScheduleTask.java e atualize as expressões cron e os parâmetros para corresponder à sua janela de pico. O formato cron é "Second Minute Hour Day Month Week". Por exemplo, @Scheduled(cron = "0 0 8 * * ? ") dispara às 08:00:00 todos os dias.
O código abaixo define a faixa de RCU como [4, 8] às 07:50 e restaura [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 {
@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);
}
}
Ajuste os seguintes parâmetros conforme seu ambiente e requisitos:
|
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
|
|
AutoPause
|
Se deve ativar início e parada automáticos
|
false
|
|
SwitchForce
|
Se deve ativar o dimensionamento forçado
|
true
|
Para sintaxe de expressão cron, consulte a referência da anotação Spring @Scheduled).