Farklı Donanımlar İçin En İyi MariaDB Konfigürasyonu

Neden profil bazlı ayar?

MariaDB’nin performansı; RAM, CPU çekirdek sayısı, disk I/O hızı ve iş yükü karakteri (okuma-yazma oranı, kısa/uzun işlemler, eşzamanlı bağlantı sayısı) ile belirlenir. Aşağıdaki profillerde hedefimiz:

  • Okuma/yazma hızını artırmak
  • Bellek kullanımını dengelemek
  • Disk I/O’yu azaltmak
  • Yüksek eşzamanlılıkta ölçeklenmek

Not: Değerler başlangıç noktasıdır. Canlı sistemde metrikleri izleyip ince ayar yapmanı öneririm.

Genel İlkeler (Tüm Profiller İçin)

  • InnoDB kullan: (MyISAM yerine) ACID, MVCC, tampon havuzu → tutarlı yüksek performans.
  • SSD/NVMe varsayımı: innodb_flush_method=O_DIRECT, innodb_flush_neighbors=0
  • Adanmış DB sunucusu: RAM’in %70–80’i innodb_buffer_pool_size için ayrılır.
  • Query Cache kapalı: Yüksek yazma/çok çekirdekli sistemlerde ölçeklenmeyi bozar.
  • Bağlantı havuzu: Uygulama tarafında (örn. PHP-FPM, JVM pool) mutlaka kullan.
  • Durabilite tercihi: En yüksek hız için innodb_flush_log_at_trx_commit=2 + sync_binlog=0 (küçük bir veri kaybı penceresini göze alır). Tam dayanıklılık istersen 1 ve 1.

Konfigürasyon Dosyası Konumu

Ubuntu için tipik yol:

  • Ana dosya: /etc/mysql/mariadb.conf.d/50-server.cnf (Bazı sistemlerde my.cnf veya 50-mysqld_safe.cnf de olabilir.)

Aşağıdaki blokları, ilgili dosyada [mysqld] bölümüne ekleyebilirsin.

Profil 1 — 4 vCPU / 8 GB RAM (4C/8G)

Hedef: Orta eşzamanlılık, web/raporlama karışık yük.

[mysqld]
# Depolama & Bellek
default_storage_engine=InnoDB
innodb_buffer_pool_size=5G
innodb_buffer_pool_instances=4
innodb_log_file_size=512M
innodb_log_files_in_group=2
innodb_log_buffer_size=128M
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0

# I/O & İş parçacıkları
innodb_io_capacity=800
innodb_io_capacity_max=1600
innodb_read_io_threads=4
innodb_write_io_threads=4
innodb_page_cleaners=4

# Dayanıklılık / Performans
innodb_flush_log_at_trx_commit=2   # 1 = en güvenli, 2 = performans tercih
sync_binlog=0                      # repl yoksa 0, varsa 1 önerilir

# Bağlantılar & Önbellekler
max_connections=300
thread_cache_size=100
thread_handling=pool-of-threads
table_open_cache=2000
table_open_cache_instances=8
table_definition_cache=2000
open_files_limit=65535
skip_name_resolve=ON

# Geçici tablolar / sıralama (her bağlantı için ayrılır: dikkatli artır)
tmp_table_size=64M
max_heap_table_size=64M
sort_buffer_size=2M
join_buffer_size=2M

# Diğer
max_allowed_packet=64M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

# Query Cache KAPALI
query_cache_type=0
query_cache_size=0

Profil 2 — 8 vCPU / 16 GB RAM (8C/16G)

Hedef: Daha yüksek eşzamanlılık, yoğun okuma + periyodik yazma.

[mysqld]
default_storage_engine=InnoDB
innodb_buffer_pool_size=12G
innodb_buffer_pool_instances=8
innodb_log_file_size=1G
innodb_log_files_in_group=2
innodb_log_buffer_size=256M
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0

innodb_io_capacity=2000
innodb_io_capacity_max=4000
innodb_read_io_threads=6
innodb_write_io_threads=6
innodb_page_cleaners=8

innodb_flush_log_at_trx_commit=2
sync_binlog=0

max_connections=500
thread_cache_size=200
thread_handling=pool-of-threads
table_open_cache=4000
table_open_cache_instances=8
table_definition_cache=4000
open_files_limit=100000
skip_name_resolve=ON

tmp_table_size=128M
max_heap_table_size=128M
sort_buffer_size=4M
join_buffer_size=4M

max_allowed_packet=128M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

query_cache_type=0
query_cache_size=0

Profil 3 — 16 vCPU / 32 GB RAM (16C/32G)

Hedef: Yüksek eşzamanlılık, karışık OLTP + analitik, daha büyük veri seti.

[mysqld]
default_storage_engine=InnoDB
innodb_buffer_pool_size=24G
innodb_buffer_pool_instances=12
innodb_log_file_size=2G
innodb_log_files_in_group=2
innodb_log_buffer_size=512M
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0

innodb_io_capacity=4000
innodb_io_capacity_max=8000
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_page_cleaners=12

innodb_flush_log_at_trx_commit=2
sync_binlog=0

max_connections=800
thread_cache_size=400
thread_handling=pool-of-threads
table_open_cache=8000
table_open_cache_instances=16
table_definition_cache=8000
open_files_limit=200000
skip_name_resolve=ON

tmp_table_size=256M
max_heap_table_size=256M
sort_buffer_size=4M
join_buffer_size=4M

max_allowed_packet=256M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

query_cache_type=0
query_cache_size=0

Profil 4 — 32 vCPU / 64 GB RAM (32C/64G)

Hedef: Çok yüksek eşzamanlılık, yoğun yazma + büyük analitik sorgular.

[mysqld]
default_storage_engine=InnoDB
innodb_buffer_pool_size=48G
innodb_buffer_pool_instances=16
innodb_log_file_size=4G       # FS sınırlarını kontrol et
innodb_log_files_in_group=2
innodb_log_buffer_size=1G
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0

innodb_io_capacity=8000
innodb_io_capacity_max=16000
innodb_read_io_threads=12
innodb_write_io_threads=12
innodb_page_cleaners=16

innodb_flush_log_at_trx_commit=2
sync_binlog=0

max_connections=1200
thread_cache_size=800
thread_handling=pool-of-threads
table_open_cache=16000
table_open_cache_instances=16
table_definition_cache=16000
open_files_limit=400000
skip_name_resolve=ON

tmp_table_size=512M
max_heap_table_size=512M
sort_buffer_size=4M
join_buffer_size=4M

max_allowed_packet=256M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

query_cache_type=0
query_cache_size=0

Notlar:

  • innodb_log_file_size büyüdükçe crash sonrası recovery süresi uzar; fakat yoğun yazma altında throughput artar.
  • tmp_table_size/max_heap_table_size her bağlantı için potansiyel kullanım olduğundan, çok yükseltirsen RAM patlamasına dikkat.
  • table_open_cache / open_files_limit uyumlu olmalı. Çok sayıda tablo varsa artır.

Replikasyon / Binlog (İsteğe Bağlı)

Replikasyon veya PITR (Point-in-Time Recovery) gerekiyorsa:

log_bin=binlog
binlog_format=ROW          # daha doğru repl
expire_logs_days=7
sync_binlog=1              # veri güvenliği için 1; hız için 0
server_id=1                # her sunucuda benzersiz
gtid_strict_mode=1         # GTID replikasyon planlıyorsan

Yüksek yazma trafikli sistemlerde sync_binlog=1 güvenli ama maliyetlidir. İhtiyaca göre karar ver.

İşletim Sistemi İyileştirmeleri

  • Swappiness düşür: vm.swappiness=1
  • noatime ile mount et: gereksiz disk yazımı azalır.
  • Açık dosya limiti: /etc/security/limits.conf → mysql soft/hard nofile 65535+
  • NVMe scheduler: modern kernel’de genellikle none idealdir.
  • NUMA: Bare-metal büyük makinelerde numactl –interleave=all veya BIOS/OS ayarı.

Uygulama ve İzleme

  • Bağlantı havuzu zorunlu: DB’ye direkt binlerce bağlantı yerine pool.
  • Durumu izle:
    • Buffer pool isabeti: SHOW ENGINE INNODB STATUS\G veya SHOW GLOBAL STATUS
    • Disk tabloya dönen geçici tablolar: Created_tmp_disk_tables
    • Threads_running, Innodb_row_lock_time, Handler_read% metrikleri
  • Gözlem→Ayarlama döngüsü: Değerleri kademeli değiştir, önce/stsonra ölç.

Hızlı Sağlık Kontrolleri (komutlar)

-- kritik değişkenler
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW GLOBAL VARIABLES LIKE 'innodb_log_file_size';
SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES LIKE 'tmp_table_size';

-- durum/metrikler
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
SHOW GLOBAL STATUS LIKE 'Handler_read%';

Test Araçları (isteğe bağlı)

  • sysbench (OLTP read/write): sentetik yük oluştur.
  • mysqlslap: basit eşzamanlılık testi.
  • pt-query-digest: yavaş sorguları çıkarır.

Örnek sysbench:

sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-user=test \
  --mysql-password=xxx --mysql-db=bench --tables=16 --table-size=200000 \
  --threads=64 --time=120 --report-interval=10 prepare

sysbench oltp_read_write ... run
sysbench oltp_read_write ... cleanup

Sorun Giderme İpuçları

  • CPU %100 ama I/O düşük: indeks eksikleri, yetersiz thread_pool ayarı, kötü sorgular.
  • I/O tıkanması: innodb_io_capacity artır, WAL/redo çok küçükse innodb_log_file_size büyüt.
  • Disk tmp tabloları çok: Created_tmp_disk_tables yüksekse tmp_table_size/max_heap_table_size artır, sorguları gözden geçir.
  • Too many connections: max_connections + uygulama pool; yetersizse kaynakları büyüt.

Bir yanıt yazın

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