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.
