PolarDB for PostgreSQL menyediakan fitur Pembatasan SQL yang memungkinkan Anda mengonfigurasi aturan pembatasan untuk titik akhir tertentu guna mencegah traffic tidak normal memengaruhi layanan Anda. Topik ini menjelaskan cara menggunakan fitur tersebut.
Pendahuluan
Fitur Pembatasan SQL memungkinkan Anda mengonfigurasi aturan pembatasan untuk titik akhir tertentu. Anda dapat menggunakan templat SQL untuk mencocokkan pernyataan SQL yang dieksekusi pada titik akhir tersebut dan 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 mengganggu 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 sebelah kiri, klik Clusters. Pilih region tempat kluster berada, lalu klik ID kluster untuk membuka halaman detail kluster.
Di panel navigasi sebelah kiri, klik .
Di 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 terdiri dari huruf kapital, huruf kecil, dan angka.
Description
Opsional. Deskripsi aturan pembatasan untuk memudahkan manajemen. Maksimal 64 karakter.
EndpointId
Pilih titik akhir tempat aturan pembatasan diterapkan.
CatatanAnda 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 ke titik akhir tersebut.
Configurations
Rule Type
Pilih jenis aturan. Tersedia 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. Tersedia Template Match dan Full-text Match. Untuk informasi selengkapnya tentang perbedaan kedua mode tersebut, lihat Template match vs. full-text match.
Database Account Name
Tentukan akun tempat aturan diterapkan. Anda dapat menentukan hingga 10 akun, dipisahkan dengan koma. Jika dikosongkan, aturan berlaku untuk semua akun.
Database Name
Tentukan database tempat aturan diterapkan. Anda dapat menentukan hingga 10 database, dipisahkan dengan 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 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 akan gagal dan error dikembalikan. Mengatur parameter ini dengan benar mencegah antrian tunggu tumbuh tanpa batas dan 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 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 traffic 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 PolarDB for PostgreSQL. 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 adalah:
-- Templated result SELECT * FROM tbl WHERE id < ?Jika Anda memilih Full-text Match, templat SQL juga dinormalisasi, tetapi konstanta tidak diganti. Hasilnya adalah:
-- 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 setiap pernyataan terhadap aturan yang dikonfigurasi sebelum meneruskannya. 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 ketika 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 1Oleh 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 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;Pernyataan yang disiapkan
Ketika 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;Ketiga pernyataan EXECUTE akan cocok dengan 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 extended
Serupa dengan pernyataan prepared, ketika driver aplikasi menggunakan protokol kueri extended, 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. Oleh karena itu, Pembatasan SQL mendukung protokol kueri extended, sehingga Anda biasanya tidak perlu khawatir tentang protokol yang digunakan aplikasi Anda.
Untuk informasi selengkapnya tentang protokol kueri extended, lihat dokumentasi komunitas.
Batasan
Saat ini, fitur Pembatasan SQL memiliki batasan berikut:
Pembatasan tidak didukung untuk multi-statement. Jika Anda menggunakan multi-statement, tidak ada aturan pembatasan yang dikonfigurasi yang dipicu.
Multi-statement mengacu pada teks SQL tunggal yang berisi beberapa pernyataan SQL yang dipisahkan oleh titik koma. Berikut adalah contoh multi-statement yang dieksekusi menggunakan driver JDBC:
Statement statement = connection.createStatement(); statement.execute("select 1; select 2; select 3");Multi-statement dapat mencocokkan beberapa aturan pembatasan secara bersamaan. Untuk mencegah perilaku tak terduga, pembatasan tidak didukung untuk multi-statement.
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.
Ketika klien atau driver menggunakan mode batching pernyataan, kueri SQL yang dibatch hanya memicu aturan pembatasan pertama yang cocok. Berikut adalah 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-statement, saat Anda menggunakan batching pernyataan, driver biasanya menggabungkan pesan protokol kueri extended untuk beberapa kueri SQL dan mengirimkannya sekaligus. Hal ini juga dapat menyebabkan 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);Ketika tidak ada aturan pembatasan yang dikonfigurasi, aturan pertama yang Anda tambahkan tidak berlaku untuk koneksi yang sudah ada. Namun, jika terdapat aturan yang sudah dikonfigurasi di konsol (diaktifkan atau dinonaktifkan), penambahan, modifikasi, atau penghapusan aturan berikutnya berlaku secara real time untuk semua koneksi.
CatatanJika 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 modifikasi 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. Anda dapat memeriksa versi PolarProxy di konsol. Jika versi minor sudah usang, Anda dapat memperbarui PolarProxy.
Perilaku pembatasan
Pembatasan SQL menggunakan templat SQL dan antrian tunggu untuk membatasi QPS atau konkurensi aktif. Pernyataan SQL harus cocok dengan aturan pembatasan sebelum QPS atau konkurensinya dihitung untuk aturan tersebut. Ketika 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 akan langsung menerima error di atas. Anda dapat menggunakan metode ini untuk sepenuhnya memblokir jenis pernyataan SQL tertentu.
Antrian tunggu memiliki interval coba 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 atau lebih node, 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. Asumsikan 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 performa penerusan sebesar 5% hingga 10%. Gunakan pembatasan hanya ketika 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.