ApsaraDB RDS for MySQL serverless met automatiquement à l'échelle les unités de capacité RDS (RCU) en fonction de l'utilisation du CPU et de la mémoire. Dans 99,8 % des cas, les montées en charge s'effectuent en quelques secondes (intra-hôte). Toutefois, lorsque l'hôte actuel ne peut pas fournir suffisamment de ressources, une montée en charge inter-hôtes est nécessaire ; cette opération prend de 3 à 5 minutes et peut affecter vos charges de travail. Pour éviter tout impact durant une période de forte activité connue, utilisez une tâche planifiée pour augmenter le nombre minimal de RCU avant le pic de trafic.
Fonctionnement
La mise à l'échelle automatique déclenche une augmentation de la capacité lorsque l'utilisation du CPU ou de la mémoire atteint 60 % à 80 %. Deux types de montée en charge sont possibles :
| Type de montée en charge |
Durée |
Impact sur les connexions |
Fréquence |
| Intra-hôte |
Quelques secondes |
Aucun |
99,8 % des cas |
| Inter-hôtes |
3–5 minutes |
Peut affecter vos charges de travail |
Lorsque l'hôte ne peut pas fournir suffisamment de ressources |
En définissant MinCapacity et MaxCapacity avec la même valeur, vous fixez la capacité de l'instance pour une fenêtre de temps donnée, éliminant ainsi tout risque de montée en charge durant cette période.
La tâche planifiée appelle l'API ModifyDBInstanceSpec pour augmenter la valeur MinCapacity avant le début d'une période de forte activité, puis restaure les valeurs d'origine à la fin de celle-ci.
Exemple de scénario
Réservez 4 à 8 RCU durant l'heure de pointe de 08:00 à 09:00. Étant donné qu'une montée en charge inter-hôtes peut prendre jusqu'à 5 minutes, augmentez le minimum 10 minutes plus tôt, soit à 07:50. Restaurez la plage par défaut (0,5–8 RCU) à 09:00.

Les deux tâches planifiées utilisent les paramètres suivants :
| Heure |
**MinCapacity** |
**MaxCapacity** |
Effet |
| 07:50 |
4 |
8 |
Augmente le minimum 10 min avant le pic ; déclenche une montée en charge inter-hôtes si nécessaire |
| 09:00 |
0.5 |
8 |
Restaure la plage par défaut après la période de pointe |
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Planifier la tâche en Python
Cet exemple utilise APScheduler avec un BlockingScheduler et des déclencheurs cron.
Configuration
Installez Python et installez les dépendances du SDK Alibaba Cloud.
-
Installez APScheduler :
-
Téléchargez l'exemple de projet SDK pour ModifyDBInstanceSpec :
Ouvrez la page ModifyDBInstanceSpec dans OpenAPI Explorer.
-
Dans l'onglet Parameters, définissez les valeurs suivantes :
| Paramètre |
Valeur |
| DBInstanceId |
rm-bp1t8v93k6e15**** |
| PayType |
Serverless |
| Direction |
Serverless |
| MaxCapacity |
8,0 |
| MinCapacity |
0,5 |
| AutoPause |
false |
| SwitchForce |
true |
Dans l'onglet SDK Sample Code, sélectionnez Python dans la liste déroulante Languages et cliquez sur Download Project. > Note: Téléchargez l'exemple de projet SDK V2.0.
Décompressez le package et ouvrez le répertoire _alibabacloud_sample_.
Configurer la tâche planifiée
Ajoutez le contenu de la tâche planifiée APScheduler au fichier sample.py et utilisez un déclencheur cron pour configurer l'heure d'exécution. Le déclencheur cron hour=7, minute=50 se déclenche tous les jours à 07:50 ; hour=9, minute=0 se déclenche à 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.alibabacloud.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:])
Remplacez rm-bp1t8v93k6e15**** par votre ID d'instance réel. Les valeurs hour et minute dans scheduler.add_job suivent le format 24 heures ; ajustez-les pour correspondre à votre fenêtre de pointe.
Planifier la tâche en Java
Cet exemple utilise Spring Schedule. Java 1.8 ou version ultérieure est requis.
Configurer la tâche planifiée
Ouvrez le fichier ScheduleTask.java et mettez à jour les expressions cron et les paramètres pour correspondre à votre fenêtre de pointe. Le format cron est "Second Minute Hour Day Month Week". Par exemple, @Scheduled(cron = "0 0 8 * * ? ") se déclenche tous les jours à 08:00:00.
Le code suivant définit la plage de RCU sur [4, 8] à 07:50 et restaure [0,5, 8] à 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);
}
}
Ajustez les paramètres suivants pour correspondre à votre environnement et à vos besoins :
| Paramètre |
Description |
Exemple |
| RegionId |
ID de la région de l'instance |
cn-hangzhou |
| DBInstanceId |
ID de l'instance |
rm-bp1t8v93k6e15**** |
| PayType |
Méthode de facturation |
Serverless |
| Direction |
Type de modification des spécifications |
Serverless |
| MaxCapacity |
Nombre maximal de RCU |
8,0 |
| MinCapacity |
Nombre minimal de RCU |
0,5 |
| AutoPause |
Activation ou non du démarrage et de l'arrêt automatiques |
false |
| SwitchForce |
Activation ou non de la mise à l'échelle forcée |
true |
Pour la syntaxe des expressions cron, consultez la référence de l'annotation Spring @Scheduled).