ProxySQL ile MySQL Yük Dengeleme ve Akıllı Sorgu Yönlendirme: Derinlemesine Bir Bakış

 · 

ProxySQL ile MySQL Yük Dengeleme ve Akıllı Sorgu Yönlendirme: Derinlemesine Bir Bakış

ProxySQL ile MySQL Yük Dengeleme ve Akıllı Sorgu Yönlendirme Stratejileri

Veritabanı altyapılarında ölçeklenebilirlik, erişilebilirlik ve performans, kritik öneme sahip parametrelerdir. Özellikle yüksek trafikli uygulamalarda MySQL sunucularının doğrudan kullanımı, bağlantı yönetiminden sorgu optimizasyonuna kadar çeşitli darboğazlar yaratabilir. Bu noktada, ProxySQL gibi veritabanı proxy çözümleri devreye girerek bu zorluklara sofistike yanıtlar sunar.

ProxySQL Nedir ve Neden Gerekli?

ProxySQL, MySQL sunucuları ile uygulama istemcileri arasına konumlanan yüksek performanslı, açık kaynaklı bir proxy katmanıdır. Temel amacı, veritabanı trafiğini akıllıca yöneterek performansı artırmak, yükü dengelemek ve veritabanı operasyonlarını daha esnek hale getirmektir. Doğrudan istemcilerin MySQL sunucularına bağlanması yerine, tüm trafik ProxySQL üzerinden geçer. Bu durum, bağlantı havuzlama, sorgu yönlendirme ve yük dengeleme gibi gelişmiş özelliklerin merkezi bir noktadan yönetilmesine olanak tanır.

Klasik bir MySQL kurulumunda, uygulamanın tek bir ana (primary) sunucuya veya manuel olarak yapılandırılmış replikalara doğrudan bağlanması çeşitli sorunları beraberinde getirir. Örneğin, okuma yoğun uygulamalarda primary sunucu üzerindeki yük orantısız artabilir. Ayrıca, bir sunucunun bakıma alınması veya arızalanması durumunda uygulama kesintiye uğrayabilir. ProxySQL, bu tür senaryolarda esneklik sağlayarak operasyonel sürekliliği maksimize eder.

ProxySQL Mimarisi ve Temel Bileşenleri

ProxySQL, istemci bağlantılarını kabul eden, gelen sorguları ayrıştıran ve yapılandırılmış kurallara göre uygun MySQL arka uç sunucularına yönlendiren bir katman olarak çalışır. İç mimarisi, yüksek düzeyde özelleştirilebilir bir dizi bileşenden oluşur:

  • Connection Pool: İstemci bağlantılarını önbelleğe alarak MySQL sunucuları üzerindeki bağlantı kurma yükünü azaltır ve daha hızlı bağlantı süreleri sağlar.
  • Query Router: Gelen sorguları analiz eder ve tanımlanmış kurallara göre farklı hostgroup'lara (sunucu grupları) yönlendirir. Bu, okuma/yazma ayrımı (read/write split) gibi stratejilerin temelini oluşturur.
  • Admin Interface: ProxySQL'in çalışma zamanı yapılandırmasını ve izlemesini sağlayan MySQL uyumlu bir arayüzdür. Bu arayüz üzerinden dinamik olarak sunucular eklenebilir, çıkarılabilir, sorgu kuralları tanımlanabilir.
  • Scheduler: Belirli aralıklarla arka plan görevlerini (örneğin, sunucu sağlık kontrolleri) çalıştırır.

Yük Dengeleme (Load Balancing) Mekanizmaları

ProxySQL, birden fazla MySQL sunucusu arasında yükü dengeleyerek her sunucunun optimum kapasitede çalışmasını sağlar. Sunucular, 'hostgroup' adı verilen mantıksal gruplar altında toplanır. Bir sorgu, bir hostgroup'a yönlendirildiğinde, ProxySQL o gruptaki uygun sunucular arasında yük dengeleme yapar.

Yaygın yük dengeleme stratejileri şunlardır:

  • Round-Robin: Sorguları sırayla sunuculara dağıtır.
  • Least Connections: En az aktif bağlantıya sahip sunucuya sorguyu yönlendirir.
  • Latency Aware: En düşük gecikme süresine sahip sunucuya öncelik verir.

Arka uç MySQL sunucularını ProxySQL'e eklemek için admin arayüzü kullanılır:

-- MySQL sunucularını ekleme (hostgroup_id, hostname, port, weight, status)INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections) VALUES (10, '192.168.1.10', 3306, 1000, 2000);INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections) VALUES (20, '192.168.1.20', 3306, 100, 1000);INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections) VALUES (20, '192.168.1.21', 3306, 100, 1000);-- Değişiklikleri çalışma zamanına uygula ve diske kaydetLOAD MYSQL SERVERS TO RUNTIME;SAVE MYSQL SERVERS TO DISK;

Yukarıdaki örnekte, hostgroup_id=10 primary sunucuyu, hostgroup_id=20 ise replika sunucuları temsil edebilir. weight parametresi, sunucunun trafik alma oranını belirler; daha yüksek ağırlık, daha fazla trafik anlamına gelir. max_connections ise o sunucuya açılacak maksimum bağlantı sayısını sınırlar.

Akıllı Sorgu Yönlendirme (Query Routing)

ProxySQL'in en güçlü özelliklerinden biri, sorgu bazında yönlendirme yapabilmesidir. mysql_query_rules tablosu kullanılarak, belirli pattern'lere uyan sorgular farklı hostgroup'lara veya hatta farklı kullanıcılara yönlendirilebilir. Bu, özellikle okuma/yazma ayrımı (read/write split) ve özel iş yüklerinin izolasyonu için kritiktir.

Temel bir okuma/yazma ayrımı kuralı şu şekilde tanımlanabilir:

-- Yazma sorgularını (DML) primary hostgroup'a (10) yönlendirINSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FOR UPDATE|^(INSERT|UPDATE|DELETE|REPLACE|TRUNCATE|CREATE|ALTER|DROP).*', 10, 1);-- Okuma sorgularını (SELECT) replika hostgroup'a (20) yönlendirINSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (2, 1, '^SELECT', 20, 1);-- Değişiklikleri çalışma zamanına uygula ve diske kaydetLOAD MYSQL QUERY RULES TO RUNTIME;SAVE MYSQL QUERY RULES TO DISK;

Yukarıdaki kurallarda, match_digest alanı sorgunun özetine (digest) veya tam metnine (regex kullanarak) göre eşleşir. destination_hostgroup, sorgunun yönlendirileceği sunucu grubunu belirtir. apply=1, kural eşleştiğinde diğer kuralların işlenmesini durdurur.

Daha spesifik bir senaryo olarak, belirli bir veritabanı veya tablodan gelen SELECT sorgularını özel bir raporlama hostgroup'una yönlendirebiliriz:

-- 'rapor_db' veritabanındaki SELECT sorgularını hostgroup 30'a yönlendirINSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (3, 1, 'SELECT .* FROM rapor_db\..*', 30, 1);-- Değişiklikleri çalışma zamanına uygula ve diske kaydetLOAD MYSQL QUERY RULES TO RUNTIME;SAVE MYSQL QUERY RULES TO DISK;

Production Senaryoları ve Uygulama

Senaryo 1: Yüksek Trafikli E-ticaret Uygulaması için Okuma/Yazma Ayrımı

Bir e-ticaret platformunda, ürün detay sayfalarının görüntülenmesi, kategori listelemeleri gibi okuma işlemleri, sipariş oluşturma, stok güncelleme gibi yazma işlemlerine kıyasla kat kat fazladır. Tüm bu trafiğin tek bir primary MySQL sunucusuna yönlendirilmesi, CPU, I/O ve bağlantı havuzu tükenmelerine yol açarak performansı ciddi şekilde düşürebilir. ProxySQL ile, tüm SELECT sorguları (FOR UPDATE içermeyenler) birden fazla replika sunucusuna dağıtılırken, INSERT, UPDATE, DELETE gibi DML işlemleri primary sunucuya yönlendirilir. Bu sayede primary sunucunun yazma iş yüküne odaklanması sağlanır ve okuma trafiği yatay olarak ölçeklendirilebilir. Uygulama katmanında herhangi bir kod değişikliği yapılmasına gerek kalmaz.

Senaryo 2: Bakım Sürecinde Kesintisiz Operasyon

Bir MySQL primary sunucusunda planlı bir bakım (örneğin işletim sistemi yaması, donanım yükseltme) yapılması gerektiğinde, geleneksel yaklaşımlar genellikle kısa süreli de olsa bir kesinti gerektirir. ProxySQL bu senaryoda büyük esneklik sunar. Mevcut primary sunucu hostgroup'undan kolayca çıkarılabilir ve yerine yeni bir primary (veya mevcut bir replikanın primary'ye yükseltilmesi) eklenir. Bu işlemler ProxySQL'in admin arayüzü üzerinden dinamik olarak yapılır. ProxySQL, sunucunun durumunu (UP/DOWN/SHUNNED) anlık olarak izlediği için, istemci bağlantılarını sorunsuz bir şekilde yeni, sağlıklı sunucuya yönlendirir. Uygulama, bağlantı hatası veya kesinti yaşamaz, çünkü ProxySQL kendisi bağlantıyı yeniden kurar ve sorguyu yönlendirir.

Senaryo 3: Özel Raporlama Sorgularını İzole Etme

Finansal raporlama veya derinlemesine analizler için kullanılan karmaşık ve uzun süren sorgular, genellikle mevcut OLTP (Online Transaction Processing) veritabanı sunucularında yoğun kaynak tüketimine yol açar. Bu, müşteri odaklı uygulamaların performansını olumsuz etkiler. ProxySQL kullanarak, belirli bir kullanıcıdan (örneğin, reporting_user) veya belirli bir sorgu pattern'ine uyan (örneğin, SELECT ... FROM large_financial_data ... GROUP BY ...) sorguları özel bir 'raporlama hostgroup'una yönlendirebiliriz. Bu hostgroup, daha yüksek CPU veya RAM'e sahip, özel olarak raporlama iş yükleri için optimize edilmiş sunuculardan oluşabilir. Böylece, raporlama işlemleri ana veritabanı iş yükünden izole edilerek her iki tarafın da optimum performansla çalışması sağlanır.

ProxySQL Yönetimi ve İzleme

ProxySQL, mysql_servers, mysql_query_rules gibi tablolar aracılığıyla yönetilir. Tüm yapılandırma değişiklikleri admin arayüzünden yapılır ve LOAD ... TO RUNTIME komutlarıyla aktif hale getirilir, SAVE ... TO DISK ile kalıcı hale getirilir. İzleme için stats_mysql_connection_pool, stats_mysql_query_digest gibi tablolar detaylı performans metrikleri sunar. Bu metrikler, Prometheus ve Grafana gibi araçlarla entegre edilerek kapsamlı bir gözlem panosu oluşturulabilir, böylece potansiyel darboğazlar ve anormallikler proaktif olarak tespit edilebilir.

Sonuç

ProxySQL, modern MySQL altyapılarında yüksek performans, ölçeklenebilirlik ve operasyonel esneklik sağlamak için vazgeçilmez bir araçtır. Akıllı yük dengeleme ve sorgu yönlendirme yetenekleri sayesinde, karmaşık veritabanı mimarilerini basitleştirir, uygulama katmanını veritabanı topolojisinden soyutlar ve kesintisiz operasyon kabiliyetini artırır. Doğru yapılandırıldığında, ProxySQL veritabanı performansını maksimize ederken, yönetim yükünü önemli ölçüde azaltır ve kritik iş yüklerinin güvenilirliğini artırır.

← Blog Listesine Dön