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_connectionsdeğ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.
