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:
Uma instância Serverless do ApsaraDB RDS for MySQL
Um usuário RAM com as permissões necessárias para chamar
ModifyDBInstanceSpec. Consulte Criar um usuário RAM e conceder permissõesVariáveis de ambiente configuradas com seu AccessKey ID e AccessKey secret. Consulte Configurar variáveis de ambiente
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.
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
Acesse a página de depuração do ModifyDBInstanceSpec no OpenAPI Explorer.
-
Na aba Parameters, defina os seguintes valores:
Parâmetro
Descrição
Valor
DBInstanceIdID da instância
rm-bp1t8v93k6e15****PayTypeMétodo de faturamento
ServerlessDirectionTipo de alteração de especificação
ServerlessMaxCapacityNúmero máximo de RCUs
8.0MinCapacityNúmero mínimo de RCUs
0.5AutoPauseAtivar início e parada automáticos
falseSwitchForceAtivar dimensionamento forçado
true -
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.
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 |
|
|
Número máximo de RCUs |
|
|
|
Número mínimo de RCUs |
|
|
|
Ativar início e parada automáticos |
|
|
|
Ativar dimensionamento forçado |
|
|
|
Horário do gatilho cron (formato 24h) |
|
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 |
|
|
Todos os dias às 07:50:00 |
|
|
Todos os dias às 08:00:00 |
|
|
Todos os dias às 09:00:00 |
Key parameters:
|
Parâmetro |
Descrição |
Exemplo |
|
|
ID da região da instância |
|
|
|
ID da instância |
|
|
|
Método de faturamento |
|
|
|
Tipo de alteração de especificação |
|
|
|
Número máximo de RCUs |
|
|
|
Número mínimo de RCUs |
|
|
|
Ativar início e parada automáticos |
|
|
|
Ativar dimensionamento forçado |
|
Próximos passos
Referência da API ModifyDBInstanceSpec