InfluxDB Nedir: Zaman Serisi Veritabanına Giriş

Zaman serisi verisi kavramını anlamadan InfluxDB’yi anlamak mümkün değil. O yüzden önce şunu düşün: sunucularının CPU kullanımını her 10 saniyede bir ölçüyorsun. Bir haftanın sonunda milyonlarca veri noktası oluyor. Bu veriyi klasik bir ilişkisel veritabanında saklamaya çalıştığında sorgu süreleri felç oluyor, disk alanı patlıyor ve indeksler giderek şişiyor. İşte tam bu noktada InfluxDB devreye giriyor.

InfluxDB Nedir?

InfluxDB, InfluxData şirketi tarafından Go diliyle yazılmış, açık kaynaklı bir zaman serisi veritabanıdır. 2013 yılında ilk sürümü çıkan bu veritabanı, özellikle metrik toplama, uygulama izleme, IoT veri depolama ve gerçek zamanlı analiz gibi kullanım senaryoları için optimize edilmiştir.

Klasik veritabanlarından temel farkı şudur: InfluxDB her veri noktasını bir zaman damgasıyla birlikte saklar ve zamanla ilgili sorgularda inanılmaz hız sunar. “Son 5 dakikadaki ortalama CPU kullanımı nedir?” ya da “Dün gece 02:00 ile 04:00 arasında memory spike oldu mu?” gibi soruları InfluxDB’ye sorduğunda PostgreSQL veya MySQL’e kıyasla çok daha hızlı ve verimli yanıt alırsın.

Piyasada Prometheus, TimescaleDB, OpenTSDB gibi rakipler de var ama InfluxDB’nin en büyük avantajlarından biri kendi sorgu dili olan InfluxQL ve daha yeni versiyonlarda kullanılan Flux diliyle birlikte çok kapsamlı bir ekosistem sunmasıdır. Telegraf, Chronograf ve Kapacitor araçlarıyla birlikte TICK Stack adı verilen tam bir izleme çözümü oluşturabilirsin.

Temel Kavramlar

InfluxDB’yi kullanmaya başlamadan önce bazı temel kavramları iyice kavramak gerekiyor. Bunlar klasik SQL dünyasından biraz farklı.

Measurement

SQL’deki tablo kavramına en yakın yapıdır. Bir measurement, benzer metriklerin toplandığı mantıksal bir gruptur. Örneğin cpu_usage, memory_stats, http_requests gibi adlar kullanılabilir. Ama dikkat et: measurement, bir tablonun tam karşılığı değildir. Çok daha esnek bir yapıya sahiptir.

Field ve Tag

Bu iki kavram InfluxDB’nin kalbini oluşturuyor:

  • Field: Gerçek ölçüm değeridir. Sayısal ya da string olabilir. İndekslenmez, bu yüzden field üzerinden filtreleme yapmak yavaştır. Örneğin cpu_percent=78.5 bir field’dir.
  • Tag: Metadata niteliğindeki etiketlerdir. İndekslenir, bu yüzden sorgularda filtreleme yaparken tag kullanmak çok daha hızlıdır. Örneğin host=webserver01, region=eu-west gibi değerler tag olarak saklanır.

Neyin tag neyin field olacağına karar verirken şu kuralı aklında tut: Filtrelemek istediğin şeyleri tag yap, ölçmek istediğin şeyleri field yap.

Series

Bir measurement + tag seti kombinasyonu bir series oluşturur. Yüksek kardinalite probleminin kaynağı burasıdır. Eğer tag olarak kullanıcı ID’si veya UUID gibi benzersiz değerler kullanırsan, series sayısı patlar ve performans düşer. Bu, InfluxDB kullanırken yapılan en yaygın hatalardan biridir.

Bucket ve Retention Policy

InfluxDB 2.x ile birlikte bucket kavramı geldi. Bucket, veriyi sakladığın ve aynı zamanda retention policy’yi tanımladığın birimdir. Retention policy, verinin ne kadar süre saklanacağını belirler. Örneğin sunucu metriklerini 30 gün saklayıp sonra otomatik silmek istiyorsan bunu bucket seviyesinde tanımlarsın.

Organization

InfluxDB 2.x’te her şey bir organization altında toplanıyor. Multi-tenant yapılar için kullanışlıdır. Tek bir InfluxDB instance’ında birden fazla organizasyon oluşturabilirsin.

InfluxDB 1.x mi, 2.x mi?

Bu soru sık soruluyor. Kısaca özetleyeyim:

  • InfluxDB 1.x: Daha olgun, geniş topluluk desteği, InfluxQL sorgu dili, database/retention policy yapısı. Eski sistemlerle entegrasyon kolaylığı.
  • InfluxDB 2.x: Yeni mimari, Flux sorgu dili, dahili kullanıcı yönetimi, token tabanlı kimlik doğrulama, Chronograf’ın dahili dashboard’u, bucket yapısı. Daha modern ama öğrenme eğrisi biraz dik.

Yeni bir projeye başlıyorsan ve mevcut bir bağımlılık yoksa 2.x ile gitmenizi öneririm. Bu yazıda InfluxDB 2.x üzerine odaklanacağız.

InfluxDB Kurulumu (Ubuntu 22.04)

Şimdi işin pratik kısmına geçelim. Aşağıdaki adımları takip ederek InfluxDB 2.x’i Ubuntu 22.04 üzerine kurabilirsin.

# InfluxData 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

# Repository 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

# Paketi güncelle ve kur
sudo apt update
sudo apt install -y influxdb2

# Servisi başlat ve aktif et
sudo systemctl start influxdb
sudo systemctl enable influxdb

# Çalışıp çalışmadığını kontrol et
sudo systemctl status influxdb

Kurulum tamamlandıktan sonra http://sunucu_ip:8086 adresine giderek web arayüzünden ilk kurulum adımlarını tamamlayabilirsin. Alternatif olarak komut satırından da yapabilirsin:

# CLI ile ilk kurulum (admin kullanıcı, org, bucket oluşturma)
influx setup 
  --username admin 
  --password GucluBirSifre123! 
  --org sysadmin-org 
  --bucket sistem-metrikleri 
  --retention 720h 
  --force

Buradaki --retention 720h değeri 30 günlük veri saklama politikasını belirliyor. Saklamak istemiyorsan 0 yazarak sınırsız yapabilirsin ama disk alanına dikkat et.

İlk Veri Yazma

InfluxDB’ye veri yazmanın birkaç yolu var. En basiti HTTP API üzerinden line protocol formatını kullanmaktır. Line protocol formatı şöyle çalışır:

measurement[,tag_key=tag_value...] field_key=field_value[,field_key=field_value] [unix_nanosecond_timestamp]

Gerçek bir örnek verelim:

# Token'ı bir değişkene ata (influx setup çıktısından alabilirsin)
INFLUX_TOKEN="senin_token_degerin_buraya"

# HTTP API ile veri yazma
curl -XPOST "http://localhost:8086/api/v2/write?org=sysadmin-org&bucket=sistem-metrikleri&precision=s" 
  --header "Authorization: Token $INFLUX_TOKEN" 
  --header "Content-Type: text/plain; charset=utf-8" 
  --data-binary "
cpu_usage,host=webserver01,region=eu-west value=78.5,idle=21.5 $(date +%s)
cpu_usage,host=webserver02,region=eu-west value=45.2,idle=54.8 $(date +%s)
memory_stats,host=webserver01 used_bytes=4294967296,free_bytes=2147483648 $(date +%s)
"

Birden fazla satırı tek bir istekte gönderebilirsin. Bu batch write yapısı performans açısından çok önemlidir. Her metriği ayrı ayrı HTTP isteğiyle göndermek yerine binlercesini tek seferde göndermek hem ağ hem de disk I/O açısından çok daha verimlidir.

CLI ile Veri Sorgulama

InfluxDB 2.x’te sorgular Flux diliyle yazılıyor. Flux biraz farklı bir sözdizime sahip ama güçlü ve esnek bir dil.

# influx CLI ile Flux sorgusu çalıştırma
influx query '
from(bucket: "sistem-metrikleri")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu_usage")
  |> filter(fn: (r) => r.host == "webserver01")
  |> mean()
' --token $INFLUX_TOKEN --org sysadmin-org

Bu sorgu son 1 saatteki webserver01 için ortalama CPU kullanımını döndürür. Flux’un pipe tabanlı (|>) sözdizimi, veri üzerinde zincir halinde işlem yapmanı sağlar.

Daha karmaşık bir senaryo düşünelim. Diyelim ki son 6 saatte CPU kullanımı %90’ı geçen tüm sunucuları bulmak istiyorsun:

influx query '
from(bucket: "sistem-metrikleri")
  |> range(start: -6h)
  |> filter(fn: (r) => r._measurement == "cpu_usage")
  |> filter(fn: (r) => r._field == "value")
  |> max()
  |> filter(fn: (r) => r._value > 90.0)
  |> keep(columns: ["host", "region", "_value", "_time"])
' --token $INFLUX_TOKEN --org sysadmin-org

Telegraf ile Otomatik Metrik Toplama

Gerçek dünyada metrikleri elle yazmıyorsun. Telegraf bu iş için kullanılan standart ajan. InfluxData’nın geliştirdiği bu araç 200’den fazla input plugin’i ile neredeyse her şeyin metriğini toplayabilir.

# Telegraf kurulumu
sudo apt install -y telegraf

# Telegraf konfigürasyon dosyasını düzenle
sudo nano /etc/telegraf/telegraf.conf

Minimal bir Telegraf konfigürasyonu şöyle görünür:

# /etc/telegraf/telegraf.conf örneği
# Aşağıdaki içeriği dosyaya ekle

cat << 'EOF' | sudo tee /etc/telegraf/telegraf.conf
[global_tags]
  env = "production"
  datacenter = "tr-ist-01"

[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  flush_interval = "10s"
  flush_jitter = "2s"
  precision = "0s"
  hostname = ""
  omit_hostname = false

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "SENIN_TOKEN_DEGERIN"
  organization = "sysadmin-org"
  bucket = "sistem-metrikleri"

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false
  core_tags = false

[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

[[inputs.mem]]

[[inputs.net]]
  interfaces = ["eth0", "eth1"]

[[inputs.system]]

[[inputs.processes]]
EOF

# Telegraf servisini yeniden başlat
sudo systemctl restart telegraf
sudo systemctl enable telegraf
sudo systemctl status telegraf

Telegraf başladıktan sonra birkaç dakika içinde InfluxDB’de veri görmeye başlarsın. Web arayüzünden Data Explorer kısmına giderek bu verileri gerçek zamanlı izleyebilirsin.

Bucket Yönetimi ve Retention Policy

Prodüksiyon ortamında farklı retention sürelerine ihtiyaç duyabilirsin. Örneğin:

  • Ham metrikler: 7 gün
  • Saatlik agregasyonlar: 90 gün
  • Günlük agregasyonlar: 2 yıl
# Yeni bucket oluşturma (90 günlük retention)
influx bucket create 
  --name agregasyon-90gun 
  --org sysadmin-org 
  --retention 2160h 
  --token $INFLUX_TOKEN

# Tüm bucket'ları listele
influx bucket list 
  --org sysadmin-org 
  --token $INFLUX_TOKEN

# Bucket silme (dikkatli ol, veri de silinir!)
influx bucket delete 
  --name test-bucket 
  --org sysadmin-org 
  --token $INFLUX_TOKEN

Gerçek Dünya Senaryosu: Web Sunucusu İzleme

Diyelim ki 10 adet Nginx sunucun var ve bunların response time, aktif bağlantı sayısı ve hata oranlarını izlemek istiyorsun. Telegraf’ın nginx input plugin’ini kullanarak bunu kolayca yapabilirsin.

Önce Nginx sunucularında stub_status modülünü aktif etmen gerekiyor:

# Nginx konfigürasyonuna status endpoint ekle
cat << 'EOF' | sudo tee /etc/nginx/conf.d/status.conf
server {
    listen 127.0.0.1:8080;
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}
EOF

sudo nginx -t && sudo systemctl reload nginx

Ardından Telegraf konfigürasyonuna Nginx input’unu ekle:

# /etc/telegraf/telegraf.d/nginx.conf dosyası oluştur
cat << 'EOF' | sudo tee /etc/telegraf/telegraf.d/nginx.conf
[[inputs.nginx]]
  urls = ["http://127.0.0.1:8080/nginx_status"]
  response_timeout = "5s"

  [inputs.nginx.tags]
    service = "nginx"
    tier = "web"
EOF

sudo systemctl restart telegraf

Artık Nginx metrikleri de InfluxDB’ye akıyor. Bunu Grafana ile görselleştirdiğinde oldukça güçlü bir monitoring stack’in oluyor.

Yedekleme ve Restore

InfluxDB’de veri kaybetmek felaket olur. Düzenli yedekleme almak zorunluluk.

# Tüm InfluxDB instance'ını yedekle
influx backup /yedek/klasoru/influxdb-$(date +%Y%m%d) 
  --token $INFLUX_TOKEN 
  --host http://localhost:8086

# Sadece belirli bir bucket'ı yedekle
influx backup /yedek/klasoru/sistem-metrikleri-$(date +%Y%m%d) 
  --token $INFLUX_TOKEN 
  --bucket sistem-metrikleri 
  --host http://localhost:8086

# Yedekten geri yükleme (dikkat: mevcut verinin üzerine yazar)
influx restore /yedek/klasoru/influxdb-20240115 
  --token $INFLUX_TOKEN 
  --host http://localhost:8086 
  --full

Yedekleme işlemini cron ile otomatize etmek:

# /etc/cron.d/influxdb-backup dosyası oluştur
cat << 'EOF' | sudo tee /etc/cron.d/influxdb-backup
# Her gece 02:00'de yedek al, 7 günden eski yedekleri sil
0 2 * * * root INFLUX_TOKEN="token_degerin" influx backup /var/backups/influxdb/$(date +%Y%m%d) --token $INFLUX_TOKEN && find /var/backups/influxdb/ -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +
EOF

Performans Optimizasyonu İpuçları

InfluxDB’yi doğru konfigüre etmezsen ciddi performans sorunları yaşayabilirsin. İşte dikkat etmen gereken noktalar:

  • Yüksek kardinalite’den kaçın: Tag olarak kullanıcı ID’si, email, UUID gibi benzersiz değerler kullanma. Bu series sayısını patlatır ve bellek tüketimini artırır.
  • Batch yazma kullan: Her veri noktasını ayrı HTTP isteğiyle göndermek yerine binlercesini bir arada gönder. Telegraf bunu otomatik yapıyor zaten.
  • Doğru retention policy belirle: Sonsuz veri saklama disk alanını tüketir. Her bucket için makul bir retention süresi koy.
  • Field tip tutarlılığını koru: Aynı field’e bir kez integer, bir kez float yazarsan InfluxDB hata verir. Veri tiplerini tutarlı tut.
  • SSD kullan: InfluxDB disk I/O yoğun bir veritabanıdır. Mümkünse SSD üzerinde çalıştır.
  • Bellek ayarlarını izle: InfluxDB 2.x varsayılan olarak makul ayarlarla gelir ama yoğun kullanımda /etc/influxdb/config.toml üzerinden bellek limitlerini düzenlemen gerekebilir.
  • WAL (Write-Ahead Log) ve TSM dosyalarını ayrı disklere koy: Okuma ve yazma I/O’sunu birbirinden ayırarak performansı artırabilirsin.

InfluxDB’nin Kullanım Alanları

Bu noktaya kadar teoriden ve kurulumdan bahsettik. Gerçek dünyada InfluxDB’nin nerede kullanıldığına bakarak konuyu pekiştirelim:

  • Altyapı izleme: Sunucu CPU, bellek, disk ve ağ metriklerini toplamak için en yaygın kullanım senaryosudur. Telegraf + InfluxDB + Grafana kombinasyonu bu iş için standarttır.
  • Uygulama performans izleme (APM): Uygulama response time, hata oranları, throughput gibi metrikleri saklamak için kullanılır.
  • IoT veri toplama: Sıcaklık sensörleri, enerji ölçüm cihazları, endüstriyel sensörler gibi IoT cihazlarından gelen yüksek hacimli veriyi saklamak.
  • Log analizi: Yapısal log verilerini zaman serisine dönüştürerek trend analizi yapmak.
  • Finans ve borsa: Hisse senedi fiyatları, işlem hacimleri gibi yüksek frekanslı finansal verileri saklamak.
  • Oyun sektörü: Oyuncu aktivitesi, sunucu yük metrikleri, eşzamanlı kullanıcı sayıları gibi verileri izlemek.

Grafana ile Görselleştirme

InfluxDB tek başına güçlü ama Grafana ile birleşince gerçekten parıldıyor. Grafana’ya InfluxDB veri kaynağı eklemek için:

  • Grafana’da Configuration > Data Sources > Add data source yolunu takip et.
  • InfluxDB seç.
  • Query Language olarak Flux seç.
  • URL olarak http://localhost:8086 gir.
  • Organization, Default Bucket ve Token bilgilerini doldur.
  • Save & Test butonuna bas.

Bağlantı başarılı olduktan sonra New Dashboard > Add Panel ile metric’lerini görselleştirmeye başlayabilirsin. Flux query editörüne aşina olduktan sonra son derece detaylı dashboard’lar oluşturabilirsin.

Güvenlik Notları

Prodüksiyon ortamında mutlaka dikkat etmen gereken birkaç güvenlik noktası var:

  • Varsayılan portu değiştir: 8086 portu herkesçe biliniyor. Güvenlik duvarıyla kısıtla ya da portu değiştir.
  • Token yönetimi: Her uygulama için minimum yetkiye sahip ayrı token oluştur. Admin token’ını uygulama konfigürasyonlarında kullanma.
  • HTTPS kullan: Özellikle InfluxDB’ye ağ üzerinden bağlanan Telegraf ajanların varsa TLS şifrelemesi zorunlu.
  • Ağ erişimini kısıtla: InfluxDB’yi sadece güvenilir IP’lerin erişebildiği bir ağ segmentine koy. Doğrudan internete açma.

Sonuç

InfluxDB, zaman serisi verisi söz konusu olduğunda genel amaçlı veritabanların yapamayacağı şeyleri son derece verimli şekilde yapan özelleşmiş bir araçtır. Eğer altyapını izliyorsan, IoT projen varsa ya da yüksek frekanslı metrik toplama ihtiyacın varsa InfluxDB cidden doğru seçim.

Başlangıç için önerim şu: Bir test ortamında InfluxDB 2.x kur, Telegraf ile sunucu metriklerini topla ve Grafana’ya bağla. Bu üçlüyü bir arada çalıştırdığında ne kadar güçlü bir izleme altyapısı kurulabildiğini kendin göreceksin. Sonrasında Flux dilini öğrenmek, özel alerting kuralları yazmak ve downsampling policy’leri oluşturmak gibi ileri konulara geçebilirsin.

Serideki sonraki yazılarda Telegraf plugin’lerini daha detaylı ele alacağız ve gerçek bir prodüksiyon senaryosunda InfluxDB cluster kurulumunu inceleyeceğiz. Sorularınız için yorumları kullanabilirsiniz.

Bir yanıt yazın

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