VDS (Sanal Özel Sunucu) üzerinde çalışan web uygulamaları, kullanıcı sayısı arttıkça veritabanına yapılan bağlantı isteklerinde sorun yaşamaya başlayabiliyor. Özellikle yüksek trafik dönemlerinde "Too many connections" hatası alırsanız, bunun sebebi çoğu zaman veritabanı bağlantı havuzunun yanlış yapılandırılması ya da tamamen kullanılmamasıdır. Bu rehberde, PostgreSQL, MySQL ve Node.js/PHP ortamlarında bağlantı havuzunun nasıl doğru ayarlanacağını pratik örneklerle gösterecek, sunucunuzun veritabanı kapasitesini maksimum kullanmanızı sağlayacağız.
Veritabanı Bağlantı Havuzu Nedir ve Neden Gereklidir?
Her bir kullanıcı isteği için sıfırdan veritabanı bağlantısı açmak oldukça maliyetlidir. TCP el sıkışması, kimlik doğrulama ve session kurulumu zaman alır. Bağlantı havuzu (connection pool), önceden açılmış bağlantıları bir kuyruğa koyar; uygulama ihtiyaç duyduğunda bu hazır bağlantıları yeniden kullanır. Bu sayede her istek için yeni bağlantı kurma yükü ortadan kalkar.
VDS'deki veritabanı, maksimum bağlantı sayısında bir sınıra sahiptir. Örneğin MySQL varsayılan olarak 150-200 eşzamanlı bağlantıya izin verir. Havuz yoksa ya da kötü yapılandırılmışsa, bağlantılar hızla tükenebilir ve uygulamanız yanıt vermeyi durdurur.
MySQL/MariaDB'de max_connections ve Thread Pool Ayarı
VDS'deki MySQL sunucusuna SSH erişimi sağladıktan sonra /etc/mysql/my.cnf (veya /etc/mysql/mysql.conf.d/mysqld.cnf) dosyasını açın:
max_connections = 500
max_user_connections = 100
thread_pool_size = 16
max_connections, sunucunun kabul edebileceği toplam bağlantı sayısıdır. VDS'nizin RAM'i ve CPU çekirdek sayısına göre ayarlayın. Kural olarak, (RAM GB × 50) + (CPU çekirdek sayısı × 10) formülü iyi bir başlangıç noktasıdır. max_user_connections ise tek bir kullanıcının açabileceği maksimum bağlantı sayısıdır; bu, bir rogue uygulamanın tüm bağlantıları almasını engeller.
Değişiklikler sonrası MySQL'i yeniden başlatın: systemctl restart mysql
Node.js Uygulamalarında Connection Pool: pg ve mysql2
Node.js'de pg (PostgreSQL) kullanıyorsanız:
const { Pool } = require('pg');
const pool = new Pool({
user: 'dbuser',
password: 'pass',
host: 'localhost',
port: 5432,
database: 'myapp',
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
max: 20, havuzda tutulacak maksimum bağlantı sayısıdır. CPU çekirdek başına 4-6 bağlantı ideal sayılır. idleTimeoutMillis, boş bağlantının ne kadar süre bekleyeceğini tanımlar (30 saniye yeterlidir). connectionTimeoutMillis ise bağlantı oluşturma için bekleme süresidir.
MySQL için mysql2/promise kullanıyorsanız:
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: 'pass',
database: 'mydb',
waitForConnections: true,
enableKeepAlive: true,
keepAliveInitialDelayMs: 0
});
enableKeepAlive: true, boş bağlantıları aktif tutarak MySQL'in "gone away" hatası vermesini engeller.
PHP Uygulamalarında PDO ve MySQLi Bağlantı Yönetimi
PHP'de persistent connections kullanmak önemlidir. PDO ile:
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb',
'user',
'pass',
[PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
PDO::ATTR_PERSISTENT => true ayarı, bağlantıyı script sonrası kapatmaz ve PHP-FPM process pool tarafından yeniden kullanılır. Ancak bunu kullanırken dikkat edin: maks 50-100 arasında persistent bağlantı yeterlidir, aksi halde veritabanı bağlantıları tükenebilir.
Daha kontrollü bir çözüm için PgBouncer (PostgreSQL) veya ProxySQL (MySQL) gibi bağlantı proxy'leri kullanabilirsiniz:
apt-get install pgbouncer
/etc/pgbouncer/pgbouncer.ini dosyasında:
[databases]
myapp = host=localhost port=5432 dbname=myapp
[pgbouncer]
pool_mode = transaction
max_client_conn = 200
default_pool_size = 25
pool_mode = transaction her transaction sonrası bağlantıyı havuza geri döndürür, en verimli modudur. Uygulamalar PgBouncer'a (5432) bağlanır, PgBouncer gerçek PostgreSQL'e (5433) bağlanır.
Bağlantı Havuzu Performansını İzleme
VDS'deki mevcut bağlantıları görmek için MySQL'de:
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads%';
PostgreSQL'de:
SELECT count(*) FROM pg_stat_activity;
Eğer bağlantı sayısı maksimuma yaklaşıyorsa, havuz boyutunu artırmayı düşünün. Aynı zamanda slow query log'u kontrol ederek uzun süren sorgularla bağlantıları tutan işlemleri tespit edip optimize edin.
Yaygın Hatalar ve Çözümleri
"Too many connections" hatası aldığınızda ilk kontrol noktası, uygulamada kapalı bağlantıların açılıp açılmadığıdır. Connection leak (bağlantı sızıntısı) kontrolü için:
- Bağlantı açma/kapama kodunu audit edin.
- Try-catch blokları içinde
connection.close()veyapool.release()çağrıldığından emin olun. - Belirtilen idleTimeout süresi içinde kapalı bağlantıları otomatik silin.
- VDS'de uygulama sunucusunun log dosyasında bağlantı hatalarını arayın.
Sonuç
Bağlantı havuzu doğru yapılandırıldığında, VDS'deki veritabanı kapasitesi 3-5 kat daha verimli kullanılır ve site yanıt hızı önemli ölçüde artar. MySQL max_connections, Node.js max: 20 ve PHP persistent connections kombinasyonu, çoğu orta-büyük ölçekli uygulamada yeterlidir. Eğer veritabanı yükü hâlâ yüksekse, PgBouncer veya ProxySQL gibi bağlantı proxy'lerini eklemeyi düşünün. Bogahost'un Türkiye lokasyonlu ve yüksek performanslı VDS sunucuları, bu ayarlamalar için ideal ortam sağlar; sunucunuza ilk gün erişim alıp hemen bağlantı havuzunu optimize etmeye başlayabilirsiniz.
Web Siteniz Hızlansın!
Blogumuzu beğendiniz mi? Web siteniz için yüksek performanslı ve %99.8 uptime garantili hosting paketlerimize göz atın.
Hosting Paketlerini İncele →