Merhaba arkadaşlar, bugün sizlere MySQL veya MariaDB sunucularınızın performansını ve stabilitesini doğrudan etkileyen en kritik dosyalardan biri olan my.cnf konfigürasyon dosyasındaki temel bağlantı ve bellek (tampon) ayarlarını nasıl yapılandıracağınızı anlatacağım. Özellikle yük altındaki sunucularda "Too many connections" hatası alanlar veya bellek tüketimini optimize etmek isteyenler için bu rehber çok faydalı olacak.
Bu ayarları doğru yapmak, sunucunuzun daha fazla eşzamanlı bağlantıyı yönetebilmesini, daha hızlı sorgu çalıştırmasını ve gereksiz bellek israfının önüne geçilmesini sağlar. Benim yönettiğim sunucularda da ilk baktığım ve ihtiyaca göre ayarladığım yer burasıdır.
my.cnf Dosyasını Bulma ve Yedekleme
İşe başlamadan önce, sisteminizdeki my.cnf dosyasının yerini bulmalıyız. Genellikle şu konumlardadır:
/etc/mysql/my.cnf
/etc/my.cnf
~/.my.cnf
Hangi dosyanın kullanıldığını öğrenmek için terminalde şu komutu çalıştırabilirsiniz:
Dosyayı düzenlemeden önce MUTLAKA yedek alın. Bu, bir hata yaparsanız geri dönüşünüzü sağlar.
Ardından, dosyayı nano veya vi gibi bir editörle açabilirsiniz:
Temel Bağlantı (Connection) Ayarları
Bu bölüm, veritabanınıza aynı anda kaç istemcinin bağlanabileceğini ve bağlantı havuzunu yönetir. En önemli iki parametre max_connections ve wait_timeout'dur.
Dikkat Edilmesi Gerekenler
max_connections değerini çok yüksek tutmak, sunucunuzun RAM'ini tüketip çökmesine neden olabilir. Değeri belirlerken, sunucunuzdaki toplam RAM'i ve her bağlantının ortalama ne kadar bellek kullandığını göz önünde bulundurun. wait_timeout değeri çok düşük olursa, uygulamanız sık sık yeni bağlantı kurmak zorunda kalır ve bu da performansı düşürür. Çok yüksek olursa, boş yere bağlantılar açık kalır ve kaynak israfı olur.
Temel Tampon (Buffer) ve Bellek Ayarları
Bu ayarlar, MySQL'in disk I/O işlemlerini azaltmak ve sorgu performansını artırmak için kullandığı bellek alanlarını yönetir. En kritik olanları innodb_buffer_pool_size ve key_buffer_size'dır.
Ayarları Test Etme ve Uygulama
my.cnf dosyasında değişiklik yaptıktan sonra, dosyanın sözdizimini (syntax) kontrol etmek iyi bir fikirdir. MariaDB için şu komutu kullanabilirsiniz:
Ardından, MySQL/MariaDB servisini yeniden başlatarak değişiklikleri aktif hale getirin:
Servisin sorunsuz başladığından emin olun. Eğer başlamazsa, yaptığınız yedeği geri yükleyin ve hatalı satırı kontrol edin. Başarıyla başladıysa, ayarlarınızın etkin olduğunu şu SQL sorgusuyla kontrol edebilirsiniz:
Sonuç olarak, bu ayarlar her sunucu için sihirli bir formül değildir. Sunucunuzun donanımına (RAM, CPU), iş yüküne ve kullanılan depolama motorlarına göre ince ayar yapmanız gerekebilir. Özellikle innodb_buffer_pool_size ayarı için sunucunuzdaki diğer servislerin (web sunucusu, php-fpm vb.) bellek ihtiyaçlarını da unutmayın.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle yüksek trafikli sistemlerde farklı bir yaklaşımınız var mı? Aklınıza takılan veya paylaşmak istediğiniz bir ayar varsa aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim.
Bu ayarları doğru yapmak, sunucunuzun daha fazla eşzamanlı bağlantıyı yönetebilmesini, daha hızlı sorgu çalıştırmasını ve gereksiz bellek israfının önüne geçilmesini sağlar. Benim yönettiğim sunucularda da ilk baktığım ve ihtiyaca göre ayarladığım yer burasıdır.
İşe başlamadan önce, sisteminizdeki my.cnf dosyasının yerini bulmalıyız. Genellikle şu konumlardadır:
/etc/mysql/my.cnf
/etc/my.cnf
~/.my.cnf
Hangi dosyanın kullanıldığını öğrenmek için terminalde şu komutu çalıştırabilirsiniz:
Bash:
mysql --help | grep "my.cnf"
Dosyayı düzenlemeden önce MUTLAKA yedek alın. Bu, bir hata yaparsanız geri dönüşünüzü sağlar.
Bash:
sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.backup_$(date +%F)
Ardından, dosyayı nano veya vi gibi bir editörle açabilirsiniz:
Bash:
sudo nano /etc/mysql/my.cnf
Bu bölüm, veritabanınıza aynı anda kaç istemcinin bağlanabileceğini ve bağlantı havuzunu yönetir. En önemli iki parametre max_connections ve wait_timeout'dur.
INI:
[mysqld]
# Maksimum eşzamanlı bağlantı sayısı. Varsayılan değer genelde 151'dir.
# Sunucunuzun RAM'ine göre artırın. Her bağlantı bellek kullanır, dikkatli ayarlayın.
max_connections = 300
# Bir bağlantı ne kadar süre boş kalırsa kapatılacağını belirtir (saniye cinsinden).
# Uzun süre boş kalan bağlantıları temizler, kaynakları serbest bırakır.
wait_timeout = 600
# Sunucunun dinleyeceği adres. Tüm ağ arayüzlerinden bağlantı kabul etmek için 0.0.0.0
# Sadece localhost'tan bağlantı kabul etmek için 127.0.0.1 kullanın (daha güvenli).
bind-address = 127.0.0.1
max_connections değerini çok yüksek tutmak, sunucunuzun RAM'ini tüketip çökmesine neden olabilir. Değeri belirlerken, sunucunuzdaki toplam RAM'i ve her bağlantının ortalama ne kadar bellek kullandığını göz önünde bulundurun. wait_timeout değeri çok düşük olursa, uygulamanız sık sık yeni bağlantı kurmak zorunda kalır ve bu da performansı düşürür. Çok yüksek olursa, boş yere bağlantılar açık kalır ve kaynak israfı olur.
Bu ayarlar, MySQL'in disk I/O işlemlerini azaltmak ve sorgu performansını artırmak için kullandığı bellek alanlarını yönetir. En kritik olanları innodb_buffer_pool_size ve key_buffer_size'dır.
INI:
[mysqld]
# InnoDB motoru için en önemli ayar. Tablo ve indeks verilerinin önbelleğe alındığı bellek alanı.
# Sunucunuzdaki toplam RAM'in %50-70'i kadar ayırmak genellikle iyi bir başlangıçtır.
# Örneğin, 8GB RAM'li bir sunucuda 4-5GB ayırabilirsiniz.
innodb_buffer_pool_size = 4G
# MyISAM tabloları için kullanılan indeks önbelleği. Eğer sadece InnoDB kullanıyorsanız küçük tutun.
key_buffer_size = 256M
# Sorgu önbelleği boyutu. MySQL 8.0'dan itibaren varsayılan olarak devre dışıdır.
# Eski sürümlerde kullanılıyorsa, sorgu önbelleği boyutunu belirler.
query_cache_size = 0
# Bir sorgunun sonucunu önbelleğe almak için gereken minimum boyut.
query_cache_limit = 1M
# Geçici tablolar için maksimum bellek boyutu. Bu sınır aşılırsa disk kullanılır.
tmp_table_size = 64M
max_heap_table_size = 64M
my.cnf dosyasında değişiklik yaptıktan sonra, dosyanın sözdizimini (syntax) kontrol etmek iyi bir fikirdir. MariaDB için şu komutu kullanabilirsiniz:
Bash:
sudo mysqld --verbose --help | head -20
Ardından, MySQL/MariaDB servisini yeniden başlatarak değişiklikleri aktif hale getirin:
Bash:
sudo systemctl restart mysql # veya mariadb
Servisin sorunsuz başladığından emin olun. Eğer başlamazsa, yaptığınız yedeği geri yükleyin ve hatalı satırı kontrol edin. Başarıyla başladıysa, ayarlarınızın etkin olduğunu şu SQL sorgusuyla kontrol edebilirsiniz:
SQL:
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
Sonuç olarak, bu ayarlar her sunucu için sihirli bir formül değildir. Sunucunuzun donanımına (RAM, CPU), iş yüküne ve kullanılan depolama motorlarına göre ince ayar yapmanız gerekebilir. Özellikle innodb_buffer_pool_size ayarı için sunucunuzdaki diğer servislerin (web sunucusu, php-fpm vb.) bellek ihtiyaçlarını da unutmayın.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle yüksek trafikli sistemlerde farklı bir yaklaşımınız var mı? Aklınıza takılan veya paylaşmak istediğiniz bir ayar varsa aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim.