ProxySQL ile MySQL Veritabanlarında Akıllı Yük Dengeleme ve Gelişmiş Query Yönlendirme Stratejileri

 · 

ProxySQL ile MySQL Veritabanlarında Akıllı Yük Dengeleme ve Gelişmiş Query Yönlendirme Stratejileri

ProxySQL ile MySQL Veritabanlarında Akıllı Yük Dengeleme ve Gelişmiş Query Yönlendirme Stratejileri

MySQL tabanlı altyapılarda performans, yüksek erişilebilirlik ve ölçeklenebilirlik, sistem mimarlarının ve veritabanı yöneticilerinin öncelikli hedefleridir. Bu hedeflere ulaşmak için çoğunlukla replikasyon setleri ve çeşitli yük dengeleme çözümleri kullanılır. ProxySQL, bu mimarilerde kritik bir bileşen olarak öne çıkar; hem sorgu yönlendirme yetenekleri hem de dinamik yük dengeleme algoritmalarıyla veritabanı katmanının esnekliğini ve dayanıklılığını artırır.

ProxySQL Nedir?

ProxySQL, MySQL protokolü için yüksek performanslı, açık kaynaklı bir proxy sunucusudur. Uygulama ile MySQL sunucuları arasında bir katman oluşturarak sorguları analiz eder, yönlendirir, önbelleğe alır ve gerektiğinde yeniden yazar. Gelişmiş kurallar seti sayesinde farklı sorgu tiplerini (okuma, yazma, raporlama) farklı MySQL sunucularına yönlendirebilir, böylece kaynakların en verimli şekilde kullanılmasını sağlar.

Mimari ve Temel Bileşenler

ProxySQL, bir veya daha fazla MySQL sunucusu önünde konumlanır. Uygulama, doğrudan MySQL sunucusuna bağlanmak yerine ProxySQL'e bağlanır. ProxySQL, gelen bağlantıları ve sorguları kendi içinde işler:

  • Admin Interface: ProxySQL'i yapılandırmak ve yönetmek için kullanılan bir MySQL istemcisi üzerinden erişilebilen özel bir arayüzdür.
  • Runtime & Disk Configuration: Konfigürasyonlar bellekte (runtime) ve diskte ayrı ayrı tutulur. Değişiklikler önce runtime'a yüklenir, ardından disk üzerine kaydedilir.
  • Hostgroups: MySQL sunucularını mantıksal gruplara ayırmak için kullanılır. Genellikle birincil (master) ve ikincil (replica) sunucular farklı hostgroup'larda yer alır.
  • Query Rules: Sorguları belirli kriterlere göre analiz ederek farklı hostgroup'lara veya sunuculara yönlendiren kurallar setidir.
  • Connection Pooling: Uygulama bağlantılarını optimize ederek MySQL sunucuları üzerindeki yükü azaltır.

Yük Dengeleme Mekanizmaları

ProxySQL, birden fazla MySQL sunucusu arasında sorguları dağıtmak için çeşitli yük dengeleme algoritmaları sunar:

Read/Write Split (Okuma/Yazma Ayrımı)

En yaygın kullanım senaryolarından biri, okuma (SELECT) sorgularını replikalara, yazma (INSERT, UPDATE, DELETE) sorgularını ise birincil (master) sunucuya yönlendirmektir. Bu, birincil sunucunun yazma işlemlerine odaklanmasını sağlarken, okuma yükünü replikalara dağıtarak genel veritabanı performansını artırır.

INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (10, 1, '^SELECT.*', 20, 1); -- Okuma sorgularını hostgroup 20'ye yönlendir. Hostgroup 20 genellikle replikaları içerir.

Yukarıdaki örnekte, digest'i 'SELECT' ile başlayan tüm sorgular (basit bir regex örneği) hostgroup 20'ye yönlendirilecektir. hostgroup 20 genellikle okuma replikalarını barındırır.

Algoritmalar ve Hostgroup'lar

ProxySQL, bir hostgroup içinde birden fazla sunucuya sorgu dağıtmak için farklı algoritmalar kullanabilir:

  • round-robin: Sorguları sırayla tüm sunuculara dağıtır.
  • least_connections: En az aktif bağlantıya sahip sunucuya sorgu gönderir.
  • least_latency_multiplier: Sunucu gecikmelerini dikkate alarak daha düşük gecikmeli sunuculara öncelik verir.

Her hostgroup için varsayılan bir yük dengeleme algoritması tanımlanabilir.

Gelişmiş Query Yönlendirme

ProxySQL'in gücü, sadece basit okuma/yazma ayrımının ötesine geçen karmaşık sorgu yönlendirme kuralları oluşturma yeteneğinde yatar. Belirli bir veritabanına, kullanıcıya, tablolara veya hatta sorgu içeriğine (regex ile eşleşen) göre yönlendirme yapılabilir.

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (20, 1, '^SELECT\s+.*FROM\s+reporting_data.*', 30, 1); -- 'reporting_data' tablosundan okuma yapan sorguları hostgroup 30'a yönlendir.

Bu kural, reporting_data tablosundan veri çeken tüm SELECT sorgularını hostgroup 30'a yönlendirir. Bu hostgroup, özel bir raporlama veritabanı replikası veya daha az kritik bir sunucu olabilir, böylece ana üretim veritabanının performansı etkilenmez.

Üretim Senaryosu: Yüksek Trafikli E-ticaret Platformu

Bir e-ticaret platformunun yoğun Black Friday döneminde milyonlarca kullanıcı isteğiyle karşılaştığını varsayalım. Platformun veritabanı katmanı, tek bir MySQL Master ve üç Replikadan (Replica A, B, C) oluşuyor. Uygulama, hem ürün listeleme (okuma) hem de sipariş oluşturma (yazma) işlemleri yapıyor. Ayrıca, arka planda çalışan analitik araçlar (reporting_data tablosu üzerinde çalışan) sürekli olarak büyük sorgular çalıştırıyor.

ProxySQL Çözümü

ProxySQL'i devreye alarak aşağıdaki konfigürasyonlar yapılır:

  1. Hostgroup 10 (Master): Yalnızca ana MySQL sunucusunu içerir. Tüm INSERT, UPDATE, DELETE sorguları bu hostgroup'a yönlendirilir.
  2. Hostgroup 20 (Replicas): Replica A ve Replica B sunucularını içerir. Kullanıcıların ürün listeleme gibi yoğun okuma sorguları bu hostgroup'a, round-robin veya least_connections algoritmasıyla dağıtılır.
  3. Hostgroup 30 (Reporting Replica): Sadece Replica C sunucusunu içerir. Analitik araçlardan gelen, reporting_data tablosuna yönelik büyük ve karmaşık SELECT sorguları bu hostgroup'a yönlendirilir.

Bu yapılandırma sayesinde:

  • Yazma işlemleri Master üzerinde tutularak veri tutarlılığı garanti altına alınır.
  • Kullanıcı arayüzünden gelen okuma istekleri (ürün listelemeleri) iki replikaya dengeli bir şekilde dağıtılarak yüksek performans ve düşük gecikme sağlanır.
  • Analitik sorguların neden olduğu yüksek yük, ayrı bir replikaya izole edilerek ana uygulamayı etkilemez.
  • Bir replika arızalandığında, ProxySQL otomatik olarak arızalı sunucuyu hostgroup'tan çıkarır ve sorguları kalan sunuculara yönlendirerek hizmet kesintisini minimize eder (otomatik failover).
  • Master sunucuya bir felaket durumunda otomatik veya manuel failover mekanizmalarıyla yeni bir Master atanması durumunda, ProxySQL konfigürasyonu güncellenerek uygulamanın kesintisiz çalışmaya devam etmesi sağlanır.

ProxySQL Kurulumu ve Temel Konfigürasyon

ProxySQL'in temel kurulumu ve konfigürasyonu, Admin arayüzü üzerinden veya yapılandırma dosyası aracılığıyla yapılabilir. Aşağıda Admin arayüzü üzerinden bir örnek verilmiştir.

MySQL Sunucularını Tanımlama

Öncelikle ProxySQL'e hangi MySQL sunucularını yöneteceğini bildirmemiz gerekir. Her sunucuya bir hostgroup_id atanır.

-- Master Sunucu (Hostgroup 10)INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (10, '192.168.1.10', 3306);LOAD MYSQL SERVERS TO RUNTIME;SAVE MYSQL SERVERS TO DISK;-- Replica Sunucular (Hostgroup 20)INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, '192.168.1.11', 3306);INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, '192.168.1.12', 3306);LOAD MYSQL SERVERS TO RUNTIME;SAVE MYSQL SERVERS TO DISK;-- Reporting Replica (Hostgroup 30)INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (30, '192.168.1.13', 3306);LOAD MYSQL SERVERS TO RUNTIME;SAVE MYSQL SERVERS TO DISK;

Burada Master sunucusu hostgroup_id=10, genel replikalar hostgroup_id=20 ve raporlama replikası hostgroup_id=30 olarak tanımlanmıştır.

MySQL Kullanıcılarını Tanımlama

Uygulamaların ProxySQL'e bağlanmak için kullanacağı kullanıcı bilgilerini tanımlarız. Bu kullanıcılar, gerçek MySQL sunucularındaki kullanıcılarla eşleşmelidir.

INSERT INTO mysql_users (username, password, default_hostgroup) VALUES ('app_user', 'app_password', 20); -- Varsayılan olarak okuma hostgroup'una yönlendir.LOAD MYSQL USERS TO RUNTIME;SAVE MYSQL USERS TO DISK;

app_user, ProxySQL'e bağlandığında varsayılan olarak hostgroup 20 (replikalar) ile iletişim kuracaktır. Ancak sorgu kuralları bu davranışı değiştirebilir.

Sorgu Yönlendirme Kuralları

Okuma/yazma ayrımı ve raporlama sorgularının yönlendirilmesi için kurallar oluşturulur.

-- Yazma sorgularını Master'a (Hostgroup 10) yönlendirINSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (100, 1, '^(INSERT|UPDATE|DELETE|REPLACE|CREATE|ALTER|DROP).*', 10, 1);-- Raporlama sorgularını Reporting Replica'ya (Hostgroup 30) yönlendirINSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (110, 1, '^SELECT\s+.*FROM\s+reporting_data.*', 30, 1);-- Diğer tüm okuma sorgularını Replikalar'a (Hostgroup 20) yönlendirINSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (120, 1, '^SELECT.*', 20, 1);LOAD MYSQL QUERY RULES TO RUNTIME;SAVE MYSQL QUERY RULES TO DISK;

Kurallar sırayla işlenir (rule_id'ye göre). rule_id=100 yazma sorgularını hostgroup 10'a, rule_id=110 raporlama sorgularını hostgroup 30'a ve son olarak rule_id=120 diğer tüm okuma sorgularını hostgroup 20'ye yönlendirir. apply=1 kuralın eşleştiğinde işlemeyi durdurmasını sağlar.

Konfigürasyonu Aktif Etme

Yapılan tüm değişiklikler LOAD TO RUNTIME ve SAVE TO DISK komutlarıyla kalıcı hale getirilir ve aktif edilir.

LOAD MYSQL SERVERS TO RUNTIME;SAVE MYSQL SERVERS TO DISK;LOAD MYSQL USERS TO RUNTIME;SAVE MYSQL USERS TO DISK;LOAD MYSQL QUERY RULES TO RUNTIME;SAVE MYSQL QUERY RULES TO DISK;

ProxySQL'in Avantajları

  • Yüksek Erişilebilirlik: Otomatik failover ve sağlık kontrolleri ile arızalı sunucuları algılayıp trafiği sağlıklı sunuculara yönlendirir.
  • Performans İyileştirmesi: Okuma/yazma ayrımı ve sorgu önbellekleme ile veritabanı yükünü dengeler ve gecikmeyi azaltır.
  • Ölçeklenebilirlik: Dinamik olarak yeni MySQL sunucuları eklenip çıkarılabilir, böylece veritabanı altyapısı kolayca ölçeklenebilir.
  • Esnek Yönlendirme: Gelişmiş kural setleri sayesinde karmaşık senaryolara uygun sorgu yönlendirmesi yapılabilir.
  • Şeffaflık: Uygulama katmanında değişiklik yapmaya gerek kalmadan veritabanı mimarisindeki değişiklikler yönetilebilir.
  • Güvenlik: Sorgu filtreleme ve kullanıcı tabanlı erişim kontrolleriyle güvenlik katmanı artırılabilir.

Sonuç

ProxySQL, modern MySQL tabanlı altyapılarda kritik bir rol oynayan, esnek ve güçlü bir veritabanı proxy'sidir. Gelişmiş yük dengeleme, akıllı sorgu yönlendirme ve otomatik failover yetenekleriyle veritabanı katmanının performansını, erişilebilirliğini ve yönetilebilirliğini önemli ölçüde artırır. Yüksek trafikli web uygulamalarından karmaşık analitik sistemlere kadar geniş bir yelpazede, ProxySQL'in sunduğu optimizasyon ve dayanıklılık, üretim ortamlarında vazgeçilmez bir araç haline gelmiştir.

← Blog Listesine Dön