dan menyediakan fitur Pembatasan SQL yang memungkinkan Anda mengonfigurasi aturan pembatasan untuk titik akhir tertentu guna mencegah lalu lintas abnormal memengaruhi layanan Anda. Topik ini menjelaskan cara menggunakan fitur tersebut.
Pendahuluan
Fitur Pembatasan SQL memungkinkan Anda mengonfigurasi aturan pembatasan untuk titik akhir tertentu dengan menggunakan templat SQL untuk mencocokkan pernyataan SQL yang dieksekusi pada titik akhir tersebut, serta membatasi konkurensi maksimum atau permintaan per detik (QPS). Fitur ini berguna dalam skenario berikut:
-
Kluster PolarDB mengalami beban database tinggi akibat kueri SQL lambat yang memengaruhi operasi bisnis normal.
-
Anda ingin membatasi sumber daya yang tersedia untuk jenis kueri SQL berisiko tertentu atau sepenuhnya memblokir eksekusinya.
Prosedur
Untuk mengaktifkan fitur Pembatasan SQL, hubungi kami.
-
Masuk ke PolarDB console. Di panel navigasi kiri, klik Clusters. Pilih region tempat kluster berada, lalu klik ID kluster untuk membuka halaman detail kluster.
-
Di panel navigasi kiri, klik .
-
Pada tab SQL throttling, klik Add untuk membuat aturan pembatasan SQL baru.
-
Pada kotak dialog Create SQL Throttling Rule, atur parameter berikut lalu klik OK.
Category
Parameter
Description
Basic Information
Rule Name
Nama aturan pembatasan. Nama harus memenuhi persyaratan berikut:
-
Maksimal 30 karakter.
-
Hanya boleh berisi huruf kapital, huruf kecil, dan angka.
Description
Opsional. Deskripsi untuk aturan pembatasan agar lebih mudah dikelola. Maksimal 64 karakter.
EndpointId
Pilih titik akhir tempat aturan pembatasan diterapkan.
Catatan-
Anda hanya dapat mengonfigurasi aturan pembatasan untuk titik akhir kluster atau titik akhir kustom (read/write atau read-only) yang menggunakan load balancing berbasis active-request. Pembatasan SQL tidak didukung untuk titik akhir utama atau titik akhir read-only yang menggunakan load balancing berbasis koneksi.
-
Aturan bersifat spesifik per titik akhir. Aturan yang dikonfigurasi untuk satu titik akhir hanya memengaruhi koneksi yang dibuat ke titik akhir tersebut.
Configurations
Rule Type
Pilih jenis aturan. Didukung Throttle Active Concurrent Statements dan Throttle QPS per Connection.
CatatanThrottle QPS per Connection membatasi jumlah permintaan per detik untuk satu koneksi. Jenis ini cocok untuk skenario yang menggunakan connection pool atau koneksi persisten. Untuk koneksi singkat, gunakan Throttle Active Concurrent Statements.
Current Mode
Pilih mode pencocokan untuk templat SQL. Didukung Template Match dan Full-text Match. Untuk informasi selengkapnya tentang perbedaan kedua mode tersebut, lihat Template match vs. full-text match.
Database Account Name
Menentukan akun tempat aturan diterapkan. Anda dapat menentukan hingga 10 akun, dipisahkan koma. Jika dikosongkan, aturan berlaku untuk semua akun.
Database Name
Menentukan database tempat aturan diterapkan. Anda dapat menentukan hingga 10 database, dipisahkan koma. Jika dikosongkan, aturan berlaku untuk semua database.
SQL Template
Konfigurasikan templat SQL. Untuk informasi selengkapnya, lihat SQL templates and matching modes.
Maximum Waiting Queue Length
Panjang maksimum antrian tunggu. Nilainya berkisar antara 0 hingga 1024. Ketika konkurensi atau QPS dari kueri SQL yang cocok mencapai batas aturan, proksi menambahkan kueri ke antrian tunggu untuk dicoba ulang. Jika jumlah kueri dalam antrian melebihi batas ini, permintaan baru gagal dan error dikembalikan. Mengatur parameter ini dengan benar mencegah antrian tunggu terus bertambah hingga menyebabkan error out of memory (OOM) pada database proxy saat banyak kueri SQL dibatasi.
Maximum Active Concurrent Statements
Jumlah maksimum pernyataan konkuren aktif.
CatatanParameter ini wajib diisi hanya jika Throttle Active Concurrent Statements diatur ke Throttle Active Concurrent Statements.
Maximum QPS per Connection
QPS maksimum untuk setiap koneksi.
CatatanParameter ini wajib diisi hanya jika Throttle QPS per Connection diatur ke Throttle QPS per Connection.
-
Cara kerja
Pembatasan SQL diimplementasikan di tingkat database proxy. Anda mengonfigurasi aturan pembatasan pada database proxy untuk mengontrol konkurensi atau QPS dari pernyataan SQL tertentu yang diteruskan. Proses ini tidak menambahkan overhead pada node read/write atau read-only kluster database. Akibatnya, Anda hanya dapat mengonfigurasi aturan untuk titik akhir kluster dan titik akhir kustom yang meneruskan lalu lintas melalui proxy.
Templat SQL dan mode pencocokan
Template match vs. full-text match
Templat SQL dapat berupa pernyataan SQL apa pun yang mengikuti sintaks standar kluster atau . Database proxy memproses templat secara berbeda tergantung pada mode pencocokan yang dipilih.
-
Misalnya, Anda mengonfigurasi aturan pembatasan dengan templat SQL berikut:
SELECT * FROM tbl WHERE id < 1;-
Jika Anda memilih Template Match, templat SQL dinormalisasi: spasi tambahan dan komentar dihapus, serta konstanta seperti string dalam tanda kutip tunggal dan angka diganti dengan wildcard. Hasilnya:
-- Templated result SELECT * FROM tbl WHERE id < ? -
Jika Anda memilih Full-text Match, templat SQL juga dinormalisasi, tetapi konstanta tidak diganti. Hasilnya:
-- Normalized result only SELECT * FROM tbl WHERE id < 1
Database proxy kemudian menghasilkan pengenal unik untuk SQL yang telah diproses guna pencocokan selanjutnya.
-
-
Setelah aturan pembatasan diaktifkan, database proxy memproses setiap pernyataan SQL masuk dengan cara yang sama. Misalnya, pertimbangkan pernyataan SQL masuk berikut:
SELECT * FROM tbl WHERE id < 100;Dua jenis SQL yang dinormalisasi dihasilkan, dan pengenal uniknya dihitung untuk dicocokkan dengan aturan pembatasan:
-- Templated result SELECT * FROM tbl WHERE id < ? -- Normalized result only SELECT * FROM tbl WHERE id < 100
Setelah aturan Pembatasan SQL diaktifkan, database proxy mengevaluasi pernyataan terhadap aturan yang dikonfigurasi sebelum meneruskan pernyataan SQL. Jika aturan dikonfigurasi untuk Template Match, hasil templated digunakan untuk pencocokan. Jika aturan dikonfigurasi untuk Full-text Match, hasil normalized-only yang digunakan. Setelah ditemukan kecocokan, konkurensi atau QPS-nya dihitung, dan proxy melakukan aksi pembatasan yang sesuai.
Oleh karena itu, untuk pernyataan SQL dan templat SQL pada contoh sebelumnya, kecocokan hanya ditemukan jika aturan dikonfigurasi untuk Template Match.
Kueri terparameterisasi
Templat SQL mendukung kueri terparameterisasi yang menggunakan sintaks binding parameter PostgreSQL standar:
SELECT * FROM tbl WHERE id < $1 AND name = $2 LIMIT 1;
Baik pada mode Template Match maupun Full-text Match, bagian terparameterisasi diformat sebagai wildcard:
-- Templated result
SELECT * FROM tbl WHERE id < ? AND name = ? limit ?
-- Normalized result only
SELECT * FROM tbl WHERE id < ? AND name = ? limit 1
Oleh karena itu, untuk pernyataan SQL berikut:
SELECT * FROM tbl WHERE id < $1 AND name = 2 LIMIT 100;
Kecocokan ditemukan jika Current Mode diatur ke Template Match, tetapi tidak ditemukan jika Current Mode diatur ke Full-text Match.
Anda tidak dapat menggunakan karakter ? sebagai penanda parameter dalam templat SQL:
-- Invalid SQL template. This does not conform to standard PostgreSQL syntax and will not match any SQL.
SELECT ?, ?, ?;
-- Valid SQL template
SELECT $1, $2, $3;
Prepared statements
Saat aplikasi Anda menggunakan pernyataan prepared, pernyataan PREPARE itu sendiri tidak memicu pembatasan. Hanya pernyataan EXECUTE yang memicu pembatasan. Untuk pernyataan EXECUTE, bagian SQL dari pernyataan PREPARE yang sesuai diformat atau ditemplatkan untuk mencocokkan aturan.
Untuk informasi selengkapnya tentang pernyataan prepared, lihat PREPARE.
Contoh
Konfigurasikan aturan pembatasan dengan templat SQL berikut dan pilih Template Match sebagai mode pencocokan:
SELECT * FROM tbl WHERE id < $1 AND name > $2;
Untuk pernyataan SQL berikut:
-- The PREPARE statement does not trigger throttling.
PREPARE s1 AS SELECT * FROM tbl WHERE id < $1 AND name > 100;
-- The EXECUTE statement uses the SQL part from its corresponding PREPARE statement to match the throttling rule.
EXECUTE s1;
EXECUTE s1;
EXECUTE s1;
Tiga pernyataan EXECUTE tersebut akan mencocokkan aturan pembatasan dan dibatasi.
Demikian pula, jika Anda menggunakan pernyataan PREPARE dalam templat SQL aturan pembatasan, hanya bagian SQL dari pernyataan PREPARE yang diformat atau ditemplatkan untuk pembatasan. Oleh karena itu, dua templat SQL berikut setara saat membuat aturan:
-- Template 1
PREPARE s1 AS SELECT * FROM tbl WHERE id < $1 AND name > $2;
-- Template 2
SELECT * FROM tbl WHERE id < $1 AND name > $2;
Dukungan protokol kueri diperluas
Seperti halnya pernyataan prepared, saat driver aplikasi menggunakan protokol kueri diperluas, hanya pesan Execute yang memicu pembatasan. Untuk setiap pesan Execute, database proxy menemukan pesan Parse yang sesuai dan menggunakan SQL-nya untuk mencocokkan aturan pembatasan. Dengan demikian, Pembatasan SQL mendukung protokol kueri diperluas, sehingga Anda umumnya tidak perlu khawatir tentang protokol yang digunakan aplikasi Anda.
Untuk informasi selengkapnya tentang protokol kueri diperluas, lihat dokumentasi komunitas.
Batasan
Saat ini, fitur Pembatasan SQL memiliki batasan berikut:
-
Pembatasan tidak didukung untuk multi-pernyataan. Jika Anda menggunakan multi-pernyataan, tidak ada aturan pembatasan yang dikonfigurasi yang dipicu.
Multi-pernyataan mengacu pada teks SQL tunggal yang berisi beberapa pernyataan SQL yang dipisahkan titik koma. Berikut contoh multi-pernyataan yang dieksekusi menggunakan driver JDBC:
Statement statement = connection.createStatement(); statement.execute("select 1; select 2; select 3");Multi-pernyataan dapat mencocokkan beberapa aturan pembatasan secara bersamaan. Untuk mencegah perilaku tak terduga, pembatasan tidak didukung untuk multi-pernyataan.
-
Pembatasan tidak didukung untuk beberapa pernyataan khusus, seperti pernyataan kontrol transaksi dan prosedur tersimpan. Membatasi pernyataan kontrol transaksi seperti COMMIT akan mencegah transaksi berakhir secara normal. Oleh karena itu, pernyataan tersebut dikecualikan dari aturan pembatasan.
-
Saat klien atau driver menggunakan mode batching pernyataan, kueri SQL yang dibatch hanya memicu aturan pembatasan pertama yang cocok. Berikut contoh batching pernyataan menggunakan driver JDBC:
Statement statement = connection.createStatement(); statement.addBatch("select 1"); statement.addBatch("select 2"); statement.addBatch("select 3"); int[] result = statement.executeBatch(); statement.close(); connection.close();Seperti halnya multi-pernyataan, saat Anda menggunakan batching pernyataan, driver biasanya menggabungkan pesan protokol kueri diperluas untuk beberapa kueri SQL dan mengirimkannya sekaligus. Hal ini juga dapat mengakibatkan situasi di mana beberapa aturan pembatasan dicocokkan secara bersamaan. Dalam kasus ini, hanya aturan pembatasan pertama yang cocok yang berlaku. Pada contoh sebelumnya, jika aturan pembatasan untuk tiga templat SQL berikut dikonfigurasi pada titik akhir:
-- Template 1 SELECT 1; -- Template 2 SELECT 2; --Template 3 SELECT 3;Hanya Template 1 yang akan dicocokkan.
-
Huruf besar/kecil kata kunci dalam templat Anda harus sesuai dengan huruf besar/kecil dalam teks SQL yang ingin Anda batasi.
-
Templat SQL tidak mendukung templat untuk ekspresi panjang variabel, seperti
INatauANY, di mana jumlah elemennya dapat berbeda. Contohnya:-- SQL template SELECT * FROM tbl WHERE id IN ($1, $2, $3); -- SQL1, can match the template SELECT * FROM tbl WHERE id IN (1, 6, 8); -- SQL2, cannot match the template SELECT * FROM tbl WHERE id IN (1, 6, 8, 8); -
Saat tidak ada aturan pembatasan yang dikonfigurasi, aturan pertama yang Anda tambahkan tidak berlaku untuk koneksi yang sudah ada. Namun, jika sudah ada aturan yang dikonfigurasi di konsol (diaktifkan atau dinonaktifkan), penambahan, modifikasi, atau penghapusan aturan berikutnya berlaku secara real time untuk semua koneksi.
Catatan-
Jika aplikasi Anda menggunakan koneksi persisten dan Anda ingin aturan baru berlaku segera, kami menyarankan Anda mengonfigurasi dan menonaktifkan aturan arbitrer pada titik akhir tersebut. Dengan demikian, aturan berikutnya yang Anda tambahkan atau ubah akan berlaku untuk koneksi baru maupun yang sudah ada.
-
Jika versi PolarProxy Anda 2.3.58 atau lebih baru, penambahan, modifikasi, dan penghapusan aturan pembatasan berlaku secara real time untuk semua koneksi.
-
Perilaku pembatasan
Pembatasan SQL menggunakan templat SQL dan antrian tunggu untuk membatasi QPS atau konkurensi aktif. Pernyataan SQL harus mencocokkan aturan pembatasan sebelum QPS atau konkurensinya dihitung untuk aturan tersebut. Saat konkurensi atau QPS melebihi batas yang ditetapkan dalam aturan, database proxy menempatkan pernyataan SQL ke dalam antrian tunggu untuk dicoba ulang setelah jeda. Hal ini memastikan konkurensi atau QPS pada database tetap dalam batas yang dikonfigurasi.
Waktu jeda antrian tunggu berbanding terbalik dengan QPS atau konkurensi yang dikonfigurasi dalam aturan. Jumlah maksimum pernyataan SQL yang dapat menunggu dalam antrian untuk aturan tertentu dibatasi oleh parameter Maximum Waiting Queue Length. Jika batas ini terlampaui, proxy tidak meneruskan pernyataan SQL dan mengembalikan error berikut ke klien:
SELECT 123;
Current query is being throttled and waiting queue is full.
Error di atas tidak mengganggu atau mengubah status transaksi koneksi saat ini. Setelah menerima error ini, klien masih dapat memilih untuk commit atau rollback transaksi.
Selain itu, jika Anda mengatur Maximum Active Concurrent Statements atau Maximum QPS per Connection ke 0 dalam aturan pembatasan, pernyataan SQL apa pun yang cocok dengan aturan tersebut akan ditolak dan tidak diteruskan. Klien menerima error di atas secara langsung. Anda dapat menggunakan metode ini untuk sepenuhnya memblokir jenis pernyataan SQL tertentu.
-
Antrian tunggu memiliki interval percobaan ulang minimum. Jika Anda mengatur QPS maksimum yang tinggi, QPS aktual mungkin sedikit lebih rendah dari nilai yang ditetapkan.
-
Untuk ketersediaan tinggi, database proxy biasanya diterapkan dengan dua node atau lebih, dan koneksi klien didistribusikan secara acak di antara node tersebut. Parameter Maximum Active Concurrent Statements dan Maximum Waiting Queue Length dikonfigurasi di tingkat node. Setiap node menghitung konkurensi dan panjang antrian secara independen, sehingga konkurensi aktual tidak dapat dikontrol secara tepat. Anggap jumlah node adalah N, dan konfigurasi per node adalah C (Maximum Active Concurrent Statements) dan Q (Maximum Waiting Queue Length). Rentang konkurensi klien adalah
[C+Q, N×(C+Q)], dan rentang konkurensi aktif database adalah[C, N×C]. -
Setelah Anda mengonfigurasi aturan Pembatasan SQL apa pun, proxy harus menemplatkan setiap pernyataan SQL bisnis, menghasilkan pengenal unik, dan mencoba mencocokkannya dengan aturan, terlepas dari apakah ditemukan kecocokan atau tidak. Oleh karena itu, mengaktifkan Pembatasan SQL dapat menyebabkan penurunan kinerja penerusan sebesar 5% hingga 10%. Gunakan pembatasan hanya saat kueri SQL lambat secara signifikan memengaruhi operasi bisnis normal Anda. Setelah Anda menyelesaikan kueri SQL lambat tersebut, Anda dapat menonaktifkan aturan pembatasan di konsol. Aturan yang dinonaktifkan tidak berlaku tetapi disimpan, dan Anda dapat mengaktifkannya kembali kapan saja.