MySQL Metriklerini Toplama: InfluxDB ve Telegraf Kullanımı

Veritabanı sunucunuzun ne durumda olduğunu gerçek zamanlı olarak bilmek, sorunları önceden fark etmek ve performans darboğazlarını çözmek için hayati önem taşır. MySQL metriklerini toplamak ve görselleştirmek için InfluxDB ve Telegraf ikilisini kullanmak, hem kurulumu hem de yönetimi açısından son derece pratik bir çözüm sunuyor. Bu yazıda sıfırdan başlayarak MySQL metriklerini InfluxDB’ye nasıl aktaracağınızı, Telegraf’ı nasıl yapılandıracağınızı ve gerçek dünya senaryolarında işinize yarayacak pratik ipuçlarını adım adım ele alacağız.

Genel Mimari ve Neden Bu Üçlü?

InfluxDB, zaman serisi verileri için tasarlanmış bir veritabanıdır. MySQL gibi bir veritabanının anlık bağlantı sayısı, sorgu süresi, buffer kullanımı gibi metrikleri zaman damgalı olarak saklamak için mükemmel bir seçimdir. Telegraf ise InfluxData’nın geliştirdiği ajan tabanlı bir metrik toplayıcıdır ve MySQL için hazır bir eklentiye sahiptir.

Mimari şu şekilde çalışır: Telegraf, MySQL sunucusuna bağlanarak metrikleri belirli aralıklarla çeker ve InfluxDB’ye yazar. Daha sonra Grafana gibi bir araç bu verileri görselleştirir. Bu yöntemin avantajları:

  • Düşük kaynak tüketimi: Telegraf son derece hafif çalışır, MySQL sunucunuzu ek yükle boğmaz
  • Hazır eklenti: MySQL için özel bir Telegraf eklentisi mevcuttur, sıfırdan kod yazmak gerekmez
  • Ölçeklenebilirlik: Birden fazla MySQL sunucusunu tek bir Telegraf ajanıyla izleyebilirsiniz
  • Esnek depolama: InfluxDB, zaman serisi verilerde SQL veritabanlarına kıyasla çok daha verimli çalışır

InfluxDB Kurulumu

Ubuntu 22.04 üzerinde InfluxDB 2.x kurulumunu ele alalım. Önce gerekli paket deposunu eklememiz gerekiyor.

# InfluxDB GPG anahtarını ekle
curl -s https://repos.influxdata.com/influxdata-archive_compat.key | 
  gpg --dearmor | 
  sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null

# Depoyu ekle
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] 
  https://repos.influxdata.com/ubuntu stable main' | 
  sudo tee /etc/apt/sources.list.d/influxdata.list

# Güncelle ve kur
sudo apt-get update
sudo apt-get install -y influxdb2

# Servisi başlat ve otomatik başlatmayı etkinleştir
sudo systemctl start influxdb
sudo systemctl enable influxdb

Kurulum tamamlandıktan sonra InfluxDB’yi ilk kez yapılandırmanız gerekiyor. Bu adımda organizasyon, bucket ve admin kullanıcısı oluşturuyorsunuz.

# İlk kurulum sihirbazını çalıştır
influx setup 
  --username admin 
  --password GucluBirSifre123! 
  --org myorg 
  --bucket mysql_metrics 
  --retention 30d 
  --force

Bu komut çalıştıktan sonra bir API token oluşturulacaktır. Bu token’ı not alın çünkü Telegraf yapılandırmasında kullanacaksınız. Eğer token’ı kaçırdıysanız aşağıdaki komutla yeni bir tane oluşturabilirsiniz:

# Yeni API token oluştur
influx auth create 
  --org myorg 
  --read-buckets 
  --write-buckets 
  --description "Telegraf yazma tokeni"

Telegraf Kurulumu

Telegraf, InfluxDB ile aynı depodan geldiği için ek bir repo eklemenize gerek yoktur.

# Telegraf kur
sudo apt-get install -y telegraf

# Servisi başlat
sudo systemctl start telegraf
sudo systemctl enable telegraf

Telegraf’ın ana yapılandırma dosyası /etc/telegraf/telegraf.conf konumundadır. Ancak bu dosyayı direkt düzenlemek yerine, modüler bir yaklaşım benimsemek daha iyi bir pratiktir. /etc/telegraf/telegraf.d/ dizinine ayrı yapılandırma dosyaları koyabilirsiniz.

MySQL için Kullanıcı Oluşturma

Telegraf’ın MySQL’e bağlanabilmesi için minimum yetkiye sahip bir kullanıcı oluşturmanız gerekiyor. Root kullanıcısını asla kullanmayın. Bunu gerçek bir üretim ortamında çok görmüşümdür ve ciddi güvenlik riski oluşturur.

-- MySQL'e root olarak bağlan ve kullanıcı oluştur
CREATE USER 'telegraf'@'localhost' IDENTIFIED BY 'TelegrafSifresi456!';

-- Gerekli minimum yetkiler
GRANT PROCESS ON *.* TO 'telegraf'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'telegraf'@'localhost';
GRANT SELECT ON performance_schema.* TO 'telegraf'@'localhost';
GRANT SELECT ON information_schema.* TO 'telegraf'@'localhost';

-- Eğer InnoDB metriklerini de toplamak istiyorsanız
GRANT SELECT ON mysql.* TO 'telegraf'@'localhost';

FLUSH PRIVILEGES;

Telegraf ayrı bir sunucuda çalışıyorsa 'telegraf'@'localhost' yerine 'telegraf'@'192.168.1.50' gibi IP adresi belirtmelisiniz.

Telegraf MySQL Eklentisi Yapılandırması

Şimdi asıl işe yarar kısma geliyoruz. MySQL eklentisi için ayrı bir yapılandırma dosyası oluşturalım:

sudo nano /etc/telegraf/telegraf.d/mysql.conf
# InfluxDB çıktı ayarları
[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "buraya-api-tokeninizi-yazin"
  organization = "myorg"
  bucket = "mysql_metrics"

# MySQL giriş eklentisi
[[inputs.mysql]]
  # DSN formatı: kullanici:sifre@protokol(adres:port)/
  servers = ["telegraf:TelegrafSifresi456!@tcp(127.0.0.1:3306)/"]

  # Ek metrik grupları
  metric_version = 2

  # Performance Schema metrikleri (MySQL 5.6+)
  gather_table_io_waits = true
  gather_index_io_waits = true
  gather_table_lock_waits = true

  # Sorgu istatistikleri
  gather_event_waits = false
  gather_file_events_stats = false

  # Slave/Replica metrikleri (replikasyon varsa true yapın)
  gather_slave_status = false

  # InnoDB metrik tablosu
  gather_innodb_metrics = true

  # Bağlantı havuzu istatistikleri
  gather_process_list = true

  # Toplama aralığı (saniye)
  interval = "30s"

Yapılandırmayı kaydettikten sonra Telegraf’ı yeniden başlatın:

sudo systemctl restart telegraf

# Log'ları kontrol et
sudo journalctl -u telegraf -f

Log’larda hata görmüyorsanız ve mysql measurement’larını görüyorsanız her şey yolunda demektir.

InfluxDB’de Verileri Doğrulama

Telegraf veri gönderiyor mu görmek için InfluxDB CLI veya web arayüzünü kullanabilirsiniz. Web arayüzü http://sunucu-ip:8086 adresinde çalışır.

CLI ile doğrulama yapmak için:

# InfluxDB CLI ile sorgu çalıştır
influx query '
from(bucket: "mysql_metrics")
  |> range(start: -10m)
  |> filter(fn: (r) => r._measurement == "mysql")
  |> limit(n: 5)
'

Eğer veri geliyorsa aşağıdakine benzer bir çıktı göreceksiniz. Boş sonuç alıyorsanız Telegraf log’larını tekrar kontrol edin.

Kritik MySQL Metrikleri ve Anlamları

Telegraf’ın topladığı onlarca metrik arasında gerçekten önemli olanlara odaklanmak gerekiyor. İşte dikkat etmeniz gereken kritik metrikler:

Bağlantı Metrikleri:

  • threads_connected: Şu an aktif olan bağlantı sayısı. max_connections değerine yaklaşıyorsa alarm verin
  • threads_running: Aktif sorgu çalıştıran thread sayısı. Ani artışlar sorun işareti
  • connection_errors_max_connections: Max bağlantı limitine ulaşıldığında artar, bu değer 0 olmalıdır

InnoDB Metrikleri:

  • innodb_buffer_pool_read_requests: Buffer pool’dan okunan sayfa sayısı
  • innodb_buffer_pool_reads: Diskten okunmak zorunda kalınan sayfa sayısı. Bu oranın düşük olması gerekir
  • innodb_row_lock_waits: Satır kilidi için bekleme sayısı. Yüksekse sorgu optimizasyonu gerekir

Sorgu Metrikleri:

  • queries: Toplam sorgu sayısı (saniyedeki değişim rate olarak izlenir)
  • slow_queries: Yavaş sorgu sayısı. Bu değer artıyorsa index’leri gözden geçirin
  • select_full_join: Index kullanmayan JOIN sayısı, her zaman 0 hedeflenmelidir

Birden Fazla MySQL Sunucusu İzleme

Gerçek dünyada genellikle birden fazla MySQL sunucusu bulunur. Telegraf bunu çok kolay halleder. Master ve replica sunucularını aynı anda izlemek için:

[[inputs.mysql]]
  servers = [
    "telegraf:TelegrafSifresi456!@tcp(db-master:3306)/",
    "telegraf:TelegrafSifresi456!@tcp(db-replica-1:3306)/",
    "telegraf:TelegrafSifresi456!@tcp(db-replica-2:3306)/"
  ]
  metric_version = 2
  gather_slave_status = true
  gather_innodb_metrics = true
  
  # Her sunucu için etiket ekle (Grafana'da filtreleme kolaylaşır)
  [inputs.mysql.tags]
    environment = "production"
    region = "eu-west-1"

Bu yapılandırmada server etiketi otomatik olarak eklenir, yani her metrik hangi sunucudan geldiğini belirtir. Grafana’da dashboard oluştururken bu etiketi kullanarak sunucu bazlı filtreleme yapabilirsiniz.

Uyarı Sistemi Kurma: Gerçek Dünya Senaryosu

Diyelim ki üretim ortamınızda MySQL bağlantı sayısı limite yaklaşıyorsa otomatik bildirim almak istiyorsunuz. InfluxDB 2.x’in dahili uyarı sistemiyle bunu yapabilirsiniz.

Önce bir kontrol (check) oluşturalım:

# InfluxDB CLI ile threshold check oluştur
influx check create threshold 
  --name "MySQL Baglanti Limiti" 
  --query 'from(bucket: "mysql_metrics")
    |> range(start: -5m)
    |> filter(fn: (r) => r._measurement == "mysql")
    |> filter(fn: (r) => r._field == "threads_connected")
    |> aggregateWindow(every: 1m, fn: mean)
    |> yield(name: "mean")' 
  --every 1m 
  --threshold-name "Kritik" 
  --threshold-type greater 
  --threshold-value 150 
  --level CRIT 
  --threshold-name "Uyari" 
  --threshold-type greater 
  --threshold-value 100 
  --level WARN

Bu örnek senaryoda max_connections = 200 olduğunu varsayıyoruz. 100’ü geçince uyarı, 150’yi geçince kritik alarm tetikleniyor.

Telegraf’ın Genel Yapılandırmasını Optimize Etme

Ana telegraf.conf dosyasındaki bazı ayarları da gözden geçirmek önemlidir:

sudo nano /etc/telegraf/telegraf.conf
[agent]
  # Varsayılan toplama aralığı
  interval = "10s"
  
  # Toplama zamanlamasında rastgele gecikme (çok ajanlı ortamlarda yararlı)
  jitter = "0s"
  
  # Flush aralığı
  flush_interval = "10s"
  flush_jitter = "0s"
  
  # Metrik tamponu (geçici bağlantı sorunlarında veri kaybını önler)
  metric_buffer_limit = 10000
  
  # Başarısız flush'larda yeniden deneme
  omit_hostname = false
  
  # Log seviyesi: error, warn, info, debug
  logfile = "/var/log/telegraf/telegraf.log"
  logfile_rotation_max_size = "10MB"
  logfile_rotation_max_archives = 5

MySQL eklentisi için daha sık veri toplamak isteyebilirsiniz. Ana interval = "10s" yerine eklenti seviyesinde override yapabilirsiniz:

[[inputs.mysql]]
  servers = ["telegraf:TelegrafSifresi456!@tcp(127.0.0.1:3306)/"]
  metric_version = 2
  
  # Bu eklenti için özel aralık
  [inputs.mysql]
    interval = "30s"

Performance Schema ile Detaylı Sorgu Analizi

MySQL 5.7 ve üzeri için Performance Schema etkinleştirilmişse çok daha detaylı metrikler toplayabilirsiniz. Önce MySQL tarafında kontrol edelim:

-- Performance Schema durumunu kontrol et
SHOW VARIABLES LIKE 'performance_schema';

-- Etkin değilse my.cnf'e ekleyip yeniden başlatın
-- [mysqld]
-- performance_schema = ON

-- Hangi instrumentler aktif?
SELECT NAME, ENABLED, TIMED 
FROM performance_schema.setup_instruments 
WHERE NAME LIKE 'statement/%' 
LIMIT 10;

Performance Schema aktif olduğunda Telegraf yapılandırmanızı genişletin:

[[inputs.mysql]]
  servers = ["telegraf:TelegrafSifresi456!@tcp(127.0.0.1:3306)/"]
  metric_version = 2
  gather_table_io_waits = true
  gather_index_io_waits = true
  gather_table_lock_waits = true
  gather_event_waits = true
  gather_file_events_stats = true
  gather_perf_events_statements = true
  
  # Yavaş sorguları ayrıntılı topla
  perf_events_statements_digest_text_limit = 120
  perf_events_statements_limit = 250
  perf_events_statements_time_limit = 86400

Bu ayarlarla hangi tabloların en fazla I/O bekleme yarattığını, hangi index’lerin yeterince kullanılmadığını ve hangi sorgu kalıplarının en uzun sürdüğünü görebilirsiniz. Üretim ortamında bir performans sorunu yaşandığında bu veriler altın değerindedir.

Disk ve Sistem Metriklerini de Ekleme

MySQL metrikleri tek başına yeterli değil. Disk doluysa MySQL durur, bellek yetmiyorsa performans çöker. Sistem metriklerini de aynı Telegraf ajanıyla toplayabilirsiniz:

# CPU metrikleri
[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false

# Disk kullanımı
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

# Disk I/O
[[inputs.diskio]]
  devices = ["sda", "sdb", "nvme0n1"]

# Bellek
[[inputs.mem]]

# Ağ
[[inputs.net]]
  interfaces = ["eth0", "ens3"]

Böylece tek bir dashboard’da hem MySQL hem de altta yatan sistem metriklerini görebilirsiniz. Bir sorunu debug ederken “bu yavaşlama sorgu mı yoksa disk mi?” sorusuna anında yanıt verebilirsiniz.

Güvenlik Sertleştirme: Production Ortamı İçin

Yapılandırmada DSN içinde şifre düz metin olarak duruyor. Production ortamı için bunu environment variable ile gizleyin:

# /etc/telegraf/telegraf.env dosyası oluştur
sudo nano /etc/default/telegraf
MYSQL_TELEGRAF_PASSWORD=TelegrafSifresi456!
INFLUXDB_TOKEN=buraya-api-tokeninizi-yazin
# Dosya izinlerini kısıtla
sudo chmod 600 /etc/default/telegraf
sudo chown telegraf:telegraf /etc/default/telegraf

Telegraf yapılandırmasında bu değişkenleri kullanın:

[[inputs.mysql]]
  servers = ["telegraf:${MYSQL_TELEGRAF_PASSWORD}@tcp(127.0.0.1:3306)/"]

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "${INFLUXDB_TOKEN}"
  organization = "myorg"
  bucket = "mysql_metrics"

Systemd servisi bu dosyayı otomatik olarak okur. /lib/systemd/system/telegraf.service dosyasına bakarsanız EnvironmentFile=/etc/default/telegraf satırını göreceksiniz.

Sorun Giderme: Sık Karşılaşılan Durumlar

Telegraf MySQL’e bağlanamıyor:

# Manuel bağlantı testi
mysql -u telegraf -p -h 127.0.0.1 -e "SHOW STATUS;" | head -20

# Telegraf yapılandırmasını test et
telegraf --config /etc/telegraf/telegraf.d/mysql.conf --test

# Debug modunda çalıştır
telegraf --config /etc/telegraf/telegraf.d/mysql.conf --test --debug

InfluxDB’ye veri gitmiyor:

# InfluxDB'nin çalıştığını doğrula
curl http://localhost:8086/health

# Token geçerliliğini test et
influx auth list

# Telegraf log'larını canlı izle
tail -f /var/log/telegraf/telegraf.log

Yanlış metrik toplanıyor:

# Hangi measurement'ların geldiğini listele
influx query '
from(bucket: "mysql_metrics")
  |> range(start: -1h)
  |> keys()
  |> keep(columns: ["_measurement"])
  |> distinct(column: "_measurement")
'

InfluxDB Bucket Yönetimi ve Veri Saklama

30 günden fazla veri saklamak gerekiyorsa veya farklı retention policy uygulamak istiyorsanız bucket ayarlarını güncelleyebilirsiniz:

# Mevcut bucket'ı güncelle (retention: 90 gün)
influx bucket update 
  --name mysql_metrics 
  --retention 2160h

# Uzun vadeli özet veriler için ayrı bir bucket oluştur
influx bucket create 
  --name mysql_metrics_summary 
  --retention 8760h 
  --org myorg

Uzun vadeli veri için InfluxDB task’ları kullanarak downsampling yapabilirsiniz. Anlık 30 saniyelik verileri saklarken 1 yıllık grafikler için 1 saatlik ortalamalar yeterlidir ve disk alanından ciddi tasarruf sağlar.

Grafana Entegrasyonu için Temel Hazırlık

InfluxDB’yi Grafana’ya bağlamak için data source eklemek gerekiyor. Grafana kurulu olduğunu varsayarak:

  • URL: http://influxdb-sunucu:8086
  • Organization: myorg
  • Token: Daha önce oluşturduğunuz API token
  • Default Bucket: mysql_metrics
  • Query Language: Flux

Grafana MarketPlace’de “MySQL Overview” araması yaparsanız topluluk tarafından hazırlanmış dashboard şablonlarına ulaşabilirsiniz. Bunları import edip kendi ortamınıza göre düzenlemek, sıfırdan dashboard oluşturmaktan çok daha hızlıdır.

Sonuç

MySQL metriklerini Telegraf ve InfluxDB ile toplamak, özellikle çoklu sunucu ortamlarında gözlemlenebilirlik açısından gerçek bir fark yaratıyor. Kurulumu tamamladıktan sonra ilk gün anlayamadığınız bir yavaşlama sorununu bir hafta sonra metrik grafıklarına bakarak dakikalar içinde teşhis edebilir hale geliyorsunuz.

Önemli noktalara tekrar değinecek olursak:

  • Telegraf için her zaman minimum yetkili ayrı bir MySQL kullanıcısı oluşturun
  • Şifreleri yapılandırma dosyasına düz metin yazmak yerine environment variable kullanın
  • Performance Schema etkinse mutlaka ilgili eklenti ayarlarını açın, en değerli veriler oradan geliyor
  • Sistem metriklerini de aynı Telegraf ajanına ekleyin, sorun tespitinde bütüncül bakış sağlar
  • Retention policy’yi baştan düzgün planlayın, sonradan değiştirmek veri kaybına neden olmaz ama disk planlamasını zorlaştırır

Bu altyapıyı bir kez kurduğunuzda, artık “acaba sorun ne?” diye tahmin yürütmek yerine veriye bakarak karar veriyorsunuz. Üretim ortamında bu fark hem gece uyku kalitenizi hem de müdahale sürelerinizi doğrudan etkiliyor.

Bir yanıt yazın

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