Veritabanı bağlantıları (SQL Server, Oracle, MySQL, PostgreSQL) için yük dengeleme yapabilir miyim?
Kısa cevap
Evet, L7 TCP vService ile. Veritabanı portu (SQL Server 1433, MySQL 3306, PostgreSQL 5432, Oracle 1521) frontend'de TCP protokolüyle yayınlanır ve Details panelindeki LB Algorithm kutusunda Least Connection seçilir. Dağıtım bağlantı düzeyinde yapılır: TR7 SQL sorgularını okumaz, bu yüzden okuma ve yazma sorgularını ayrı sunuculara ayıramaz; bunun için uygulamanın okuma bağlantılarını ayrı bir vService adresine yönlendirmesi gerekir. Uygulama bağlantı havuzlarındaki boşta bağlantıların kopmaması için Timeouts profilindeki Tunnel(Websocket) Timeout değeri (varsayılan 120 saniye) artırılır.
Sorun: Veritabanı Trafiği Neden Farklıdır?
Uygulamalar veritabanına genellikle bağlantı havuzuyla bağlanır: az sayıda bağlantı açılır ve uzun süre kullanılır. Bağlantılar arasındaki yük eşit değildir; bazı bağlantılar ağır sorgular çalıştırır. Ayrıca veritabanı sunucuları çoğu zaman eşit değildir (birincil ve okuma kopyaları); yazma işlemi yalnızca birincil sunucuya gidebilir.
Çözüm
L7 TCP vService ile bağlantı düzeyinde dağıtım
- Nasıl çalışır Her yeni veritabanı bağlantısı, o anda en az açık bağlantısı olan sağlıklı sunucuya gönderilir; bağlantı kapanana kadar aynı sunucuda kalır.
- Nerede açılır vService → Type: L7 TCP → Details → LB Algorithm → Least Connection
- Gereksinim Dağıtılan sunucuların aynı işi yapabilmesi (ör. yalnızca okuma kopyaları) ya da uygulamanın okuma ve yazma bağlantılarını ayrı adreslere göndermesi
- vService tipi L7 TCP
- Kurum Servisi tarafı Veritabanı sunucusu bağlantıları varsayılan olarak TR7'nin IP'sinden görür; kullanıcı erişimi istemci IP'sine göre kısıtlanıyorsa (ör. PostgreSQL
pg_hba.conf, MySQL kullanıcı host'u) TR7'nin IP'sine izin verilir ya da Kurum Servisinde SNAT → Use Client IP seçilir.
Adım adım yapılandırma
Load Balancer → Profiles → Health Checks ekranında Add butonuna tıklanır (nasıl eklenir).
Name girilir; Check Type olarak Oracle için Oracle (User, Password ve Connection String zorunludur), SQL Server, MySQL ve PostgreSQL için TCP seçilir; protokol düzeyinde gönder/bekle adımları gerekiyorsa TCP türündeki TCP Scenario alanına adımlar eklenir. Check type varsayılan olarak HTTP gelir ve kayıttan sonra değiştirilemez.
Formun altındaki Add butonuna tıklanır.
Load Balancer → Backend Services ekranında Add butonuna tıklanır (Kurum Servisi nasıl eklenir; hangi bilgiler zorunludur?).
Backend Service Name ve Address (ör. 192.0.2.60:1433) girilir; Health Check alanında 1–3. adımlarda oluşturulan profil seçilir.
Formun altındaki Add butonuna tıklanır. Her veritabanı sunucusu için 4–6. adımlar tekrarlanır.
Load Balancer → Profiles → Timeouts ekranında Add butonuna tıklanır (nasıl eklenir).
Name girilir ve Tunnel(Websocket) Timeout alanına uygulamanın bağlantı havuzundaki boşta bekleme süresinden büyük bir değer saniye olarak yazılır (en çok 60.000). Uzun süren sorgular varsa Server Timeout de (varsayılan 90 saniye) artırılır.
Formun altındaki Add butonuna tıklanır.
Load Balancer → Load Balancer vService List → Add adımları izlenir; Name girilir ve Type olarak L7 TCP seçilir.
Frontend satırında IP seçilir, port veritabanının portu yapılır ve Protocol olarak TCP seçilir. Veritabanı trafiği şifreliyse de TCP seçilir; TLS sunucuda kalır. IP listede yoksa önce Network → Interfaces → Actions → Add IP ile eklenir (Frontend IP'sini neden elle yazamıyorum; listede olmayan bir IP'yi (ör. IPv6) vService'te kullanmak için ne yapmalıyım?).
Default Backend Services tablosunda 4–6. adımlarda eklenen Kurum Servisleri seçilir.
Formun sağ üstündeki Details anahtarı açılır; LB Algorithm kutusundaki Algorithm alanında Least Connection seçilir. Varsayılan algoritma Round Robin'dir.
Details panelinde Timeout kutusu işaretlenir ve 7–9. adımlarda oluşturulan profil seçilir.
Save butonuna tıklanır. Cluster kurulumunda değişiklik varsayılan auto-sync ile eş cihaza da aktarılır; Manual Sync Mode açıksa Synchronize ile elle gönderilir.
Doğrulama
sqlcmd -S 203.0.113.50,1433 -Q "SELECT @@SERVERNAME"psql -h 203.0.113.50 -c "select inet_server_addr()"mysql -h 203.0.113.50 -e "select @@hostname"Komut birkaç kez çalıştırıldığında farklı sunucular dönervService'in vService Sessions ekranında açık bağlantıların Kurum Servislerine dağılımı görülür.
Bağlantılar sağlıklı Kurum Servislerine yayılmışSık Yapılan Hatalar
- Yazma işlemlerini okuma kopyalarına dağıtmak. TR7 sorguları ayırt etmez; yazma bağlantıları yalnızca birincil sunucuya giden ayrı bir vService adresine yönlendirilir.
- Süreyi varsayılanda bırakmak. Havuzdaki bir bağlantı 120 saniye boyunca kullanılmazsa kapatılır; uygulama "bağlantı kapandı" hatası alır.
- TCP + TLS seçmek. SQL Server, MySQL ve PostgreSQL varsayılan bağlantı biçiminde TLS'i kendi protokolünün içinde sonradan başlatır; bu TLS TR7'de sonlandırılamaz, Protocol TCP seçilir.
- Sunucu tarafı yönlendirmeyi unutmak. Bazı cluster özellikleri (okuma kopyasına yönlendirme, dinleyici yönlendirmesi) istemciye sunucunun kendi adresini bildirerek TR7'yi atlatabilir; bu özelliklerde bildirilen adres vService adresi yapılır.
- Health check atamamak. Health check tanımlı olmayan Kurum Servisi her zaman erişilebilir kabul edilir; kapanan sunucu bağlantı almaya devam eder.
Dokümantasyonda nasıl yapılır
