InfluxDB Cluster Kurulumu ve Yüksek Erişilebilirlik

Zaman serisi veritabanları arasında InfluxDB, özellikle metrik toplama, IoT verisi ve monitoring alanlarında adeta bir standart haline geldi. Tek node kurulum çoğu zaman başlangıç için yeterli olsa da production ortamında yüksek erişilebilirlik ve veri kaybı riski olmadan çalışmak istiyorsanız cluster kurulumu kaçınılmaz oluyor. Bu yazıda InfluxDB Enterprise cluster kurulumunu, yapılandırmasını ve production’da karşılaşabileceğiniz senaryoları ele alacağız.

InfluxDB Cluster Mimarisini Anlamak

InfluxDB cluster mimarisinde iki temel node tipi bulunuyor: Meta node ve Data node. Meta node’lar cluster’ın beyin kısmını oluşturuyor; hangi data node’un nerede olduğunu, hangi shard’ın hangi node’da tutulduğunu takip ediyor. Data node’lar ise asıl zaman serisi verilerini saklıyor.

Minimum production kurulumu için:

  • 3 adet Meta node (Raft consensus algoritması için tek sayı şart)
  • 2 adet Data node (replikasyon için minimum)

Meta node’ların sayısının tek olması kritik. Çift sayıda meta node ile cluster split-brain durumuna düşebilir ve bu genellikle felakete yol açar. 3 meta node ile bir tanesi çöktüğünde bile cluster çalışmaya devam eder.

Ortam Hazırlığı

Önce tüm node’larda hostname ve /etc/hosts ayarlarını yapılandıralım. Bu adımı atlamak cluster kurulumunda en sık karşılaşılan sorunların kaynağı oluyor.

# Her node'da hostname ayarla
# Meta node 1'de:
hostnamectl set-hostname influx-meta-01

# Meta node 2'de:
hostnamectl set-hostname influx-meta-02

# Meta node 3'de:
hostnamectl set-hostname influx-meta-03

# Data node 1'de:
hostnamectl set-hostname influx-data-01

# Data node 2'de:
hostnamectl set-hostname influx-data-02

Tüm node’larda /etc/hosts dosyasını güncelle:

cat >> /etc/hosts << 'EOF'
192.168.10.11   influx-meta-01
192.168.10.12   influx-meta-02
192.168.10.13   influx-meta-03
192.168.10.21   influx-data-01
192.168.10.22   influx-data-02
EOF

Firewall kurallarını da ayarlamak gerekiyor. InfluxDB cluster’ı birkaç farklı port kullanıyor:

# Meta node'larda açılması gereken portlar
firewall-cmd --permanent --add-port=8088/tcp   # Meta node HTTP
firewall-cmd --permanent --add-port=8089/tcp   # Meta node RPC
firewall-cmd --permanent --add-port=8091/tcp   # Meta service

# Data node'larda açılması gereken portlar
firewall-cmd --permanent --add-port=8086/tcp   # InfluxDB HTTP API
firewall-cmd --permanent --add-port=8088/tcp   # Data node RPC
firewall-cmd --permanent --add-port=2003/tcp   # Graphite (opsiyonel)

firewall-cmd --reload

InfluxDB Enterprise Kurulumu

InfluxDB Enterprise lisanslı bir ürün, ancak 14 günlük deneme lisansı ile test edebilirsiniz. Lisans anahtarını aldıktan sonra kuruluma geçelim.

Meta Node Kurulumu

Tüm meta node’larda şu adımları uygula:

# Repository ekle
cat > /etc/yum.repos.d/influxdb.repo << 'EOF'
[influxdb]
name = InfluxDB Repository
baseurl = https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

# Meta node paketini kur
yum install -y influxdb-meta

# Ubuntu/Debian için:
# wget https://dl.influxdata.com/enterprise/releases/influxdb-meta_1.11.0-c1.11.0_amd64.deb
# dpkg -i influxdb-meta_1.11.0-c1.11.0_amd64.deb

Meta node yapılandırması kritik. /etc/influxdb/influxdb-meta.conf dosyasını düzenle:

# influx-meta-01 için yapılandırma
cat > /etc/influxdb/influxdb-meta.conf << 'EOF'
[meta]
  dir = "/var/lib/influxdb/meta"
  bind-address = ":8089"
  http-bind-address = ":8091"
  https-enabled = false
  hostname = "influx-meta-01"
  
  # Lisans bilgileri
  license-key = "BURAYA_LISANS_ANAHTARINIZI_YAZIN"
  
  # Cluster iletişim ayarları
  lease-duration = "1m0s"
  heartbeat-timeout = "1000ms"
  election-timeout = "1000ms"
  commit-timeout = "50ms"
  
  # Log ayarları
  logging-enabled = true
EOF

Her meta node’da kendi hostname’ini doğru şekilde yapılandırman gerekiyor. influx-meta-02 ve influx-meta-03 için de aynı dosyayı oluştur, sadece hostname satırını değiştir.

Data Node Kurulumu

Data node’larda InfluxDB Enterprise data paketini kur:

yum install -y influxdb

# Data node yapılandırması
cat > /etc/influxdb/influxdb.conf << 'EOF'
[meta]
  meta-tls-enabled = false
  meta-insecure-tls = false
  
  # Meta node adresleri - tüm meta node'ları listele
  meta-server-addr = "influx-meta-01:8091"

[data]
  dir = "/var/lib/influxdb/data"
  wal-dir = "/var/lib/influxdb/wal"
  
  # WAL flush ayarları - SSD için optimize
  wal-fsync-delay = "0s"
  max-series-per-database = 1000000
  max-values-per-tag = 100000
  
  # Retention policy için
  cache-max-memory-size = "1g"
  cache-snapshot-memory-size = "25m"
  cache-snapshot-write-cold-duration = "10m"
  compact-full-write-cold-duration = "4h"

[http]
  enabled = true
  bind-address = ":8086"
  auth-enabled = true
  log-enabled = true
  
  max-connection-limit = 0
  max-body-size = 25000000

[cluster]
  shard-writer-timeout = "5s"
  write-timeout = "10s"
  max-remote-write-connections = 3
  hinted-handoff-enabled = true
  max-hinted-handoff-size = "10737418240"

[hinted-handoff]
  enabled = true
  dir = "/var/lib/influxdb/hh"
  max-size = 10737418240
  max-age = "168h"
  retry-rate-limit = 0
  retry-interval = "1s"
  retry-max-interval = "10s"
  purge-interval = "1m0s"

[logging]
  format = "auto"
  level = "info"
  suppress-logo = false
EOF

Cluster’ı Ayağa Kaldırma

Servisleri başlatma sırası önemli. Önce meta node’ları başlat:

# Tüm meta node'larda
systemctl enable influxdb-meta
systemctl start influxdb-meta

# Servis durumunu kontrol et
systemctl status influxdb-meta
journalctl -u influxdb-meta -f

Meta node’lar başladıktan sonra cluster’ı oluştur. Bu işlemi sadece bir meta node’dan yapıyoruz:

# influx-meta-01 üzerinde çalıştır
influxd-ctl add-meta influx-meta-01:8091
influxd-ctl add-meta influx-meta-02:8091
influxd-ctl add-meta influx-meta-03:8091

# Meta cluster durumunu kontrol et
influxd-ctl show

# Çıktı şuna benzer olmalı:
# Data Nodes
# ==========
# (henüz yok)
#
# Meta Nodes
# ==========
# influx-meta-01:8091
# influx-meta-02:8091
# influx-meta-03:8091

Şimdi data node’ları cluster’a ekle:

# Data node servislerini başlat
systemctl enable influxdb
systemctl start influxdb

# influx-meta-01 üzerinden data node'ları ekle
influxd-ctl add-data influx-data-01:8088
influxd-ctl add-data influx-data-02:8088

# Cluster durumunu tekrar kontrol et
influxd-ctl show

Replikasyon ve Retention Policy Yapılandırması

Cluster hazır olduğunda, veritabanı oluştururken replikasyon faktörünü belirtmek gerekiyor. Bu kritik bir adım.

# InfluxDB CLI'ya bağlan
influx -host influx-data-01 -port 8086

# Veritabanı oluştur - replication factor 2 (her data node'da bir kopya)
CREATE DATABASE metrics WITH REPLICATION 2 NAME "default"

# Retention policy ekle
CREATE RETENTION POLICY "30days" ON "metrics" 
  DURATION 30d REPLICATION 2 DEFAULT

# Uzun süreli veri için downsampled retention policy
CREATE RETENTION POLICY "1year" ON "metrics" 
  DURATION 365d REPLICATION 2

# Mevcut retention policy'leri listele
SHOW RETENTION POLICIES ON metrics

Continuous query ile downsampling yapıyoruz. Bu özellikle metrik yoğun ortamlarda disk tasarrufu sağlıyor:

# Dakikalık veriden saatlik özet oluştur
CREATE CONTINUOUS QUERY "cq_hourly_avg" ON "metrics"
RESAMPLE EVERY 1h FOR 2h
BEGIN
  SELECT mean(*) INTO "1year".:MEASUREMENT
  FROM /.*/ 
  WHERE time > now() - 1h
  GROUP BY time(1h), *
END

Yüksek Erişilebilirlik: Load Balancer Kurulumu

Data node’ların önüne bir load balancer koymak production’da şart. HAProxy bu iş için ideal:

# HAProxy kurulumu
yum install -y haproxy

cat > /etc/haproxy/haproxy.cfg << 'EOF'
global
    maxconn 50000
    log /dev/log local0
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    user haproxy
    group haproxy
    daemon

defaults
    mode http
    log global
    option httplog
    option dontlognull
    option forwardfor
    timeout connect 5s
    timeout client 50s
    timeout server 50s

frontend influxdb_frontend
    bind *:8086
    default_backend influxdb_backend

backend influxdb_backend
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    
    server influx-data-01 192.168.10.21:8086 check inter 2s rise 2 fall 3
    server influx-data-02 192.168.10.22:8086 check inter 2s rise 2 fall 3

# HAProxy istatistik sayfası
listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:guclu_sifre_123
EOF

systemctl enable haproxy
systemctl start haproxy

Hinted Handoff: Veri Bütünlüğünün Sigortası

Cluster’ın en kritik özelliklerinden biri Hinted Handoff mekanizması. Bir data node geçici olarak erişilemez hale geldiğinde, yazılacak veriler diğer node’da geçici olarak saklanıyor ve node tekrar çevrimiçi olduğunda senkronize ediliyor. Bu mekanizma sayesinde kısa süreli node kesintilerinde veri kaybı yaşanmıyor.

Hinted handoff durumunu izlemek için:

# Hinted handoff kuyruğunu kontrol et
influxd-ctl hh

# Belirli bir node için hh durumu
influxd-ctl hh -target influx-data-02:8088

# HH istatistiklerini görüntüle
curl -s http://influx-data-01:8086/debug/vars | 
  python3 -c "import sys,json; d=json.load(sys.stdin); 
  print(json.dumps(d.get('hh', {}), indent=2))"

Monitoring ve Alerting

Cluster’ı izlemek için InfluxDB’nin kendi monitoring özelliğini kullanalım. Bu özellik ile cluster metriklerini ayrı bir InfluxDB instance’ına yazabilirsiniz:

# influxdb.conf'a ekle (data node)
[monitor]
  store-enabled = true
  store-database = "_internal"
  store-interval = "10s"

# Telegraf ile cluster'ı izle
cat > /etc/telegraf/telegraf.d/influxdb-cluster.conf << 'EOF'
[[inputs.influxdb]]
  urls = [
    "http://influx-data-01:8086/debug/vars",
    "http://influx-data-02:8086/debug/vars"
  ]
  timeout = "5s"

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

[[outputs.influxdb]]
  urls = ["http://localhost:8086"]
  database = "monitoring"
  username = "telegraf"
  password = "telegraf_sifresi"
EOF

systemctl restart telegraf

Backup ve Recovery Stratejisi

Production’da backup stratejisi olmadan cluster kurmak, emniyet kemeri takmadan araba sürmek gibi. InfluxDB Enterprise’da backup alma:

#!/bin/bash
# /usr/local/bin/influxdb-backup.sh

BACKUP_DIR="/backup/influxdb"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# Backup dizini oluştur
mkdir -p "$BACKUP_DIR/$DATE"

# Full backup al
influxd-ctl backup 
  -strategy full 
  "$BACKUP_DIR/$DATE"

# Backup boyutunu logla
BACKUP_SIZE=$(du -sh "$BACKUP_DIR/$DATE" | cut -f1)
echo "[$(date)] Backup tamamlandi. Boyut: $BACKUP_SIZE, Dizin: $BACKUP_DIR/$DATE"

# Eski backupları temizle
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} ;

# Backup durumunu kontrol et
if [ $? -eq 0 ]; then
    echo "[$(date)] Backup basarili tamamlandi."
else
    echo "[$(date)] HATA: Backup basarisiz!" >&2
    exit 1
fi

Cron’a ekle:

chmod +x /usr/local/bin/influxdb-backup.sh
echo "0 2 * * * root /usr/local/bin/influxdb-backup.sh >> /var/log/influxdb-backup.log 2>&1" >> /etc/cron.d/influxdb-backup

Recovery senaryosunda:

# Belirli bir veritabanını restore et
influxd-ctl restore 
  -db metrics 
  -newdb metrics_restored 
  /backup/influxdb/20240315_020000

# Tüm cluster'ı restore et (dikkatli kullan!)
influxd-ctl restore -full /backup/influxdb/20240315_020000

Gerçek Dünya Senaryosu: Node Kaybı Durumu

Production’da en sık karşılaşılan senaryo node kaybı. influx-data-02 çöktüğünü varsayalım:

# Cluster durumunu kontrol et
influxd-ctl show

# Hinted handoff birikimini gör
influxd-ctl hh

# Node'u cluster'dan geçici olarak çıkar (bakım için)
influxd-ctl remove-data influx-data-02:8088

# Disk değişimi, OS güncellemesi vb. işlemler...

# Node tekrar hazır olduğunda cluster'a ekle
influxd-ctl add-data influx-data-02:8088

# Shard kopyalama durumunu kontrol et
influxd-ctl show-shards

# Eksik shardları kopyala
influxd-ctl copy-shard influx-data-01:8088 influx-data-02:8088 SHARD_ID

Performans Optimizasyonu

Cluster kurulduktan sonra performans tuning da önemli. Özellikle yüksek yazma yükü altında:

# Data node'larda kernel parametreleri
cat >> /etc/sysctl.conf << 'EOF'
# InfluxDB için optimize
vm.swappiness = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
EOF

sysctl -p

# Disk I/O scheduler (SSD için)
echo "none" > /sys/block/sda/queue/scheduler

# Systemd servis limitleri
mkdir -p /etc/systemd/system/influxdb.service.d/
cat > /etc/systemd/system/influxdb.service.d/limits.conf << 'EOF'
[Service]
LimitNOFILE=65536
LimitNPROC=65536
EOF

systemctl daemon-reload
systemctl restart influxdb

Cluster Sağlığını Düzenli Kontrol Etme

Cluster sağlığını düzenli kontrol eden bir script hazırlamak iyi bir pratik:

#!/bin/bash
# /usr/local/bin/influxdb-health-check.sh

ALERT_EMAIL="[email protected]"
META_NODES=("influx-meta-01:8091" "influx-meta-02:8091" "influx-meta-03:8091")
DATA_NODES=("influx-data-01:8086" "influx-data-02:8086")

check_meta_nodes() {
    for node in "${META_NODES[@]}"; do
        host=$(echo $node | cut -d: -f1)
        port=$(echo $node | cut -d: -f2)
        if ! curl -sf "http://$node/status" > /dev/null 2>&1; then
            echo "KRITIK: Meta node $node erisilebilir degil!"
            echo "Meta node $node down!" | mail -s "InfluxDB Cluster Alarmi" $ALERT_EMAIL
        fi
    done
}

check_data_nodes() {
    for node in "${DATA_NODES[@]}"; do
        health=$(curl -sf "http://$node/health" 2>/dev/null)
        status=$(echo $health | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null)
        if [ "$status" != "pass" ]; then
            echo "UYARI: Data node $node durumu: $status"
            echo "Data node $node saglik durumu: $status" | mail -s "InfluxDB Data Node Uyarisi" $ALERT_EMAIL
        fi
    done
}

check_meta_nodes
check_data_nodes

# HH birikimini kontrol et
HH_SIZE=$(influxd-ctl hh 2>/dev/null | grep -v "^$" | wc -l)
if [ "$HH_SIZE" -gt 0 ]; then
    echo "BILGI: Hinted Handoff kuyrugunda bekleyen veri var."
fi

echo "[$(date)] Saglik kontrolu tamamlandi."

Sonuç

InfluxDB cluster kurulumu ilk bakışta karmaşık görünse de adımları doğru sırayla uyguladığınızda son derece kararlı bir sistem elde ediyorsunuz. Dikkat edilmesi gereken kritik noktaları özetleyelim:

  • Meta node sayısı her zaman tek olsun, 3 veya 5. Çift sayı cluster’ı felç edebilir.
  • Hinted Handoff konfigürasyonunu ihmal etme. Bu mekanizma kısa süreli node kayıplarında veri bütünlüğünü koruyan sigortadır.
  • Backup rutini kurulumun başından itibaren çalışır durumda olsun. Kurtarma senaryolarını da test et, sadece backup almak yetmez.
  • Load balancer önünde mutlaka sağlık kontrol endpoint’ini kullan, böylece sorunlu node’a istek gitmez.
  • Retention policy ve replikasyon faktörü her veritabanı için bilinçli şekilde belirlenmeli. Disk kapasiteni göz önünde bulundur.
  • Monitoring eksik olmasın. Cluster metriklerini ayrı bir InfluxDB instance’ına yazmak en iyi pratiğin parçası.

Cluster’ı production’a almadan önce failure senaryolarını mutlaka test et: bir meta node’u kapat, bir data node’u kapat ve sistemin nasıl davrandığını gözlemle. Başarısızlık anı değil, başarısızlığa hazırlık anı seni asıl sysadmin yapar.

Bir yanıt yazın

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