Serverless ApsaraDB RDS for MySQL, CPU kullanımı ve bellek kullanımına göre RDS Capacity Unit (RCU) değerlerini otomatik olarak ölçeklendirir. Olayların %99,8'inde ölçek büyütme işlemleri saniyeler içinde (aynı ana bilgisayar üzerinde) tamamlanır. Ancak, mevcut ana bilgisayar yeterli kaynağı sağlayamadığında farklı bir ana bilgisayara geçiş gerekebilir; bu işlem 3 ila 5 dakika sürer ve iş yüklerinizi etkileyebilir. Bilinen yoğun bir zaman diliminde bu durumun etkilenmesini önlemek için, trafik zirvesinden önce RCU minimum değerini artırmak üzere zamanlanmış bir görev kullanın.
Nasıl çalışır?
Otomatik ölçeklendirme, CPU kullanımı veya bellek kullanımı %60–%80 aralığına ulaştığında ölçek büyütme işlemini tetikler. İki tür ölçek büyütme mümkündür:
| Ölçek büyütme türü |
Süre |
Bağlantı etkisi |
Sıklık |
| Aynı ana bilgisayar üzerinde |
Saniyeler |
Yok |
Olayların %99,8'i |
| Farklı ana bilgisayara geçiş |
3–5 dakika |
İş yüklerinizi etkileyebilir |
Ana bilgisayar yeterli kaynağı sağlayamadığında |
MinCapacity ve MaxCapacity değerlerini aynı değere ayarlamak, örneği belirli bir zaman dilimi için sabit kapasitede tutarak bu dönemdeki ölçek büyütme riskini ortadan kaldırır.
Zamanlanmış görev, yoğun bir dönem başlamadan önce MinCapacity değerini artırmak ve dönem sona erdiğinde orijinal değerleri geri yüklemek için API'sini çağırır.
Örnek senaryo
08:00 ile 09:00 arasındaki zirve saati boyunca 4–8 RCU ayırın. Farklı ana bilgisayara geçiş işlemi 5 dakikaya kadar sürebileceğinden, minimum değeri 10 dakika erken yani 07:50'de artırın. Varsayılan aralığı (0,5–8 RCU) 09:00'da geri yükleyin.

İki zamanlanmış görev aşağıdaki parametreleri kullanır:
| Saat |
**MinCapacity** |
**MaxCapacity** |
Etki |
| 07:50 |
4 |
8 |
Zirveden 10 dk önce minimumu artırır; gerekirse farklı ana bilgisayara geçişi tetikler |
| 09:00 |
0,5 |
8 |
Yoğunluk penceresinden sonra varsayılan aralığı geri yükler |
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Görevi Python ile zamanlama
Bu örnekte, BlockingScheduler ve cron tetikleyicileri kullanan APScheduler kullanılır.
Kurulum
Python yükleme ve Alibaba Cloud SDK bağımlılıklarını yükleme işlemlerini tamamlayın.
-
APScheduler'ı yükleyin:
-
ModifyDBInstanceSpec için SDK örnek projesini indirin:
OpenAPI Explorer'da ModifyDBInstanceSpec sayfasını açın.
-
Parameters sekmesinde aşağıdaki değerleri ayarlayın:
| Parametre |
Değer |
| DBInstanceId |
rm-bp1t8v93k6e15**** |
| PayType |
Serverless |
| Direction |
Serverless |
| MaxCapacity |
8,0 |
| MinCapacity |
0,5 |
| AutoPause |
false |
| SwitchForce |
true |
SDK Sample Code sekmesinde, Languages açılır menüsünden Python seçeneğini belirleyin ve Download Project seçeneğine tıklayın. > Note: SDK V2.0 örnek projesini indirin.
Paketi sıkıştırılmış halden çıkarın ve _alibabacloud_sample_ dizinini açın.
Zamanlanmış görevi yapılandırma
APScheduler zamanlanmış görevinin içeriğini sample.py dosyasına ekleyin ve yürütme zamanını yapılandırmak için bir cron tetikleyicisi kullanın. hour=7, minute=50 cron tetikleyicisi her gün 07:50'de; hour=9, minute=0 ise 09:00'da çalışır.
# -*- 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:])
rm-bp1t8v93k6e15**** değerini gerçek örnek kimliğinizle değiştirin. scheduler.add_job içindeki hour ve minute değerleri 24 saatlik zaman formatını takip eder; bunları kendi yoğunluk pencerenize uyacak şekilde ayarlayın.
Görevi Java ile zamanlama
Bu örnekte Spring Schedule kullanılır. Java 1.8 veya üzeri bir sürüm gereklidir.
Zamanlanmış görevi yapılandırma
ScheduleTask.java dosyasını açın ve cron ifadelerini ile parametreleri yoğunluk pencerenize uyacak şekilde güncelleyin. Cron formatı "Saniye Dakika Saat Gün Ay Hafta" şeklindedir. Örneğin, @Scheduled(cron = "0 0 8 * * ? ") her gün 08:00:00'da çalışır.
Aşağıdaki kod, 07:50'de RCU aralığını [4, 8] olarak ayarlar ve 09:00'da [0,5, 8] aralığını geri yükler:
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);
}
}
Aşağıdaki parametreleri ortamınıza ve gereksinimlerinize uyacak şekilde ayarlayın:
| Parametre |
Açıklama |
Örnek |
| RegionId |
Örneğin bölge kimliği |
cn-hangzhou |
| DBInstanceId |
Örnek kimliği |
rm-bp1t8v93k6e15**** |
| PayType |
Faturalama yöntemi |
Serverless |
| Direction |
Teknik özellik değişiklik türü |
Serverless |
| MaxCapacity |
Maksimum RCU sayısı |
8,0 |
| MinCapacity |
Minimum RCU sayısı |
0,5 |
| AutoPause |
Otomatik başlatma ve durdurmanın etkin olup olmadığı |
false |
| SwitchForce |
Zorunlu ölçeklendirmenin etkin olup olmadığı |
true |
Cron ifade sözdizimi için bkz. Spring @Scheduled annotation reference).