ProxySQL Destek ve Danışmanlık

ProxySQL, veritabanının önünde duran bir yönlendirme katmanıdır: uygulamanın bağlantı dizesi değişmeden okuma ve yazma trafiğini ayırır, bağlantı sayısını düşürür ve devralma anında trafiği çalışan düğüme taşır.

$ mysql -u admin -P 6032 -e 'SELECT hostgroup,srv_host,status FROM stats_mysql_connection_pool'
10 db-write-01 ONLINE
20 db-read-01 ONLINE
20 db-read-02 SHUNNED
→ okuma trafiği çalışan düğüme yönlendirildi

ProxySQL katmanını tasarlıyor ve işletiyoruz

ProxySQL'in değeri kurulumunda değil, sorgu kurallarının doğru tasarlanmasındadır. Yanlış yazılmış tek bir kural, yazma sorgusunu replikaya göndererek uygulamayı sessizce bozar.

Bağlantı havuzu ve multiplexing

Uygulama sunucularından gelen binlerce bağlantıyı, veritabanına açılan onlarca bağlantı üzerinden çoğullayarak (multiplexing) karşılıyoruz. max_connections sınırına dayanmış sistemlerde donanım büyütmeden alan açar.

Okuma ve yazma ayrımı

Trafiği hostgroup'lara ayırıyor, sorgu kurallarını (mysql_query_rules) sorgu deseni ve digest üzerinden tasarlıyoruz. Yazma sonrası okuma tutarlılığı gerektiren sorguları ayrıca işaretleyerek replikasyon gecikmesinin uygulamaya yansımasını engelliyoruz.

Devralma sırasında yönlendirme

Monitor modülü arka uç düğümlerin erişilebilirliğini ve read_only bayrağını sürekli izler. Aktif (primary) düğüm değiştiğinde writer hostgroup'u yeniden yönlendirilir; uygulamanın bağlantı dizesi değişmez.

Sorgu kuralları ve trafik denetimi

Sorgu yeniden yazma (rewrite), sonuç önbellekleme, hız sınırlama ve belirli sorgu desenlerinin engellenmesi ProxySQL katmanında yapılandırılır. Üretimi tehdit eden bir sorguyu, uygulama sürümü beklemeden durdurabiliriz.

ProxySQL ne yapar, ne yapmaz

ProxySQL bir yönlendirme (routing) katmanıdır. Veri tutmaz, çoğaltma (replication) yapmaz ve tek başına yüksek erişilebilirlik sağlamaz. Erişilebilirliği arkadaki cluster mimarisi sağlar; ProxySQL o mimarinin uygulamaya dönük yüzüdür.

Sahada en sık karşılaştığımız yanlış beklenti, ProxySQL kurulumunun tek başına kesintileri ortadan kaldıracağıdır. Tek düğümlü bir MySQL sunucusunun önüne ProxySQL koymak, o sunucu erişilemez duruma geldiğinde hiçbir şeyi değiştirmez. Buna karşılık kurulu bir cluster’ın önünde ProxySQL, devralma anında uygulamanın aldığı hata sayısını belirleyen bileşendir.

Bağlantı sayısı, veritabanını donanımdan önce sınırlar

Uygulama sunucularının her biri kendi bağlantı havuzunu açar. On uygulama sunucusu, her biri elli bağlantılık havuzla, veritabanına beş yüz bağlantı açmış olur. Veritabanı her bağlantı için bellek ayırır; eşzamanlı çalışan iş parçacığı sayısı arttıkça yönetim maliyeti işin kendisinden büyümeye başlar. max_connections sınırına dayanıldığında ortaya çıkan tablo tanıdıktır: sunucu kaynakları boştadır, ancak yeni bağlantı kabul edilmez.

ProxySQL bu bağlantıları tek noktada toplar ve arka uca çok daha az bağlantıyla erişir. Aynı arka uç bağlantısı, sırayla gelen sorgular arasında paylaştırılır — bu davranışa multiplexing denir.

Multiplexing her durumda çalışmaz ve bunu kurulumdan önce bilmek gerekir. Oturum durumu taşıyan bağlantılarda — açık işlem (transaction), geçici tablo, kullanıcı değişkeni veya oturum düzeyinde çalıştırılmış bir SET komutu — ProxySQL bağlantıyı o oturuma bağlı tutmak zorundadır; aksi hâlde sorgu yanlış bağlamda çalışır. Uygulamanın bu desenleri ne sıklıkta kullandığını ölçmeden kurulan bir ProxySQL, beklenen kazancı vermez. Ölçümü kurulum öncesinde yapıyoruz ve beklenen kazancı rakamla söylüyoruz.

Sorgu kuralları: ProxySQL kurulumunun asıl işi

Yönlendirme, hostgroup adı verilen arka uç grupları üzerinden yapılır. Tipik kurulumda aktif (primary) düğüm bir hostgroup’ta, okuma replikaları başka bir hostgroup’ta toplanır. Hangi sorgunun hangi gruba gideceğini mysql_query_rules tablosundaki kurallar belirler; kurallar sorgu metnine veya sorgunun digest değerine göre eşleştirilir ve sırayla değerlendirilir.

Kural setinin doğru tasarlanması, kurulumun kendisinden çok daha fazla emek ister. Dikkat edilmesi gereken üç nokta baştan bilinmelidir:

  • Açık işlem içindeki her sorgu aktif düğümde kalmalıdır. İşlem ortasında replikaya düşen bir SELECT, henüz aktarılmamış değişiklikleri göremez.
  • SELECT ... FOR UPDATE bir okuma sorgusu değildir. Kilit alır ve aktif düğüme gitmelidir. Yalnızca sorgunun SELECT ile başlamasına bakan bir kural seti bu sorguyu replikaya gönderir.
  • Yazma sonrası okuma tutarlılığı gerektiren desenler işaretlenmelidir. Bir kaydı güncelledikten hemen sonra aynı kaydı okuyan uygulama, okuma replikaya düşerse replikasyon gecikmesi kadar eski veriyi görür.

Üçüncü maddeye karşı ek bir önlem olarak, gecikmesi belirlenen eşiği aşan replikaları hostgroup dışına alacak şekilde yapılandırma yapıyoruz. Gecikmiş düğüm kendiliğinden trafik almayı bırakır, gecikme kapandığında geri döner.

Sorgu kuralları yalnızca yönlendirme için kullanılmaz. Sorgu yeniden yazma (rewrite), sonuç kümesi önbellekleme ve belirli sorgu desenlerinin tamamen engellenmesi aynı katmanda yapılandırılır. Üretimi tehdit eden bir sorguyu uygulama sürümü beklemeden durdurabilmek, olay müdahalesinde en çok işe yarayan yeteneklerden biridir.

Cluster mimarilerinde ProxySQL

ProxySQL, arkasındaki topolojiyi genel bir sağlık kontrolüyle değil, o mimarinin kendi durum bilgisini okuyarak izler.

Galera Cluster ve Percona XtraDB Cluster kurulumlarında mysql_galera_hostgroups yapılandırması kullanılır. Düğümlerin cluster’a katılma ve senkronizasyon durumu izlenir; senkronizasyon tamamlanmamış bir düğüm trafik almaz. Çok yazıcılı (multi-writer) çalışabilen bu mimarilerde yazma trafiğini tek düğümde toplamak, sertifikasyon çakışmalarını belirgin şekilde azaltır ve ProxySQL bunu uygulamaya hissettirmeden yapar.

Group Replication ve InnoDB Cluster kurulumlarında mysql_group_replication_hostgroups yapılandırması, grubun kendi üyelik bilgisini kaynak alır. Çoğunluk kaybı yaşayan düğümler trafik dışında kalır.

Hangi mimarinin kurulacağı ve düğüm sayısının nasıl belirleneceği ayrı bir çalışmadır: Yüksek Erişilebilirlik ve Cluster Çözümleri

Proxy katmanı tekil hata noktası olmamalıdır

ProxySQL’i uygulama ile veritabanı arasına koymak, mimariye yeni bir bileşen eklemektir. Tek bir ProxySQL sunucusu kurulursa çözülen sorun ortadan kalkmaz, yalnızca yer değiştirir. İki dağıtım biçiminden birini uyguluyoruz:

  • Her uygulama sunucusunda yerel ProxySQL. Uygulama localhost üzerinden bağlanır, araya ek bir ağ turu girmez ve bir kopyanın kaybı yalnızca kendi sunucusunu etkiler.
  • Ayrı ProxySQL katmanı. Sanal IP ile yedekli çalıştırılır; uygulama sunucusu sayısının çok yüksek olduğu veya yapılandırmanın merkezî yönetilmesi gereken kurulumlarda tercih edilir.

Her iki biçimde de kopyalar arasındaki yapılandırma tutarlılığını ProxySQL Cluster ile sağlıyoruz: bir düğümde yapılan kural değişikliği diğerlerine yayılır, elle kopyalama gerekmez.

İzleme: proxy katmanı, sorgu profilini gösteren yerdir

ProxySQL kendi istatistiklerini yönetim arayüzündeki stats şemasında tutar. Hostgroup başına bağlantı kullanımı, arka uç düğümlerin durumu, replikasyon gecikmesi ve sorgu digest’leri buradan okunur. Metrikleri Percona Monitoring and Management (PMM) üzerinden toplayıp Grafana panolarında izliyoruz.

stats_mysql_query_digest tablosunun ayrı bir değeri vardır: uygulamadan gelen her sorgu desenini, çağrılma sayısı ve toplam süresiyle birlikte gösterir. Slow query log yalnızca eşiği aşan sorguları kaydederken, ProxySQL trafiğin tamamını görür. Saniyede binlerce kez çağrılan ve tek başına hızlı görünen bir sorgu, ancak bu tabloda fark edilir.

Sorgu analizinin veritabanı tarafındaki karşılığı ayrı bir çalışmadır: Performans Optimizasyonu ve İzleme

Kurulum nasıl ilerler

  1. Ölçüm. Mevcut bağlantı profili, sorgu desenleri ve oturum durumu kullanımı çıkarılır. Multiplexing’den beklenecek kazanç bu ölçüme dayanır.
  2. Kural tasarımı. Hostgroup şeması ve sorgu kuralları test ortamında yazılır, uygulamanın gerçek trafiğiyle doğrulanır.
  3. Kademeli devreye alma. Önce okuma trafiği ProxySQL üzerinden geçirilir, davranış doğrulandıktan sonra yazma trafiği taşınır.
  4. Devralma tatbikatı. Aktif düğüm bilerek devre dışı bırakılır; uygulamanın aldığı hata sayısı ve yeniden yönlendirme süresi ölçülür.
  5. Devir. Kural seti, hostgroup şeması ve izleme panosu dokümante edilerek teslim edilir.

İlgili hizmetler

ProxySQL bağlantı ve kullanıcı yönetiminin bir parçasıdır; arka uç kimlik bilgileri ve erişim denetimi bu katmanda da planlanır: Veritabanı Güvenliği ve KVKK Teknik Tedbirleri

Yedekleme trafiğinin okuma replikalarından alınması, yönlendirme kurallarıyla birlikte kurgulanır: Veritabanı Yedekleme ve Kurtarma

Veritabanı destek hizmetlerimiz

ProxySQL katmanını önüne kurduğumuz veritabanlarında destek ve danışmanlık hizmetlerimizin tamamını sunuyoruz.

Sık sorulan sorular

Uygulama kodunda değişiklik gerekmez; yalnızca bağlantı dizesindeki sunucu adresi ve port ProxySQL'i gösterecek şekilde güncellenir. Uygulama, ProxySQL'e standart MySQL protokolüyle bağlanır ve arkadaki topolojiyi bilmek zorunda kalmaz. Buna karşılık kurulum öncesinde uygulamanın sorgu desenlerini ölçüyoruz: açık işlem (transaction) içinde çalışan sorgular, geçici tablolar ve oturum değişkenleri yönlendirme kurallarını doğrudan etkiler.

Sağlamaz. ProxySQL trafiği yönlendirir; veriyi çoğaltmaz. Erişilebilirliği arkadaki cluster mimarisi — InnoDB Cluster, Group Replication veya Galera — sağlar. Tek düğümlü bir MySQL sunucusunun önüne ProxySQL koymak, o sunucu erişilemez duruma geldiğinde hiçbir şeyi değiştirmez. ProxySQL, kurulu bir cluster'ın uygulamaya dönük yüzüdür.

Kurallar dikkatli tasarlanmazsa çıkar. Bir kaydı güncelledikten hemen sonra aynı kaydı okuyan bir uygulama, okuma replikaya düşerse replikasyon gecikmesi kadar eski veriyi görür. Üç önlemi birlikte uyguluyoruz: tutarlılık gerektiren sorgu desenlerini writer hostgroup'una sabitlemek, gecikmesi eşiği aşan replikaları hostgroup dışına almak ve açık işlem içindeki tüm sorguları aktif düğümde tutmak.

Uygulama havuzu yalnızca kendi süreci için çalışır. On uygulama sunucusu, her biri elli bağlantılık havuzla, veritabanına beş yüz bağlantı açar; veritabanı her bağlantı için bellek ayırır ve iş parçacığı yönetim maliyeti artar. ProxySQL bu bağlantıları tek noktada toplayıp arka uca çok daha az bağlantıyla erişir. Uygulama havuzunun yerini almaz, önüne geçer.

Tek sunucuya kurulursa olur ve bu, çözülen sorunun yer değiştirmesi anlamına gelir. İki dağıtım biçiminden birini uyguluyoruz: ProxySQL'i her uygulama sunucusuna yerel olarak kurmak, veya ayrı bir ProxySQL katmanını sanal IP ile yedekli çalıştırmak. Yapılandırmanın kopyalar arasında tutarlı kalması için ProxySQL Cluster kullanıyoruz; bir düğümde yapılan kural değişikliği diğerlerine yayılır.

Yoktur. ProxySQL açık kaynak lisanslıdır ve kurulum, yapılandırma ve entegrasyon hakkımız buradan doğar. ProxySQL'i geliştiren kuruluşla ticari bir ilişkimiz bulunmuyor; verdiğimiz hizmet kurulum, kural tasarımı ve sonrasındaki operasyonel bakımdır.

ProxySQL kurulumu için iletişime geçin