Takip et

HAProxy Port Yönlendirme ile Birden Fazla Veritabanı Sunucusuna Bağlantıları Yönlendirme Rehberi

Günümüzün hızla büyüyen dijital dünyasında, uygulamaların sorunsuz çalışması için veritabanlarının performansı ve erişilebilirliği kritik öneme sahiptir. Peki, kullanıcı trafiği arttığında veya bir veritabanı sunucusu arızalandığında sisteminizin çökmesini nasıl engellersiniz? İşte bu noktada HAProxy port yönlendirme, veritabanı bağlantılarını birden fazla sunucuya akıllıca dağıtarak yüksek erişilebilirlik ve ölçeklenebilirlik sağlayan güçlü bir çözüm olarak öne çıkıyor.

Modern uygulamalar, geleneksel tek veritabanı sunucusu modelinin getirdiği sınırlamalarla sıkça karşılaşır. Özellikle yüksek trafikli web siteleri, e-ticaret platformları veya gerçek zamanlı veri işleyen sistemler için tek bir sunucu, performans darboğazları, hizmet kesintileri ve veri kaybı riskleri taşır. Kullanıcı sayısı arttıkça, bu tek sunucuya binen yük katlanarak artar ve yanıt süreleri uzar, hatta sistem tamamen kilitlenebilir. Bir diğer önemli problem ise yüksek erişilebilirliktir; tek bir sunucunun arızalanması, uygulamanın tamamen erişilemez hale gelmesine yol açar ki bu, iş sürekliliği açısından kabul edilemez bir durumdur.

İşte bu gibi sorunları aşmak için HAProxy gibi bir yük dengeleyiciye (load balancer) ve port yönlendirme (port forwarding) yeteneklerine ihtiyaç duyarız. HAProxy, gelen veritabanı bağlantılarını birden fazla veritabanı sunucusu arasında akıllıca dağıtarak yükü hafifletir. Bu sayede, tek bir sunucunun aşırı yüklenmesini önler ve her sunucunun optimum performansla çalışmasını sağlar. Ayrıca, sağlık kontrolleri (health checks) sayesinde arızalanan veya ulaşılamayan bir veritabanı sunucusunu otomatik olarak tespit edip trafiği sağlıklı sunuculara yönlendirerek hizmet kesintilerini minimuma indirir. Bu mekanizma, uygulamanızın sürekli erişilebilir olmasını garanti eder. Felaket kurtarma senaryolarında da HAProxy kilit bir rol oynar; birincil veritabanı sunucusu çevrimdışı kaldığında, trafiği otomatik olarak yedek sunuculara yönlendirerek uygulamanın çalışmaya devam etmesini sağlar. Kısacası, HAProxy sadece bir yük dengeleyici değil, aynı zamanda veritabanı altyapınızın ölçeklenebilirliğini, dayanıklılığını ve güvenilirliğini artıran stratejik bir araçtır.

HAProxy, gelişmiş yük dengeleme algoritmaları ve esnek yapılandırma seçenekleri sunarak veritabanı bağlantılarının yönetimini kolaylaştırır. Özellikle veritabanı bağlantıları gibi durum bilgisi olan (stateful) bağlantılar için TCP katmanında etkin bir şekilde çalışabilmesi, onu bu tür senaryolar için ideal kılar. Port yönlendirme kavramı ise, HAProxy’nin belirli bir port üzerinden gelen bağlantıları, yapılandırılmış kurallara göre farklı IP adreslerindeki ve portlardaki hedef sunuculara iletmesidir. Bu sayede uygulama sunucuları tek bir “sanal” veritabanı adresine bağlanır ve HAProxy arka planda bu bağlantıyı uygun veritabanı sunucusuna yönlendirir. Bu mimari, uygulama katmanını veritabanı altyapısının karmaşıklığından soyutlayarak geliştirme ve bakım süreçlerini de basitleştirir.

HAProxy ile Veritabanı Yük Dengelemenin Temel Prensipleri Nelerdir?

HAProxy’yi veritabanı yük dengeleme amacıyla kullanırken, bazı temel prensipleri anlamak kritik öneme sahiptir. Veritabanı bağlantıları genellikle TCP (Transmission Control Protocol) katmanında gerçekleşir ve bu bağlantılar durum bilgisi içerir; yani, bir bağlantı açıldığında belirli bir oturum ve durum bilgisi sunucu tarafında tutulur. Bu nedenle HAProxy, veritabanı yük dengelemesinde genellikle mode tcp ayarıyla TCP katmanında çalışır. Bu modda HAProxy, gelen TCP bağlantılarını sonlandırmaz, sadece paketleri hedef sunucuya şeffaf bir şekilde iletir. Bu, veritabanı sunucularının istemcilerle doğrudan TCP el sıkışmasını tamamlamasını sağlar ve veritabanı protokollerinin karmaşıklığından HAProxy’yi soyutlar, böylece performans ve uyumluluk artar.

Yük dengeleme algoritmaları, HAProxy’nin gelen bağlantıları birden fazla arka uç sunucusu arasında nasıl dağıtacağını belirler. Veritabanı senaryolarında en sık kullanılan algoritmalar şunlardır:

  • Round-robin: Her yeni bağlantıyı sırayla bir sonraki sunucuya gönderir. Basit ve eşit yük dağılımı sağlar.
  • Least-conn (En Az Bağlantı): En az aktif bağlantıya sahip sunucuya yeni bağlantıları yönlendirir. Yoğunluğun değişken olduğu durumlarda daha iyi performans sunabilir.
  • Source (Kaynak): İstemcinin IP adresine göre bağlantıları yönlendirir. Aynı istemciden gelen tüm bağlantıların her zaman aynı sunucuya gitmesini sağlar. Bu, veritabanı oturum tutarlılığı için önemli olabilir, ancak yük dengesini olumsuz etkileyebilir.

Veritabanı yük dengelemesinde en kritik unsurlardan biri ise sağlık kontrolleridir (Health Checks). HAProxy, yapılandırılan aralıklarla arka uç veritabanı sunucularının durumunu kontrol eder. Eğer bir sunucu sağlık kontrolünden geçemezse (örneğin, yanıt vermezse veya belirli bir portu dinlemezse), HAProxy o sunucuyu havuzdan çıkarır ve trafiği sadece sağlıklı sunuculara yönlendirir. Bir sunucu tekrar sağlıklı hale geldiğinde ise otomatik olarak havuza geri eklenir. Sağlık kontrolleri için genellikle option tcp-check kullanılır ve inter (kontrol aralığı), rise (sağlıklı sayılması için gerekli başarılı kontrol sayısı) ve fall (sağlıksız sayılması için gerekli başarısız kontrol sayısı) gibi parametrelerle ince ayarlar yapılır.

Veritabanı ölçeklenebilirliği için önemli bir kavram olan Okuma/Yazma Ayırma (Read/Write Splitting), HAProxy ile dolaylı yoldan da olsa uygulanabilir. Genellikle veritabanı işlemleri içinde okuma işlemleri (SELECT) yazma işlemlerine (INSERT, UPDATE, DELETE) göre çok daha yoğun olabilir. Bu durumda, ana (master) veritabanı yazma işlemleri için kullanılırken, çoğaltma (replica/slave) veritabanları okuma işlemleri için kullanılabilir. HAProxy’nin gelişmiş kuralları (ACL’ler) ve use_backend direktifleri ile gelen sorgunun türüne göre farklı veritabanı sunucularına yönlendirme yapılabilir. Ancak bu, TCP seviyesinde oldukça karmaşık bir yaklaşımdır ve genellikle uygulama katmanında veya daha gelişmiş veritabanı proxy’leri ile daha etkili bir şekilde gerçekleştirilir. HAProxy’nin doğrudan bir SQL ayrıştırma yeteneği olmasa da, belirli portlar üzerinden veya istemci IP’sine göre okuma/yazma havuzlarına yönlendirme gibi stratejiler geliştirilebilir.

Uzman İpucu: Veritabanı sunucularınızın durumunu sadece port kontrolü ile değil, aynı zamanda belirli bir SQL sorgusunun başarılı olup olmadığını kontrol ederek daha sağlam sağlık kontrolleri yapabilirsiniz. HAProxy’nin option mysql-check veya option pgsql-check gibi özel veritabanı sağlık kontrol seçenekleri mevcuttur.

Adım Adım HAProxy Kurulumu ve Temel Veritabanı Yönlendirme Yapılandırması Nasıl Yapılır?

HAProxy’yi veritabanı bağlantılarını yönlendirmek için kurmak ve yapılandırmak oldukça basittir. İşte adım adım bir rehber:

1. HAProxy Kurulumu

HAProxy’yi genellikle Linux tabanlı sunuculara kurarız. Ubuntu veya Debian tabanlı bir sistem için aşağıdaki komutları kullanabilirsiniz:


sudo apt update
sudo apt install haproxy -y

Kurulum tamamlandıktan sonra HAProxy servisini başlatabilir ve durumunu kontrol edebilirsiniz:


sudo systemctl start haproxy
sudo systemctl enable haproxy
sudo systemctl status haproxy

2. Temel HAProxy Yapılandırması (haproxy.cfg)

HAProxy'nin ana yapılandırma dosyası genellikle /etc/haproxy/haproxy.cfg konumunda bulunur. Bu dosyayı düzenleyerek veritabanı yönlendirmesi için gerekli kuralları ekleyeceğiz. Bir metin düzenleyici ile dosyayı açın (örneğin, sudo nano /etc/haproxy/haproxy.cfg).

Tipik bir HAProxy yapılandırma dosyası şu bölümlerden oluşur:

  • global: HAProxy süreci için genel ayarlar (CPU çekirdeği kullanımı, loglama, kullanıcı/grup izinleri vb.).
  • defaults: Frontend ve backend'ler için varsayılan ayarlar (mode, timeout değerleri vb.).
  • frontend: HAProxy'nin dinleyeceği IP adresi ve portu, gelen bağlantıları nasıl işleyeceğini tanımlar.
  • backend: Trafiğin yönlendirileceği gerçek sunucuların listesini, yük dengeleme algoritmasını ve sağlık kontrollerini tanımlar.

Aşağıda, MySQL veya PostgreSQL (varsayılan port 3306 veya 5432) için temel bir veritabanı yönlendirme yapılandırma örneği bulunmaktadır. Bu örnekte, HAProxy 3306 portunu dinleyecek ve gelen bağlantıları db_servers adlı backend grubundaki veritabanı sunucularına dağıtacaktır:


global
    log /dev/log    local0
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    tcp
    option  tcplog
    timeout connect 10s
    timeout client  1m
    timeout server  1m

frontend db_cluster
    # HAProxy'nin dinleyeceği IP ve port.
    # *:3306, tüm arayüzlerde 3306 portunu dinle demektir.
    bind *:3306
    # Veritabanı bağlantıları TCP modunda çalışır
    mode tcp
    # Gelen trafiği hangi backend grubuna yönlendireceğini belirtir
    default_backend db_servers

backend db_servers
    # Backend de TCP modunda çalışır
    mode tcp
    # Yük dengeleme algoritması: Round-robin (sırayla)
    balance roundrobin
    # TCP sağlık kontrolü seçeneğini etkinleştirir
    option tcp-check
    # Veritabanı sunucuları ve portları, sağlık kontrol ayarları
    # check: Sağlık kontrolünü etkinleştirir
    # port 3306: Sağlık kontrolünü bu port üzerinden yapar
    # inter 10s: Her 10 saniyede bir kontrol et
    # rise 2: 2 başarılı kontrolden sonra sunucuyu "sağlıklı" kabul et
    # fall 3: 3 başarısız kontrolden sonra sunucuyu "sağlıksız" kabul et
    server db1 192.168.1.101:3306 check port 3306 inter 10s rise 2 fall 3
    server db2 192.168.1.102:3306 check port 3306 inter 10s rise 2 fall 3
    server db3 192.168.1.103:3306 check port 3306 inter 10s rise 2 fall 3

# HAProxy yönetim arayüzü (isteğe bağlı)
listen stats
    bind *:8080
    mode http
    stats enable
    stats uri /haproxy?stats
    stats realm HAPProxy\ Statistics
    stats auth admin:password123

3. Yapılandırmayı Test Etme ve Servisi Yeniden Başlatma

Yapılandırma dosyasını kaydettikten sonra, herhangi bir hata olup olmadığını kontrol etmek için HAProxy yapılandırma kontrol komutunu çalıştırın:


sudo haproxy -c -f /etc/haproxy/haproxy.cfg

Eğer "Configuration file is valid" mesajını görürseniz, yapılandırmanız doğru demektir. Şimdi HAProxy servisini yeniden başlatarak değişiklikleri uygulayın:


sudo systemctl restart haproxy

Artık uygulamanız, doğrudan veritabanı sunucularına bağlanmak yerine, HAProxy'nin dinlediği IP adresine (örneğin, HAProxy sunucusunun IP adresi) ve 3306 portuna bağlanacaktır. HAProxy, bu bağlantıları arka uçtaki üç veritabanı sunucusundan birine yönlendirecektir.

Uzman İpucu: HAProxy'nin yapılandırmasını canlıda kesinti olmadan güncellemek için sudo systemctl reload haproxy komutunu kullanabilirsiniz. Bu, yeni bir HAProxy süreci başlatır ve eski bağlantıları kademeli olarak yeni sürece taşır.

Veritabanı Mimarilerinde HAProxy ile Yüksek Erişilebilirlik ve Felaket Kurtarma Nasıl Sağlanır?

HAProxy, veritabanı katmanında yüksek erişilebilirlik (High Availability) ve felaket kurtarma (Disaster Recovery) sağlamak için temel bir bileşen olarak işlev görür. Bu yetenekler, özellikle aktif-pasif (active-passive) ve aktif-aktif (active-active) veritabanı mimarilerinde kritik rol oynar.

Aktif-Pasif Mimariler: Bu yapıda, bir ana (master) veritabanı aktif olarak tüm yazma ve okuma işlemlerini yürütürken, bir veya daha fazla çoğaltma (replica/slave) veritabanı sadece beklemede (pasif) kalır. Birincil ana veritabanı arızalandığında, çoğaltma veritabanlarından biri ana rolünü üstlenir ve trafik yeni ana sunucuya yönlendirilir. HAProxy, bu geçişi otomatikleştirme sürecinde çok önemlidir. Sağlık kontrolleri aracılığıyla ana sunucunun durumunu sürekli izler. Ana sunucu arızalandığında, HAProxy bunu tespit eder ve trafiği otomatik olarak pasif sunucuya (eğer birincil rolü üstlenmişse) veya başka bir aktif çoğaltmaya yönlendirir. Yapılandırmada backup anahtar kelimesi, bir sunucunun yalnızca diğer tüm sunucular kullanılamaz olduğunda kullanılacağını belirtmek için kullanılabilir.


backend db_servers
    mode tcp
    balance leastconn
    option tcp-check
    server master_db 192.168.1.101:3306 check port 3306 inter 5s fall 3
    server slave_db1 192.168.1.102:3306 check port 3306 inter 5s fall 3 backup
    server slave_db2 192.168.1.103:3306 check port 3306 inter 5s fall 3 backup

Yukarıdaki örnekte, master_db aktif olarak kullanılırken, slave_db1 ve slave_db2 sadece master_db düşerse devreye girer. Ancak, bu senaryoda veritabanının kendisinin birincil/çoğaltma rol geçişini (failover) yönetmesi gerektiğini unutmamak önemlidir (örneğin, PostgreSQL'de Patroni, MySQL'de MHA gibi araçlarla).

Aktif-Aktif Mimariler: Çoklu ana (multi-master) veya birden fazla okuma çoğaltması (read replicas) olan senaryolarda, tüm veritabanı sunucuları aynı anda aktif olarak çalışır. Bu durumda HAProxy, gelen bağlantıları aktif sunucular arasında eşit şekilde dağıtarak performansı ve yük kapasitesini artırır. Eğer bir sunucu arızalanırsa, HAProxy onu havuzdan çıkarır ve kalan sağlıklı sunuculara yönlendirmeye devam eder. Bu, kesintisiz bir hizmet sağlar ve uygulamanın ölçeklenebilirliğini artırır. Çoklu ana veritabanı kurulumlarında, tüm ana sunucuların eş zamanlı olarak yazma ve okuma işlemlerini desteklediği varsayılır. HAProxy, böyle bir durumda roundrobin veya leastconn gibi algoritmalarla gelen trafiği tüm ana sunuculara dağıtabilir.

HAProxy'nin sağlık kontrolleri, bu yüksek erişilebilirlik mekanizmalarının temelidir. HAProxy, veritabanı sunucularını yalnızca "up" veya "down" olarak işaretlemekle kalmaz, aynı zamanda belirli eşiklere göre (rise ve fall parametreleri) daha akıllıca karar verir. Örneğin, kısa süreli ağ sorunları nedeniyle bir anlık kesinti yaşayan bir sunucuyu hemen devre dışı bırakmak yerine, birkaç başarısız kontrol sonrasında işlem yapabilir. Bu, yanlış pozitifleri (false positives) azaltmaya yardımcı olur.

Felaket kurtarma durumlarında, HAProxy'nin rolü, coğrafi olarak farklı bölgelerde konuşlandırılmış veritabanı kümeleri arasında trafik yönlendirmesini kolaylaştırmaktır. Bir bölgedeki tüm veritabanı sunucuları erişilemez hale geldiğinde, HAProxy yapılandırması, trafik akışını başka bir bölgedeki yedek veritabanı kümesine yönlendirebilir. Bu senaryo, genellikle DNS tabanlı yönlendirme veya Keepalived gibi ek araçlarla HAProxy'nin kendisinin yüksek erişilebilirliğini sağlayarak birleştirilir. Keepalived, birden fazla HAProxy sunucusu arasında sanal bir IP adresi (VIP) paylaşımını yönetir. Eğer ana HAProxy sunucusu düşerse, Keepalived VIP'yi yedek HAProxy sunucusuna taşır, böylece tek bir HAProxy noktası bile bir arıza noktası (single point of failure) olmaktan çıkar.

Uzman İpucu: Keepalived ile HAProxy'nin kendi yüksek erişilebilirliğini sağlamak, veritabanı bağlantılarınız için uçtan uca kesintisiz bir hizmet sunmanın anahtarıdır. Böylece HAProxy sunucusunun kendisi de bir arıza noktası olmaktan çıkar.

HAProxy ile Okuma/Yazma (Read/Write) Ayırma Stratejileri

Veritabanı uygulamalarında okuma (SELECT) işlemleri, yazma (INSERT, UPDATE, DELETE) işlemlerine göre genellikle çok daha fazladır. Bu asimetrik yük dağılımı, performans darboğazlarına yol açabilir. Okuma/yazma ayırma stratejisi, okuma işlemlerini çoğaltma (replica/slave) sunucularına, yazma işlemlerini ise ana (master) sunucuya yönlendirerek bu sorunu çözer ve veritabanı sisteminin genel ölçeklenebilirliğini artırır.

HAProxy, bir TCP proxy'si olarak SQL sorgularının içeriğini doğrudan anlamaz veya ayrıştırmaz. Dolayısıyla, uygulama katmanında yapılan okuma/yazma ayırma kadar esnek olmasa da, belirli senaryolarda dolaylı yoldan okuma/yazma ayırma stratejilerine yardımcı olabilir. Bu genellikle iki ana yaklaşımla yapılır:

  1. Farklı Portlar Kullanarak Ayırma: Uygulama, yazma işlemleri için belirli bir HAProxy portuna (örneğin 3306), okuma işlemleri için ise farklı bir HAProxy portuna (örneğin 3307) bağlanır. HAProxy, bu portları farklı backend sunucu havuzlarına yönlendirir.
  2. Gelişmiş ACL Kuralları ile Ayırma (Sınırlı): Daha karmaşık senaryolarda, HAProxy'nin req.payload veya req.ssl_sni gibi özellikleri kullanılarak istemci tarafından gönderilen ilk veri paketinin belirli desenleri veya SSL SNI (Server Name Indication) bilgisi incelenerek yönlendirme yapılmaya çalışılabilir. Ancak bu, SQL protokollerinin karmaşıklığı nedeniyle genellikle güvenilir veya kapsamlı bir yöntem değildir.

İşte farklı portlar kullanarak okuma/yazma ayırmanın temel bir HAProxy yapılandırma örneği:


frontend db_write_entrypoint
    bind *:3306
    mode tcp
    default_backend write_servers

frontend db_read_entrypoint
    bind *:3307
    mode tcp
    default_backend read_servers

backend write_servers
    mode tcp
    balance leastconn
    option tcp-check
    server master_db 192.168.1.101:3306 check port 3306 inter 5s fall 3

backend read_servers
    mode tcp
    balance roundrobin
    option tcp-check
    server slave_db1 192.168.1.102:3306 check port 3306 inter 5s fall 3
    server slave_db2 192.168.1.103:3306 check port 3306 inter 5s fall 3

Bu yapılandırmada:

  • Uygulama, yazma işlemleri için HAProxy'nin 3306 portuna bağlanır ve trafik master_db sunucusuna yönlendirilir.
  • Uygulama, okuma işlemleri için HAProxy'nin 3307 portuna bağlanır ve trafik slave_db1 ile slave_db2 sunucuları arasında yük dengeli bir şekilde dağıtılır.

Bu yaklaşımın avantajı, uygulama katmanında basitçe farklı portlara bağlanarak okuma/yazma ayırmanın gerçekleştirilebilmesidir. Sınırlaması ise, uygulamanın bu ayrımı bilmesi ve bağlantılarını buna göre yapması gerektiğidir. Daha gelişmiş veritabanı proxy'leri (örneğin, ProxySQL for MySQL veya PgBouncer for PostgreSQL ile birlikte kullanılan ProxySQL gibi) SQL sorgularını analiz ederek okuma/yazma ayırmayı proxy seviyesinde çok daha sofistike bir şekilde yapabilirler. HAProxy, bu tür senaryolarda genellikle birincil yük dengeleyici olarak konumlandırılır ve bu özel veritabanı proxy'lerinin önünde durarak onların yüksek erişilebilirliğini sağlar.

Güvenlik ve İzleme: HAProxy Üzerinden Veritabanı Bağlantılarını Nasıl Koruruz?

Veritabanı bağlantılarının güvenliği ve sistemin izlenmesi, herhangi bir üretim ortamında vazgeçilmezdir. HAProxy, bu alanlarda da önemli yetenekler sunarak veritabanı altyapınızın sağlamlığını artırmanıza yardımcı olur.

SSL/TLS Şifrelemesi

Veritabanı bağlantılarının güvenliğini sağlamanın en önemli yollarından biri, taşıma katmanı şifrelemesi olan SSL/TLS kullanmaktır. HAProxy, gelen istemci bağlantılarını TLS ile sonlandırma (SSL/TLS Termination) yeteneğine sahiptir. Bu, istemcilerle HAProxy arasındaki bağlantının şifreli olmasını sağlar. HAProxy, gelen şifreli trafiği şifresini çözerek arka uç veritabanı sunucularına şifresiz veya isteğe bağlı olarak tekrar şifrelenmiş olarak iletebilir. Bu, veritabanı sunucularının üzerindeki şifreleme yükünü hafifletir ve performanslarını artırabilir. Yapılandırma örneği:


frontend db_cluster_secure
    # 3306 portunda SSL/TLS ile dinle
    bind *:3306 ssl crt /etc/haproxy/certs/db-cert.pem
    mode tcp
    default_backend db_servers_secure

backend db_servers_secure
    mode tcp
    balance leastconn
    # Arka uç sunucularına da SSL/TLS ile bağlan (isteğe bağlı)
    # ssl verify required: Sunucu sertifikasını doğrulamasını sağlar
    # ca-file: Güvenilen CA sertifikalarının yolu
    server db1 192.168.1.101:3306 ssl verify required ca-file /etc/haproxy/certs/ca.pem
    server db2 192.168.1.102:3306 ssl verify required ca-file /etc/haproxy/certs/ca.pem

Bu yapılandırmada, istemci 3306 portundan HAProxy'ye TLS ile bağlanır. HAProxy, /etc/haproxy/certs/db-cert.pem dosyasındaki sertifikayı kullanarak bağlantıyı şifresini çözer ve isteğe bağlı olarak arka uç veritabanı sunucularına da TLS üzerinden bağlanır. Bu, uçtan uca güvenliği sağlar.

Erişim Kontrol Listeleri (ACLs)

HAProxy, güçlü erişim kontrol listeleri (ACL) sayesinde hangi istemcilerin veritabanına erişebileceğini belirlemenize olanak tanır. Bu, sadece güvenilir IP adreslerinden veya ağlardan gelen bağlantılara izin vererek güvenlik duvarı görevi görmesini sağlar. Örneğin, sadece uygulama sunucularınızın IP adreslerinden gelen bağlantılara izin verebilirsiniz:


frontend db_cluster
    bind *:3306
    mode tcp
    # Belirli bir IP adresinden gelen bağlantılara izin ver
    acl trusted_app_server src 192.168.10.10
    # Belirli bir ağdan gelen bağlantılara izin ver
    acl trusted_app_network src 192.168.10.0/24

    tcp-request inspect-delay 5s
    tcp-request content accept if trusted_app_server or trusted_app_network
    tcp-request content reject

    default_backend db_servers

Yukarıdaki örnekte, sadece 192.168.10.10 IP adresinden veya 192.168.10.0/24 ağından gelen bağlantılara izin verilir, diğer tüm bağlantılar reddedilir. tcp-request inspect-delay ile HAProxy'nin istemci veri göndermesini beklemesi sağlanır, bu sayede ACL'ler daha etkin çalışır.

HAProxy İstatistikleri (Stats Page)

HAProxy, dahili bir istatistik sayfası sunarak yük dengeleyicinin ve arka uç sunucularının performansını ve durumunu izlemenizi sağlar. Bu sayfa, aktif bağlantı sayısı, trafik hacmi, sunucu durumu, hata oranları gibi değerli metrikleri görselleştirir. Yapılandırmanıza aşağıdaki bloğu ekleyerek bu sayfayı etkinleştirebilirsiniz:


listen stats
    bind *:8080 # İstatistik sayfasının dinleyeceği port
    mode http
    stats enable
    stats uri /haproxy?stats # İstatistik sayfasına erişim URL'si
    stats realm HAProxy\ Statistics
    stats auth admin:password123 # Kullanıcı adı ve parola ile erişim koruması

Bu yapılandırma ile tarayıcınızdan http://HAProxy_IP:8080/haproxy?stats adresine giderek HAProxy'nin istatistiklerini görebilirsiniz. Kullanıcı adı admin ve parola password123 olacaktır.

Loglama

HAProxy'nin loglama yetenekleri, sorun giderme ve güvenlik denetimi için hayati öneme sahiptir. Bağlantı olaylarını, hata mesajlarını ve diğer önemli bilgileri log dosyalarına kaydeder. Global bölümdeki log /dev/log local0 ayarı ile sistem loguna (syslog) log göndermesini sağlarsınız. Daha detaylı loglama için, log direktifini frontend ve backend bölümlerinde de kullanabilirsiniz.


global
    log /dev/log    local0 debug # Debug seviyesinde loglama
    # ...

defaults
    log     global
    option  tcplog # TCP bağlantılarını logla
    # ...

Bu ayarlar, HAProxy'nin bağlantı akışını, bağlantı sürelerini ve bağlantıların hangi sunuculara yönlendirildiğini detaylı bir şekilde kaydetmesini sağlar. Bu logları merkezi bir loglama sistemine (ELK Stack, Grafana Loki vb.) göndererek daha etkin izleme ve analiz yapabilirsiniz.

HAProxy, bu güvenlik ve izleme özellikleriyle veritabanı altyapınızın sadece performanslı değil, aynı zamanda güvenli ve yönetilebilir olmasını sağlar.

Gerçek Dünya Senaryosu: Yüksek Trafikli Bir E-ticaret Uygulaması İçin HAProxy Çözümü

Hayal edelim ki, popüler bir e-ticaret platformu olan "TrendyMağaza", Black Friday gibi yoğun alışveriş dönemlerinde ciddi performans sorunları yaşamaya başladı. Mevcut mimaride, tüm uygulama sunucuları tek bir ana (master) PostgreSQL veritabanı sunucusuna bağlanıyordu. Gelen yoğun trafik, özellikle ürün listeleme ve arama gibi okuma ağırlıklı işlemlerde, veritabanını aşırı yüklüyor ve site yanıt süreleri kabul edilemez seviyelere düşüyordu. Bazı durumlarda ise veritabanı tamamen kilitleniyor ve site erişilemez hale geliyordu.

TrendyMağaza'nın mühendislik ekibi, bu sorunu çözmek ve sistemin ölçeklenebilirliğini artırmak için bir strateji geliştirdi: Master-Replica (Ana-Çoğaltma) veritabanı mimarisine geçiş ve HAProxy kullanarak bağlantıların yük dengelemesi.

Uygulanan Çözüm Adımları:

  1. Veritabanı Çoğaltmaları Kurulumu: Mevcut ana PostgreSQL sunucusunun iki adet çoğaltması (replica) oluşturuldu. Bu çoğaltmalar, ana sunucudaki veriyi pasif olarak kopyalayacak şekilde yapılandırıldı.
  2. HAProxy Konumlandırması: HAProxy, uygulama sunucuları ile veritabanı sunucuları arasına bir proxy katmanı olarak yerleştirildi. İki adet HAProxy sunucusu, Keepalived ile aktif-pasif modda yüksek erişilebilirlik sağlayacak şekilde kuruldu.
  3. Okuma/Yazma Ayırma ile HAProxy Yapılandırması: HAProxy, uygulamanın farklı portlara yaptığı bağlantılara göre okuma ve yazma işlemlerini ayırmak üzere yapılandırıldı.
    • Yazma İşlemleri (Port 5432): Uygulama, sipariş oluşturma, envanter güncelleme gibi yazma işlemleri için HAProxy'nin 5432 portuna bağlanacak ve bu bağlantılar doğrudan tek bir ana (master) veritabanı sunucusuna yönlendirilecekti.
    • Okuma İşlemleri (Port 5433): Ürün listeleme, stok kontrolü, yorumları okuma gibi okuma işlemleri için uygulama HAProxy'nin 5433 portuna bağlanacak ve bu bağlantılar iki çoğaltma (replica) sunucusu arasında least-conn (en az bağlantı) algoritmasıyla yük dengeleyerek dağıtılacaktı.
  4. Sağlık Kontrolleri: Her bir veritabanı sunucusu için detaylı TCP ve PostgreSQL özel sağlık kontrolleri yapılandırıldı. Bir sunucunun yanıt vermemesi veya PostgreSQL servisinde sorun olması durumunda, HAProxy otomatik olarak bu sunucuyu havuzdan çıkaracak ve trafik akışını kesintisiz bir şekilde devam ettirecekti.

Sonuçlar ve Faydaları:

  • Performans Artışı: Okuma trafiğinin çoğaltmalara yönlendirilmesiyle ana veritabanı sunucusunun üzerindeki yük dramatik bir şekilde azaldı. Ürün listeleme ve arama sayfaları çok daha hızlı yanıt vermeye başladı, bu da kullanıcı deneyimini önemli ölçüde iyileştirdi.
  • Yüksek Erişilebilirlik: Birincil ana veritabanı veya bir çoğaltma sunucusu arızalandığında, HAProxy'nin otomatik failover (devir teslim) yetenekleri sayesinde hizmet kesintileri önlendi. Keepalived ile HAProxy'nin kendisi de yüksek erişilebilir kılındığından, tek bir hata noktası ortadan kaldırılmış oldu.
  • Ölçeklenebilirlik: Gelecekte trafik daha da arttığında, TrendyMağaza kolayca yeni okuma çoğaltmaları ekleyerek sistemi daha da ölçeklendirebilecekti.
  • Kaynak Verimliliği: Veritabanı sunucularının kaynakları daha verimli kullanıldı. Ana sunucu sadece yazma işlemlerine odaklanırken, çoğaltmalar okuma işlemlerine ayrıldı.

Bu senaryo, HAProxy'nin sadece bir yük dengeleyici olmanın ötesinde, kritik iş uygulamaları için nasıl bir yüksek erişilebilirlik ve performans çözümüne dönüştüğünü açıkça göstermektedir. TrendyMağaza, HAProxy sayesinde yoğun alışveriş dönemlerinde bile müşterilerine kesintisiz ve hızlı bir hizmet sunmayı başardı.

Uzman İpucu: HAProxy'nin connection pooling özelliği, veritabanı üzerindeki bağlantı kurma/kapatma yükünü azaltabilir. Bu, özellikle çok sayıda kısa ömürlü bağlantı açıp kapatan uygulamalar için performansı artırabilir. option http-server-close veya option http-keep-alive gibi ayarlar HTTP modunda kullanılsa da, TCP modunda timeout client, timeout server ve timeout connect ayarları bağlantı yönetimi için önemlidir.

Sonuç: HAProxy ile Veritabanı Yönlendirmede Neler Başardık?

Bu kapsamlı rehber boyunca, HAProxy'nin veritabanı bağlantılarını birden fazla sunucuya yönlendirme konusundaki kritik rolünü ve nasıl bir oyun değiştirici olabileceğini derinlemesine inceledik. Modern uygulama geliştirme ve altyapı yönetiminde karşılaşılan ölçeklenebilirlik, yüksek erişilebilirlik ve performans gibi temel zorluklara HAProxy'nin güçlü ve esnek bir çözüm sunduğunu gördük.

Başlangıçta karşılaşılan tek veritabanı sunucusunun getirdiği kısıtlamalardan, HAProxy'nin TCP modunda akıllı yük dengeleme yetenekleriyle nasıl kurtulabileceğimizi öğrendik. Yük dengeleme algoritmaları, sağlık kontrolleri ve adım adım yapılandırma örnekleriyle HAProxy'yi veritabanı altyapımıza nasıl entegre edeceğimiz konusunda pratik bilgiler edindik. Özellikle aktif-pasif ve aktif-aktif veritabanı mimarilerinde HAProxy'nin yüksek erişilebilirlik ve felaket kurtarma senaryolarındaki vazgeçilmez rolünü, ayrıca sınırlı da olsa okuma/yazma ayırma stratejilerinde nasıl kullanılabileceğini keşfettik.

Güvenlik ve izleme mekanizmaları sayesinde, veritabanı bağlantılarımızı SSL/TLS ile şifrelemenin, ACL'lerle erişimi kısıtlamanın ve istatistik sayfası ile sistem durumunu sürekli izlemenin önemini vurguladık. Gerçek dünya e-ticaret senaryosu, HAProxy'nin teorik yeteneklerinin pratikte nasıl büyük bir değer yaratabildiğini somut bir şekilde gözler önüne serdi.

Özetle, HAProxy ile veritabanı yönlendirme, sistemlerimizin:

  • Ölçeklenebilirliğini artırarak daha fazla kullanıcıya hizmet vermesini sağlar.
  • Yüksek Erişilebilirliğini garanti ederek kesintisiz hizmet sunar.
  • Performansını optimize ederek yanıt sürelerini kısaltır.
  • Güvenliğini güçlendirerek hassas veri akışını korur.
  • Yönetilebilirliğini kolaylaştırarak operasyonel yükü azaltır.

HAProxy, karmaşık veritabanı altyapılarını yönetmek için esnek, güçlü ve maliyet etkin bir çözümdür. Doğru yapılandırma ve stratejik yaklaşımla, uygulamalarınızın veritabanı katmanını geleceğe hazır hale getirebilirsiniz.

Sıkça Sorulan Sorular (SSS)

HAProxy sadece TCP modunda mı çalışır?

Hayır, HAProxy hem TCP (katman 4) hem de HTTP (katman 7) modlarında çalışabilir. Veritabanı bağlantıları gibi durum bilgisi olan (stateful) protokoller için genellikle TCP modunda kullanılırken, web sunucuları ve API'ler gibi HTTP tabanlı uygulamalar için HTTP modunda tercih edilir. Bu makalede veritabanı yönlendirmesi için TCP modu üzerine odaklandık.

HAProxy ile PostgreSQL, MSSQL gibi farklı veritabanlarını yönlendirebilir miyim?

Evet, HAProxy veritabanı protokolünden bağımsız olarak TCP bağlantılarını yük dengeleyebilir. MySQL (3306), PostgreSQL (5432), MSSQL (1433) veya başka herhangi bir veritabanı için aynı TCP modunda yapılandırmayı kullanarak port yönlendirmesi yapabilirsiniz. Önemli olan, HAProxy'nin ilgili portu dinlemesi ve arka uç sunucularının bu portta hizmet vermesidir.

HAProxy'nin performans üzerindeki etkisi nedir?

HAProxy, C diliyle yazılmış oldukça optimize edilmiş ve hızlı bir yazılımdır. Genellikle çok düşük gecikme süresi (latency) ekler ve yüksek bağlantı ve trafik hacimlerini kolayca yönetebilir. Doğru yapılandırıldığında, performansa olumsuz etkisi minimum düzeydedir, hatta veritabanı sunucularının üzerindeki yükü azaltarak genel sistem performansını artırabilir.

Veritabanı kümelerinde HAProxy yerine başka neler kullanabilirim?

HAProxy'ye alternatif olarak, donanım tabanlı yük dengeleyiciler (F5 Big-IP, Citrix ADC), diğer yazılım tabanlı yük dengeleyiciler (NGINX Plus, Envoy), veya veritabanına özel proxy'ler (ProxySQL for MySQL, PgBouncer for PostgreSQL) kullanılabilir. Seçim, projenin ihtiyaçlarına, bütçesine ve istenen özellik setine bağlıdır.

HAProxy yapılandırmasını canlıda nasıl güncellerim?

HAProxy, hizmeti kesintiye uğratmadan yapılandırma güncellemelerini destekler. Yapılandırma dosyanızda değişiklik yaptıktan sonra, sudo haproxy -c -f /etc/haproxy/haproxy.cfg komutuyla hatasız olduğunu doğrulayın. Ardından sudo systemctl reload haproxy komutunu kullanarak HAProxy'yi yeniden yükleyin. Bu komut, yeni bir HAProxy süreci başlatır ve eski bağlantıları yavaşça yeni sürece aktarırken, mevcut bağlantıların sorunsuz bir şekilde tamamlanmasını sağlar.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık