MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Caching Kueri MySQL &MariaDB Dengan ProxySQL &ClusterControl

Kueri harus di-cache di setiap basis data yang banyak dimuat, tidak ada cara bagi basis data untuk menangani semua lalu lintas dengan kinerja yang wajar. Ada berbagai mekanisme di mana cache kueri dapat diimplementasikan. Mulai dari cache kueri MySQL, yang dulu berfungsi dengan baik untuk sebagian besar read-only, beban kerja konkurensi rendah dan yang tidak memiliki tempat dalam beban kerja bersamaan yang tinggi (sejauh Oracle menghapusnya di MySQL 8.0), hingga penyimpanan nilai kunci eksternal seperti Redis, memcached, atau CouchBase.

Masalah utama dengan menggunakan penyimpanan data khusus eksternal (karena kami tidak akan merekomendasikan untuk menggunakan cache kueri MySQL kepada siapa pun) adalah bahwa ini adalah penyimpanan data lain yang harus dikelola. Ini adalah lingkungan lain yang harus dipelihara, menangani masalah skala, bug untuk di-debug, dan sebagainya.

Jadi mengapa tidak membunuh dua burung dengan satu batu dengan memanfaatkan proxy Anda? Asumsinya di sini adalah bahwa Anda menggunakan proxy di lingkungan produksi Anda, karena membantu memuat kueri keseimbangan di seluruh instance, dan menutupi topologi database yang mendasarinya dengan menyediakan titik akhir sederhana untuk aplikasi. ProxySQL adalah alat yang hebat untuk pekerjaan itu, karena juga dapat berfungsi sebagai lapisan caching. Dalam posting blog ini, kami akan menunjukkan cara menyimpan kueri di ProxySQL menggunakan ClusterControl.

Bagaimana Query Cache Bekerja di ProxySQL?

Pertama-tama, sedikit latar belakang. ProxySQL mengelola lalu lintas melalui aturan kueri dan dapat menyelesaikan caching kueri menggunakan mekanisme yang sama. ProxySQL menyimpan kueri yang di-cache dalam struktur memori. Data cache dikeluarkan menggunakan pengaturan time-to-live (TTL). TTL dapat didefinisikan untuk setiap aturan kueri secara individual sehingga terserah pengguna untuk memutuskan apakah aturan kueri akan ditentukan untuk setiap kueri individu, dengan TTL yang berbeda atau jika dia hanya perlu membuat beberapa aturan yang akan cocok dengan sebagian besar lalu lintas.

Ada dua pengaturan konfigurasi yang menentukan bagaimana cache kueri harus digunakan. Pertama, mysql-query_cache_size_MB yang mendefinisikan batas lunak pada ukuran cache kueri. Ini bukan batasan yang sulit sehingga ProxySQL mungkin menggunakan sedikit lebih banyak memori dari itu, tetapi itu cukup untuk menjaga penggunaan memori tetap terkendali. Pengaturan kedua yang dapat Anda atur adalah mysql-query_cache_stores_empty_result . Ini menentukan apakah kumpulan hasil kosong di-cache atau tidak.

Cache kueri proxySQL dirancang sebagai penyimpanan nilai kunci. Nilai adalah kumpulan hasil kueri dan kuncinya terdiri dari nilai gabungan seperti:pengguna, skema, dan teks kueri. Kemudian hash dibuat dari string tersebut dan hash tersebut digunakan sebagai kunci.

Menyiapkan ProxySQL sebagai Cache Kueri Menggunakan ClusterControl

Sebagai pengaturan awal, kami memiliki cluster replikasi dari satu master dan satu slave. Kami juga memiliki satu ProxySQL.

Ini sama sekali bukan penyiapan tingkat produksi karena kami harus menerapkan semacam ketersediaan tinggi untuk lapisan proxy (misalnya dengan menerapkan lebih dari satu instans ProxySQL, dan kemudian tetap hidup di atasnya untuk IP Virtual mengambang), tetapi itu akan lebih dari cukup untuk pengujian kami.

Pertama, kita akan memverifikasi konfigurasi ProxySQL untuk memastikan setelan cache kueri sesuai dengan yang kita inginkan.

256 MB cache kueri seharusnya benar dan kami ingin men-cache juga kumpulan hasil yang kosong - terkadang kueri yang tidak mengembalikan data masih harus melakukan banyak pekerjaan untuk memverifikasi bahwa tidak ada yang dikembalikan.

Langkah selanjutnya adalah membuat aturan kueri yang akan cocok dengan kueri yang ingin Anda cache. Ada dua cara untuk melakukannya di ClusterControl.

Menambahkan Aturan Kueri Secara Manual

Cara pertama membutuhkan sedikit lebih banyak tindakan manual. Menggunakan ClusterControl Anda dapat dengan mudah membuat aturan kueri apa pun yang Anda inginkan, termasuk aturan kueri yang melakukan caching. Pertama, mari kita lihat daftar aturannya:

Pada titik ini, kami memiliki seperangkat aturan kueri untuk melakukan pemisahan baca/tulis. Aturan pertama memiliki ID 100. Aturan kueri baru kami harus diproses terlebih dahulu sehingga kami akan menggunakan ID aturan yang lebih rendah. Mari kita buat aturan kueri yang akan melakukan caching kueri seperti ini:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c

Ada tiga cara mencocokkan kueri:Intisari, Intisari Cocok, dan Pola Cocok. Mari kita bicara sedikit tentang mereka di sini. Pertama, Cocokkan Intisari. Kita dapat mengatur di sini ekspresi reguler yang akan cocok dengan string kueri umum yang mewakili beberapa jenis kueri. Misalnya, untuk kueri kami:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c

Representasi generiknya adalah:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN ? AND ? ORDER BY c

Seperti yang Anda lihat, itu menghapus argumen ke klausa WHERE oleh karena itu semua kueri jenis ini direpresentasikan sebagai string tunggal. Opsi ini cukup bagus untuk digunakan karena cocok dengan seluruh jenis kueri dan, yang lebih penting, menghapus spasi putih apa pun. Ini membuatnya jauh lebih mudah untuk menulis ekspresi reguler karena Anda tidak perlu memperhitungkan jeda baris yang aneh, spasi putih di awal atau akhir string, dan seterusnya.

Intisari pada dasarnya adalah hash yang dihitung oleh ProxySQL melalui formulir Match Digest.

Terakhir, Pola Pencocokan cocok dengan teks kueri lengkap, seperti yang dikirim oleh klien. Dalam kasus kami, kueri akan memiliki bentuk:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c

Kami akan menggunakan Match Digest karena kami ingin semua kueri tersebut dicakup oleh aturan kueri. Jika kita ingin menyimpan kueri tertentu saja, opsi yang baik adalah menggunakan Pola Pencocokan.

Ekspresi reguler yang kami gunakan adalah:

SELECT DISTINCT c FROM sbtest[0-9]+ WHERE id BETWEEN \? AND \? ORDER BY c

Kami secara harfiah mencocokkan string kueri umum yang tepat dengan satu pengecualian - kami tahu bahwa kueri ini mengenai beberapa tabel oleh karena itu kami menambahkan ekspresi reguler untuk mencocokkan semuanya.

Setelah ini selesai, kita dapat melihat apakah aturan kueri berlaku atau tidak.

Kita dapat melihat bahwa 'Hits' meningkat yang berarti bahwa aturan kueri kita sedang digunakan. Selanjutnya, kita akan melihat cara lain untuk membuat aturan kueri.

Menggunakan ClusterControl untuk Membuat Aturan Kueri

ProxySQL memiliki fungsi yang berguna untuk mengumpulkan statistik kueri yang dirutekannya. Anda dapat melacak data seperti waktu eksekusi, berapa kali kueri tertentu dieksekusi, dan sebagainya. Data ini juga ada di ClusterControl:

Lebih baik lagi, jika Anda mengarahkan pada jenis kueri tertentu, Anda dapat membuat aturan kueri yang terkait dengannya. Anda juga dapat dengan mudah menyimpan cache jenis kueri khusus ini.

Seperti yang Anda lihat, beberapa data seperti Rule IP, Cache TTL atau Schema Name sudah terisi. ClusterControl juga akan mengisi data berdasarkan mekanisme pencocokan yang Anda putuskan untuk digunakan. Kita dapat dengan mudah menggunakan hash untuk jenis kueri tertentu atau kita dapat menggunakan Match Digest atau Match Pattern jika kita ingin menyempurnakan ekspresi reguler (misalnya melakukan hal yang sama seperti yang kita lakukan sebelumnya dan memperluas ekspresi reguler untuk mencocokkan semua tabel dalam skema sbtest).

Ini semua yang Anda butuhkan untuk membuat aturan cache kueri dengan mudah di ProxySQL. Unduh ClusterControl untuk mencobanya hari ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memantau Kontainer MySQL dengan Prometheus - Penerapan di Standalone dan Swarm::Bagian Satu

  2. 8 Cara Menambahkan Satu Jam ke Datetime di MariaDB

  3. Memaksimalkan Efisiensi Kueri Basis Data untuk MySQL - Bagian Kedua

  4. MariaDB untuk Memperkenalkan TO_CHAR()

  5. Bagaimana REPEAT() Bekerja di MariaDB