PolarDB for PostgreSQL menyediakan fitur Pembatasan SQL yang memungkinkan Anda mengonfigurasi aturan pengendalian aliran berdasarkan titik akhir untuk mencegah lalu lintas tidak biasa dari pernyataan SQL memengaruhi bisnis Anda. Topik ini menjelaskan cara menggunakan fitur tersebut.
Ikhtisar
Fitur Pembatasan SQL memungkinkan Anda mengonfigurasi aturan pengendalian aliran berdasarkan titik akhir 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 dapat digunakan dalam skenario berikut:
Kluster PolarDB mengalami pernyataan SQL lambat yang menyebabkan beban database tinggi dan mengganggu operasi bisnis normal.
Anda ingin membatasi sumber daya yang tersedia untuk jenis tertentu dari pernyataan SQL berisiko tinggi atau sepenuhnya menolak eksekusinya.
Prosedur
Untuk mengaktifkan fitur Pembatasan SQL, hubungi kami.
Masuk ke Konsol PolarDB. Di panel navigasi sebelah kiri, klik Cluster List. Pilih wilayah tempat kluster berada, lalu klik ID kluster target untuk membuka halaman detail kluster.
Di panel navigasi sebelah kiri, pilih .
Pada tab SQL Throttling, klik Add untuk membuat aturan pembatasan SQL.

Pada kotak dialog Create SQL Throttling Rule, atur parameter berikut dan klik OK.
Bagian
Parameter
Deskripsi
Basic Information
Rule Name
Nama aturan pengendalian aliran. Nama harus memenuhi persyaratan berikut:
Panjang maksimal 30 karakter.
Hanya terdiri dari huruf besar, huruf kecil, dan angka.
Rule Description
Opsional. Deskripsi aturan pengendalian aliran. Ini membantu manajemen di masa mendatang. Panjang deskripsi maksimal 64 karakter.
EndpointID
Pilih titik akhir tempat aturan pengendalian aliran diterapkan.
CatatanSaat ini, Anda hanya dapat mengonfigurasi aturan pengendalian aliran pada titik akhir kluster dan titik akhir kustom yang menggunakan penyeimbangan beban berdasarkan permintaan aktif. Titik akhir ini dapat bersifat read/write atau read-only. Titik akhir primer dan titik akhir read-only yang menggunakan penyeimbangan beban berdasarkan koneksi tidak mendukung pembatasan SQL.
Aturan pengendalian aliran yang dikonfigurasi pada titik akhir berbeda tidak saling memengaruhi. Aturan pengendalian aliran yang dikonfigurasi pada titik akhir yang sama hanya berlaku untuk koneksi bisnis yang menggunakan titik akhir tersebut.
Rule Configuration
Rule Type
Pilih mode aturan pengendalian aliran. Nilai yang valid adalah Throttle Active Concurrent Statements dan Throttle QPS Per Connection.
CatatanPengendalian aliran QPS per koneksi membatasi jumlah permintaan per detik untuk satu koneksi. Anda dapat menggunakan mode ini dalam skenario di mana sisi bisnis memiliki kolam koneksi atau menggunakan koneksi persisten. Dalam skenario dengan koneksi singkat, kami merekomendasikan agar Anda menggunakan pengendalian aliran pernyataan konkuren aktif.
Current Mode
Pilih mode pencocokan untuk templat SQL. Nilai yang valid adalah Template Match dan Full-text Match. Untuk informasi selengkapnya tentang perbedaan antara dua mode pencocokan tersebut, lihat Template matching dan full-text matching.
Database Account Name
Tentukan akun database tempat aturan pengendalian aliran diterapkan. Anda dapat menentukan hingga 10 akun. Pisahkan beberapa nama akun dengan koma (,). Jika Anda mengosongkan parameter ini, aturan akan berlaku untuk semua akun secara default.
Database Name
Tentukan database tempat aturan pengendalian aliran diterapkan. Anda dapat menentukan hingga 10 database. Pisahkan beberapa nama database dengan koma (,). Jika Anda mengosongkan parameter ini, aturan akan berlaku untuk semua database secara default.
SQL Template
Konfigurasikan templat SQL. Untuk informasi selengkapnya, lihat Templat SQL dan mode pencocokan.
Maximum Waiting Queue Length
Konfigurasikan panjang maksimum antrian tunggu. Nilainya harus berada dalam rentang 0 hingga 1024. Ketika konkurensi atau QPS pernyataan SQL yang cocok mencapai batas aturan, pernyataan tersebut masuk ke antrian penundaan untuk dicoba ulang. Ketika jumlah pernyataan SQL dalam antrian penundaan melebihi panjang maksimum, permintaan baru langsung mengembalikan kesalahan. Panjang maksimum antrian tunggu yang wajar dapat mencegah antrian penundaan terus bertambah tanpa batas ketika banyak pernyataan SQL dibatasi. Hal ini menghindari kesalahan kehabisan memori (OOM) pada proksi database.
Maximum Active Concurrent Statements
Tetapkan jumlah maksimum pernyataan konkuren aktif.
CatatanParameter ini hanya diperlukan ketika parameter Rule Type diatur ke Throttle Active Concurrent Statements.
Maximum QPS Per Connection
Tetapkan QPS maksimum untuk setiap koneksi.
CatatanParameter ini hanya diperlukan ketika parameter Rule Type diatur ke Throttle QPS Per Connection.
Cara Kerja
Pembatasan SQL adalah fitur yang diimplementasikan pada proksi database. Anda mengonfigurasi aturan pengendalian aliran pada proksi database untuk mengontrol konkurensi atau QPS pernyataan SQL tertentu yang diteruskan. Fitur ini tidak memengaruhi node read-write atau read-only dari kluster database, sehingga hanya dapat dikonfigurasi untuk titik akhir kluster atau titik akhir kustom.
Templat SQL dan mode pencocokan
Template matching dan full-text matching
Templat SQL dapat berupa pernyataan SQL apa pun yang mengikuti sintaks standar kluster PolarDB for PostgreSQL atau . Setelah Anda mengonfigurasi templat SQL, proksi database melakukan pra-pemrosesan berdasarkan mode pencocokan yang dipilih.
Misalnya, Anda mengonfigurasi aturan pengendalian aliran dengan templat SQL berikut:
SELECT * FROM tbl WHERE id < 1;Jika Anda memilih template matching, templat SQL dinormalisasi: spasi tambahan dan komentar dihapus, sedangkan bagian konstan seperti string dalam tanda kutip tunggal dan angka diganti dengan karakter wildcard. Hasilnya sebagai berikut:
-- Template result SELECT * FROM tbl WHERE id < ?Jika Anda memilih full-text matching, templat SQL juga dinormalisasi, tetapi bagian konstan tidak diganti. Hasilnya sebagai berikut:
-- Formatted result only SELECT * FROM tbl WHERE id < 1
Proksi database kemudian menghasilkan pengenal unik untuk pernyataan SQL yang telah diformat guna pencocokan selanjutnya.
Saat aturan pengendalian aliran diaktifkan, proksi database juga melakukan pra-pemrosesan setiap pernyataan SQL bisnis dengan cara yang mirip dengan templat SQL. Sebagai contoh, pertimbangkan pernyataan SQL bisnis berikut:
SELECT * FROM tbl WHERE id < 100;Dua versi pernyataan SQL yang telah diformat juga dihasilkan, pengenal unik dihitung, dan upaya pencocokan dengan aturan pengendalian aliran dilakukan:
-- Template result SELECT * FROM tbl WHERE id < ? -- Formatted result only SELECT * FROM tbl WHERE id < 100
Setelah aturan pembatasan SQL diaktifkan, proksi database menelusuri aturan pengendalian aliran yang telah dikonfigurasi sebelum meneruskan pernyataan SQL saat ini. Jika aturan dikonfigurasi untuk template matching, hasil templated digunakan untuk mencocokkan templat SQL dalam aturan. Jika aturan dikonfigurasi untuk full-text matching, hasil formatted digunakan untuk pencocokan. Setelah terjadi kecocokan, konkurensi atau QPS dicatat, dan operasi pengendalian aliran yang sesuai dilakukan.
Oleh karena itu, dalam contoh sebelumnya, aturan hanya terpicu ketika template matching dikonfigurasi.
Dukungan parameterisasi
Templat SQL mendukung sintaks parameterisasi yang konsisten dengan sintaks pengikatan parameter standar PostgreSQL:
SELECT * FROM tbl WHERE id < $1 AND name = $2 LIMIT 1;Bagian yang diparameterisasi diformat sebagai karakter wildcard baik dalam template matching maupun full-text matching:
-- Template result
SELECT * FROM tbl WHERE id < ? AND name = ? limit ?
-- Formatted result only
SELECT * FROM tbl WHERE id < ? AND name = ? limit 1Sebagai contoh, untuk pernyataan SQL bisnis berikut:
SELECT * FROM tbl WHERE id < $1 AND name = 2 LIMIT 100;Aturan sebelumnya akan terpicu jika current mode diatur ke template matching, tetapi tidak akan terpicu jika diatur ke full-text matching.
Anda tidak dapat menggunakan simbol ? secara langsung untuk parameterisasi dalam templat SQL:
-- Ini adalah templat SQL yang tidak valid. Tidak mengikuti sintaks standar PostgreSQL dan tidak akan mencocokkan pernyataan SQL apa pun.
SELECT ?, ?, ?;
-- Ini adalah templat SQL yang valid.
SELECT $1, $2, $3;Pernyataan prepared
Saat bisnis Anda menggunakan pernyataan prepared, pernyataan PREPARE itu sendiri tidak memicu pembatasan—hanya pernyataan EXECUTE yang memicunya. Untuk pernyataan EXECUTE, bagian SQL dalam pernyataan PREPARE yang sesuai diformat atau ditemplatkan untuk mencocokkan aturan.
Untuk informasi selengkapnya tentang pernyataan prepared, lihat PREPARE.
Contoh
Gunakan templat SQL berikut untuk mengonfigurasi aturan pembatasan dengan memilih template matching sebagai mode pencocokan:
SELECT * FROM tbl WHERE id < $1 AND name > $2;Untuk pernyataan SQL bisnis berikut:
-- Pernyataan PREPARE tidak memicu pembatasan.
PREPARE s1 AS SELECT * FROM tbl WHERE id < $1 AND name > 100;
-- Pernyataan EXECUTE menggunakan bagian SQL dalam pernyataan PREPARE yang sesuai untuk mencocokkan aturan pembatasan.
EXECUTE s1;
EXECUTE s1;
EXECUTE s1;Ketiga pernyataan EXECUTE tersebut akan memicu aturan pembatasan dan dibatasi.
Demikian pula, saat Anda menggunakan pernyataan PREPARE dalam templat SQL aturan pembatasan, hanya bagian SQL dalam pernyataan PREPARE yang diformat atau ditemplatkan untuk pembatasan. Oleh karena itu, kedua 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 diperluas
Mirip dengan pernyataan prepared, ketika driver bisnis menggunakan protokol diperluas, hanya pesan Execute yang memicu pembatasan. Untuk setiap pesan Execute, proksi database menemukan pesan Parse yang sesuai dan menghitung templat SQL untuk mencocokkan aturan pembatasan. Dengan demikian, pembatasan SQL mendukung protokol diperluas, sehingga Anda tidak perlu khawatir tentang protokol yang digunakan oleh aplikasi Anda.
Untuk informasi selengkapnya tentang protokol diperluas, lihat dokumentasi PostgreSQL.
Batasan
Fitur pembatasan SQL memiliki batasan berikut:
SQL multi-pernyataan tidak didukung untuk pembatasan. Jika Anda menggunakan SQL multi-pernyataan, tidak ada aturan pembatasan yang dikonfigurasi yang akan dipicu.
SQL multi-pernyataan mengacu pada teks SQL tunggal yang berisi beberapa pernyataan SQL yang dipisahkan oleh titik koma. Berikut contoh eksekusi multi-pernyataan menggunakan driver Java Database Connectivity (JDBC):
Statement statement = connection.createStatement(); statement.execute("select 1; select 2; select 3");Eksekusi multi-pernyataan dapat memicu beberapa aturan pembatasan secara bersamaan. Untuk menghindari hasil yang tidak diinginkan, pembatasan tidak didukung.
Beberapa pernyataan khusus, seperti pernyataan kontrol transaksi dan prosedur tersimpan, tidak didukung untuk pembatasan. Membatasi pernyataan kontrol transaksi seperti COMMIT dapat mencegah transaksi berakhir secara normal, sehingga pernyataan tersebut tidak memicu aturan pembatasan.
Saat klien atau driver menggunakan mode batching pernyataan, hanya aturan pembatasan pertama yang dipicu untuk pernyataan SQL yang dibatch. Berikut contoh eksekusi batch 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();Mirip dengan eksekusi multi-pernyataan, saat menggunakan batching pernyataan, driver biasanya menggabungkan pesan protokol diperluas dari beberapa pernyataan SQL dan mengirimkannya sekaligus. Hal ini juga dapat menyebabkan beberapa aturan pembatasan dipicu secara bersamaan. Dalam kasus ini, hanya aturan pembatasan pertama yang dipicu yang diaktifkan. Sebagai contoh, jika aturan pembatasan untuk ketiga templat SQL berikut dikonfigurasi secara bersamaan pada titik akhir:
-- Template 1 SELECT 1; -- Template 2 SELECT 2; --Template 3 SELECT 3;Hanya Template 1 yang dipicu.
Templat SQL tidak mendukung kata kunci case-insensitive. Saat mengonfigurasi templat SQL, huruf besar/kecil harus sesuai dengan teks SQL yang ingin Anda batasi.
Templat SQL tidak mendukung templating untuk ekspresi dengan panjang variabel seperti `in` atau `any` yang mengabaikan jumlah elemen. Misalnya:
-- SQL template SELECT * FROM tbl WHERE id IN ($1, $2, $3); -- SQL1, dapat memicu templat SELECT * FROM tbl WHERE id IN (1, 6, 8); -- SQL2, tidak dapat memicu templat SELECT * FROM tbl WHERE id IN (1, 6, 8, 8);Jika tidak ada aturan pembatasan yang dikonfigurasi, aturan baru yang ditambahkan tidak berlaku pada koneksi yang sudah ada. Namun, jika terdapat aturan pembatasan apa pun di konsol—terlepas dari status aktif atau tidak—operasi penambahan, pengubahan, atau penghapusan selanjutnya berlaku pada semua koneksi secara real time.
CatatanJika bisnis Anda menggunakan koneksi persisten dan Anda ingin aturan baru berlaku segera kapan saja, kami merekomendasikan agar Anda mengonfigurasi aturan arbitrer pada titik akhir yang sesuai, menonaktifkannya, lalu menyimpannya. Penambahan atau modifikasi aturan selanjutnya kemudian dapat berlaku pada koneksi baru maupun lama.
Jika versi proksi database adalah 2.3.58 atau lebih baru, penambahan, modifikasi, atau penghapusan aturan pembatasan dapat berlaku pada semua koneksi secara real time. Anda dapat melihat versi proksi database di konsol. Jika versi mesin minor tidak memenuhi persyaratan, Anda dapat meningkatkan versi proksi database.
Metode pembatasan
Saat ini, pembatasan SQL menggunakan templat SQL dan antrian penundaan untuk mengimplementasikan pembatasan QPS atau konkurensi aktif. Pernyataan SQL bisnis harus memicu aturan pembatasan agar QPS atau konkurensi pada aturan tersebut dapat dicatat. Ketika konkurensi atau QPS melebihi batas yang dikonfigurasi, proksi database menempatkan pernyataan SQL ke dalam antrian penundaan dan mencoba mengeksekusinya ulang setelah periode waktu tertentu. Pendekatan ini menjaga konkurensi atau QPS di sisi database agar tidak melebihi batas aturan.
Waktu penundaan dalam antrian berbanding terbalik dengan QPS atau konkurensi yang dikonfigurasi dalam aturan. Jumlah maksimum pernyataan SQL yang dapat memicu aturan dan menunggu dalam antrian penundaan dibatasi oleh panjang maksimum antrian tunggu yang dikonfigurasi. Jika batas tersebut terlampaui, proksi tidak meneruskan pernyataan SQL dan mengembalikan kesalahan berikut ke klien:
SELECT 123;
Current query is being throttled and waiting queue is full.Kesalahan di atas tidak mengganggu atau mengubah resolusi transaksi koneksi saat ini. Setelah menerima kesalahan ini, klien masih dapat memilih untuk commit atau rollback transaksi.
Selain itu, jika konkurensi aktif maksimum atau QPS maksimum per koneksi dalam aturan pembatasan SQL dikonfigurasi sebagai 0, setiap pernyataan SQL yang memicu aturan tersebut akan langsung ditolak, dan kesalahan di atas dikembalikan ke klien. Metode ini dapat digunakan untuk sepenuhnya menolak eksekusi kelas pernyataan SQL tertentu.
Antrian penundaan memiliki interval percobaan ulang minimum. Jika QPS maksimum yang dikonfigurasi besar, QPS aktual mungkin sedikit lebih rendah dari nilai yang dikonfigurasi.
Untuk ketersediaan tinggi (HA), proksi database biasanya ditempatkan pada dua node atau lebih. Koneksi klien dialokasikan secara acak ke node-node tersebut. Parameter Maximum Active Concurrent Statements dan Maximum Waiting Queue Length dikonfigurasi pada tingkat node, dan setiap node menghitung konkurensi serta panjang antrian secara independen. Akibatnya, konkurensi total aktual tidak dapat dikontrol secara tepat. Misalkan jumlah node adalah N, satu node dikonfigurasi dengan C untuk Maximum Active Concurrent Statements dan Q untuk Maximum Waiting Queue Length. Rentang konkurensi klien adalah
[C+Q, N × (C+Q)], sedangkan rentang konkurensi aktif database adalah[C, N × C].Setelah mengonfigurasi aturan pembatasan SQL, proksi melakukan beberapa operasi untuk setiap pernyataan SQL bisnis—terlepas dari apakah pernyataan tersebut memicu aturan atau tidak—termasuk templating, menghasilkan pengenal unik, dan mencoba mencocokkan aturan. Mengaktifkan pembatasan SQL dapat mengurangi kinerja penerusan sebesar 5% hingga 10%. Gunakan fitur ini hanya ketika pernyataan SQL lambat di sisi database memengaruhi operasi bisnis normal. Setelah masalah terselesaikan, Anda dapat menonaktifkan aturan pembatasan di konsol. Aturan yang dinonaktifkan tidak berlaku tetapi tetap disimpan dan dapat diaktifkan kapan saja.







