SQL throttling memungkinkan Anda membatasi jumlah pernyataan SQL konkuren yang dijalankan terhadap sebuah database, sehingga lonjakan tiba-tiba pada satu jenis kueri tidak menghabiskan sumber daya permintaan lain atau menyebabkan database down.
Cara kerja
Saat Anda membuat aturan throttling, Database Autonomy Service (DAS) memantau semua pernyataan SQL masuk dan memeriksa setiap pernyataan tersebut terhadap kriteria pencocokan aturan—berupa kata kunci atau templat SQL. Ketika jumlah pernyataan yang sesuai dan berjalan secara bersamaan mencapai batas konkurensi maksimum yang dikonfigurasi, pernyataan tambahan yang sesuai akan masuk ke antrian atau ditolak segera, tergantung pada versi instans dan konfigurasinya.
Alur permintaan:
Pernyataan SQL tiba di database.
DAS memeriksa apakah pernyataan tersebut sesuai dengan aturan throttling (berdasarkan kata kunci, templat, ID templat, atau waktu eksekusi).
Jika pernyataan tersebut sesuai dan batas konkurensi belum tercapai, pernyataan tersebut dijalankan secara normal.
Jika batas konkurensi telah tercapai:
Maximum concurrency = bilangan bulat positif: Pernyataan masuk ke antrian tunggu. Jika panjang antrian melebihi
ccl_max_waiting_count, database mengembalikan error.Maximum concurrency = 0: Pernyataan langsung ditolak dan database mengembalikan kesalahan.
Kasus penggunaan
| Skenario | Contoh |
|---|---|
| Lonjakan konkurensi pada jenis kueri tertentu | Penetrasi cache atau panggilan aplikasi abnormal menyebabkan lonjakan tiba-tiba dalam konkurensi SQL. |
| Kueri yang menyebabkan data skew | Sering melakukan kueri terhadap data hot selama promosi penjualan menyebabkan sistem secara keseluruhan menjadi kelebihan beban. |
| Pemindaian full-table akibat indeks yang hilang | Volume tinggi panggilan SQL pada tabel tanpa indeks menyebabkan sistem secara keseluruhan menjadi lambat. |
Database yang didukung
| Mesin database | Versi yang didukung |
|---|---|
| ApsaraDB RDS for MySQL | 5.6, 5.7, 8.0 |
| ApsaraDB RDS for PostgreSQL | 13 (minor engine version 20250430 atau lebih baru), 14 (minor version 20230330 atau lebih baru), 15 (minor version 20230330 atau lebih baru), versi di atas 15 (tidak ada persyaratan minor version) |
| PolarDB for MySQL | 5.6, 5.7, 8.0 |
| PolarDB-X 2.0 | — |
Mode throttling
Pilih mode yang sesuai dengan cara Anda ingin mengidentifikasi pernyataan SQL yang akan dibatasi.
| Mode | Deskripsi | Database yang didukung |
|---|---|---|
| Throttle by keyword | Membatasi kecepatan pernyataan SQL yang memuat semua kata kunci yang ditentukan. Catatan: mode ini tidak dapat menargetkan satu pernyataan spesifik — mode ini sesuai dengan semua pernyataan yang memuat seluruh kata kunci yang terdaftar. | ApsaraDB RDS for MySQL, PolarDB for MySQL, PolarDB-X 2.0 |
| Throttle by SQL template | Masukkan contoh pernyataan SQL. DAS mengonversinya menjadi templat dan menerapkan pembatasan kecepatan pada semua pernyataan yang sesuai dengan templat tersebut. | ApsaraDB RDS for MySQL 8.0 (versi mesin minor 20230630 atau lebih baru); ApsaraDB RDS for PostgreSQL 13 (versi minor 20250430 atau lebih baru), 14/15 (versi minor 20230330 atau lebih baru), dan versi di atas 15; PolarDB for MySQL 8.0.1 (versi minor 8.0.1.1.31 atau lebih baru) dan 8.0.2 (versi minor 8.0.2.2.12 atau lebih baru) |
| Throttle by SQL template ID | Masukkan ID templat SQL secara langsung. Dapatkan ID tersebut dari log SQL, sesi, atau hasil EXPLAIN. ID templat merupakan string heksadesimal sepanjang 8 karakter. | PolarDB-X 2.0 Enterprise Edition |
| Throttle by execution time | Tetapkan ambang batas waktu eksekusi. DAS secara otomatis menambahkan ID templat dari pernyataan yang melebihi ambang batas tersebut ke dalam aturan pembatasan kecepatan dan menerapkan batas konkurensi yang telah dikonfigurasi. | PolarDB-X 2.0 Enterprise Edition |
Buat aturan throttling
SQL throttling merupakan tindakan darurat. Tetapkan durasi throttling yang singkat dan nonaktifkan aturan segera setelah situasi teratasi.
Login ke Konsol DAS.
Di panel navigasi kiri, klik Intelligent O&M Center > Instance Monitoring.
Temukan instans target, lalu klik ID instans untuk membuka halaman detail instans.
Di panel navigasi kiri, klik Instance Sessions.
Di halaman Session Management, klik SQL Throttling.
Pada kotak dialog yang muncul, klik Create Throttling Rule.
Pada kotak dialog Create Throttling Rule, konfigurasikan parameter sesuai mesin database Anda.
ApsaraDB RDS for MySQL
| Parameter | Deskripsi |
|---|---|
| Throttling mode | Pilih mode throttling. |
| SQL type | Pilih jenis pernyataan SQL yang akan dibatasi: SELECT, UPDATE, DELETE, atau INSERT. Wajib diisi saat Throttling mode diatur ke Throttle by keyword. Catatan Pernyataan INSERT hanya dapat dibatasi pada ApsaraDB RDS for MySQL 8.0, PolarDB for MySQL 5.7 dan 8.0, serta PolarDB-X 2.0. Pernyataan |
| Database | Database tempat aturan throttling diterapkan. Wajib diisi saat Throttling mode diatur ke Throttle by SQL template. |
| Maximum concurrency | Jumlah maksimum pernyataan SQL yang dapat berjalan secara konkuren. Nilai minimum: 0. Pembatasan dipicu ketika jumlah pernyataan yang sesuai dan berjalan secara konkuren mencapai angka ini. |
| Throttling duration | Durasi aturan throttling tetap aktif. Nonaktifkan aturan secara manual jika situasi telah teratasi sebelum durasi berakhir. |
| SQL keyword | Wajib diisi saat Throttling mode diatur ke Throttle by keyword. Masukkan kata kunci yang mengidentifikasi pernyataan yang akan dibatasi. Pisahkan beberapa kata kunci dengan tilde (~). Pernyataan hanya dibatasi jika memuat semua kata kunci yang ditentukan—urutan tidak penting. Catatan Kata kunci bersifat case-sensitive pada sebagian besar versi. Anda tidak dapat menggunakan hanya |
| SQL sample | Wajib diisi saat Throttling mode diatur ke Throttle by SQL template. Masukkan pernyataan SQL representatif. DAS mengonversinya menjadi templat dengan mengganti nilai literal dengan placeholder. Misalnya, select name from das where name = \das\ and age = 21 limit 20 menjadi templat select name from das where name = ? and age = ? limit ?. Efek pembatasan tidak dipengaruhi oleh cara DAS menormalisasi sampel tersebut. |
ApsaraDB RDS for PostgreSQL
ApsaraDB RDS for PostgreSQL hanya mendukung mode Throttle by SQL template.
| Parameter | Deskripsi |
|---|---|
| Database | Database tempat aturan throttling diterapkan. |
| Search path | Path pencarian skema untuk aturan throttling. Pisahkan beberapa path dengan koma (,). Default: information_schema,public. |
| Maximum concurrency | Jumlah maksimum pernyataan SQL yang dapat berjalan secara konkuren. Nilai minimum: 0. Pembatasan dipicu ketika jumlah pernyataan yang sesuai dan berjalan secara konkuren mencapai angka ini. |
| Maximum waiting queries | Jumlah maksimum pernyataan yang diizinkan menunggu dalam antrian. |
| Throttling duration | Durasi aturan throttling tetap aktif. Nonaktifkan aturan secara manual jika situasi telah teratasi sebelum durasi berakhir. |
| SQL sample | Masukkan pernyataan SQL representatif. DAS mengonversinya menjadi templat dengan mengganti nilai literal dengan placeholder. Misalnya, select name from das where name = "das" and age = 21 limit 20 menjadi select name from das where name = ? and age = ? limit ?. |
PolarDB for MySQL
| Parameter | Deskripsi |
|---|---|
| Throttling mode | Pilih mode throttling. |
| SQL type | Pilih jenis pernyataan SQL yang akan dibatasi: SELECT, UPDATE, DELETE, atau INSERT. Catatan Pernyataan INSERT hanya dapat dibatasi pada ApsaraDB RDS for MySQL 8.0, PolarDB for MySQL 5.7 dan 8.0, serta PolarDB-X 2.0. Pernyataan |
| Maximum concurrency | Jumlah maksimum pernyataan SQL yang dapat berjalan secara konkuren. Nilai minimum: 0. |
| Database | Database tempat aturan throttling diterapkan. Wajib diisi saat Throttling mode diatur ke Throttle by SQL template. |
| Throttling duration | Durasi aturan throttling tetap aktif. |
| SQL keyword | Wajib diisi saat Throttling mode diatur ke Throttle by keyword. Aturan yang sama berlaku seperti pada ApsaraDB RDS for MySQL. Pisahkan beberapa kata kunci dengan ~. Pernyataan harus memuat semua kata kunci yang ditentukan agar dibatasi. |
| SQL sample | Wajib diisi saat Throttling mode diatur ke Throttle by SQL template. DAS mengonversi sampel menjadi templat dengan mengganti nilai literal dengan placeholder. |
PolarDB-X 2.0
| Parameter | Deskripsi |
|---|---|
| Throttling mode | Pilih mode throttling. |
| SQL type | Pilih jenis pernyataan SQL yang akan dibatasi: SELECT, UPDATE, DELETE, atau INSERT. Catatan Pernyataan INSERT hanya dapat dibatasi pada ApsaraDB RDS for MySQL 8.0, PolarDB for MySQL 5.7 dan 8.0, serta PolarDB-X 2.0. Pernyataan |
| Maximum concurrency | Jumlah maksimum pernyataan SQL yang dapat berjalan secara konkuren. Nilai minimum: 0. |
| Throttling duration | Durasi aturan throttling tetap aktif. |
| SQL keyword | Wajib diisi saat Throttling mode diatur ke Throttle by keyword. Pisahkan beberapa kata kunci dengan ~. Pernyataan harus memuat semua kata kunci yang ditentukan agar dibatasi. |
| SQL template ID | Wajib diisi untuk PolarDB-X 2.0 Enterprise Edition saat Throttling mode diatur ke Throttle by SQL template. Masukkan satu atau beberapa ID templat heksadesimal 8 karakter, dipisahkan dengan koma (,). Dapatkan ID templat dari log SQL, session, atau hasil EXPLAIN. |
| Minimum SQL execution duration | Wajib diisi untuk PolarDB-X 2.0 Enterprise Edition saat Throttling mode diatur ke Throttle by execution time. Ambang batas waktu eksekusi. Saat pernyataan melebihi ambang batas ini, DAS secara otomatis menambahkan ID templatnya ke aturan throttling. |
| Maximum throttled SQL IDs | Wajib diisi untuk PolarDB-X 2.0 Enterprise Edition saat Throttling mode diatur ke Throttle by execution time. Jumlah maksimum ID templat SQL yang dapat dibatasi. Setelah batas ini tercapai, DAS berhenti menambahkan ID templat baru meskipun lebih banyak pernyataan melebihi ambang batas. |
| Database account with throttled queries | Wajib diisi saat Throttling mode diatur ke Throttle by keyword atau Throttle by SQL template. Akun database yang pernyataan SQL-nya dikenai pembatasan. |
Klik Submit untuk membuat aturan.
Perilaku throttling dan kode kesalahan
Saat aturan throttling dipicu, database mengembalikan error ke aplikasi. Kode error yang tepat bergantung pada versi instans dan nilai maximum concurrency yang dikonfigurasi.
| Maximum concurrency | Instance | Kode kesalahan | Pesan error |
|---|---|---|---|
| 0 atau bilangan bulat positif | ApsaraDB RDS for MySQL 5.6 | 1317 | query execution was interrupted |
| 0 atau bilangan bulat positif | ApsaraDB RDS for MySQL 5.7 (minor version sebelum 20200630) | 1317 | query execution was interrupted |
| 0 atau bilangan bulat positif | PolarDB for MySQL 5.6 | 1317 | query execution was interrupted |
| Bilangan bulat positif | ApsaraDB RDS for MySQL 5.7 (minor version 20200630 atau lebih baru) | 5041 | Concurrency control waiting count exceed max waiting count |
| Bilangan bulat positif | ApsaraDB RDS for MySQL 8.0 | 7534 | Concurrency control waiting count exceed max waiting count |
| Bilangan bulat positif | PolarDB for MySQL 5.7 | 3277 | Concurrency control waiting count exceed max waiting count |
| Bilangan bulat positif | PolarDB for MySQL 8.0 | 7533 | Concurrency control waiting count exceed max waiting count |
| 0 | ApsaraDB RDS for MySQL 5.7 (minor version 20200630 atau lebih baru) | 5042 | Concurrency control refuse to execute query |
| 0 | ApsaraDB RDS for MySQL 8.0 | 7535 | Concurrency control refuse to execute query |
| 0 | PolarDB for MySQL 5.7 | 3278 | Concurrency control refuse to execute query |
| 0 | PolarDB for MySQL 8.0 | 7534 | Concurrency control refuse to execute query |
Parameter tambahan untuk instans yang didukung:
`ccl_max_waiting_count` (ApsaraDB RDS for MySQL 5.7 minor version 20200630 atau lebih baru, ApsaraDB RDS for MySQL 8.0): Menetapkan panjang maksimum antrian. Jika diatur ke 0, DAS menggunakan nilai default 10.
`ccl_wait_timeout` (ApsaraDB RDS for MySQL 5.7 minor version 20200630 atau lebih baru, ApsaraDB RDS for MySQL 8.0): Menetapkan timeout untuk pernyataan yang menunggu, jika didukung oleh versi instans. Pernyataan yang melebihi timeout ini tetap dijalankan dan tidak lagi dikenai pembatasan.
`ccl_mode` (PolarDB for MySQL 8.0): Mengontrol perilaku saat batas konkurensi terlampaui. Parameter ini hanya tersedia pada versi instans yang didukung.
WAIT(default): Pernyataan menunggu dalam antrian.REFUSE: Pernyataan ditolak segera tanpa menunggu.
Lihat dan kelola aturan throttling
Setelah Anda membuat aturan, aturan tersebut muncul di tab Running dengan detail berikut.
Kolom yang ditampilkan bervariasi tergantung pada mesin database dan mode throttling.
| Kolom | Deskripsi |
|---|---|
| Throttling mode | Mode yang dipilih saat membuat aturan. |
| Throttling rule | Konfigurasi aturan: kata kunci (mode keyword), ID templat (mode templat), atau ambang batas waktu eksekusi dan jumlah pernyataan yang dibatasi (mode execution time). |
| Maximum concurrency | Batas konkurensi yang dikonfigurasi. |
| Maximum waiting queries | Panjang maksimum antrian. Ditampilkan untuk ApsaraDB RDS for PostgreSQL dengan mode SQL template. |
| Throttling duration (min) | Durasi aktif yang dikonfigurasi. |
| Start time | Waktu aturan mulai berlaku. |
| Remaining time (s) | Waktu tersisa sebelum aturan kedaluwarsa. |
| Sample SQL | Sampel SQL yang digunakan untuk menghasilkan templat. Ditampilkan untuk mode SQL template. |
| Throttling template ID | ID templat yang sesuai dengan sampel SQL yang dibatasi. Ditampilkan untuk mode SQL template. |
| Status | Aturan yang sedang berjalan menampilkan Enabled. |
| Database | Database tempat aturan diterapkan. Ditampilkan untuk mode SQL template. |
| Search path | Path pencarian skema. Ditampilkan untuk ApsaraDB RDS for PostgreSQL dengan mode SQL template. |
| Matched SQL query | Jumlah pernyataan SQL yang sesuai dengan aturan. Ditampilkan untuk mode SQL template. |
| Waiting SQL query | Jumlah pernyataan SQL yang sedang menunggu dalam antrian. Ditampilkan untuk mode SQL template. |
| Actions | Disable atau Modify aturan. |
Langkah berikutnya
Automatic SQL throttling — biarkan DAS mendeteksi dan menerapkan aturan throttling secara otomatis.
Referensi API
| API | Deskripsi |
|---|---|
| EnableSqlConcurrencyControl | Mengaktifkan SQL throttling. |
| DisableSqlConcurrencyControl | Menonaktifkan aturan throttling tertentu. |
| DisableAllSqlConcurrencyControlRules | Menonaktifkan semua aturan throttling yang sedang berjalan. |
| GetRunningSqlConcurrencyControlRules | Mendapatkan aturan throttling yang sedang berjalan. |
| GetSqlConcurrencyControlRulesHistory | Mendapatkan aturan throttling yang sedang berjalan atau telah dipicu. |
| GetSqlConcurrencyControlKeywordsFromSqlText | Menghasilkan kata kunci throttling dari pernyataan SQL. |