Teknoloji AI Üretimi

Kapsamlı Elastic Stack (ELK) Kurulumu ve Mikroservis Loglarının Merkezi Yönetimi: Performans Optimizasyonları ve Darboğaz Çözümleri

1. Giriş: ELK Stack’in Mikroservislerdeki Kritik Rolü

Modern yazılım mimarilerinde mikroservislerin log yönetimi, sistemin genel sağlığı ve operasyonel verimliliği için hayati öneme sahiptir. 200+ mikroservisin çalıştığı bir ortamda, günlük 10TB+ log verisi üreten bir sistemde ELK Stack’in doğru konfigürasyonu, sadece arama performansını değil, aynı zamanda operasyonel maliyetleri %60’a kadar düşürebilir. Bu makalede, gerçek prodüksiyon senaryolarından yola çıkarak ELK Stack’in performans optimizasyonları, darboğaz çözümleri ve mimari kararları üzerinde duracağız.


2. ELK Stack Mimarisi: Temel Bileşenler ve Performans Etkileri

2.1. Logstash Pipeline Mimarisi ve Kritik Darboğazlar

Logstash, ELK Stack’in en kritik performans darboğazı olarak öne çıkar. Tipik bir mikroservis ortamında, Logstash’in input → filter → output pipeline’ı aşağıdaki sorunlarla karşılaşır:

  • Input Plugin Tıkanıklıkları: Kafka’dan gelen yüksek hacimli loglar, kafka input plugin’inin fetch.max.bytes ve max.poll.records ayarlarına bağlı olarak tıkanabilir.
  • Filter Plugin Yavaşlamaları: grok ve mutate gibi CPU-yoğun filtreler, tek bir worker thread’i bloke ederek pipeline’ı durdurabilir.
  • Output Plugin Sıkışmaları: Elasticsearch’e paralel yazma (bulk API) sırasında backpressure oluşması, pipeline’ın tamamen durmasına neden olabilir.
🚨 Prodüksiyon Faciası 2023 yılında, bir fintech şirketinde Logstash pipeline’ı, Kafka’dan gelen **30K EPS (Events Per Second)** logları işleyemez hale geldi. Sorunun kaynağı, `grok` filtresinin **regex optimizasyonu yapılmamış** olması ve `worker_count`’ın **CPU core sayısına göre ayarlanmaması** idi. Pipeline, 12 saat boyunca **%99 CPU kullanımı** ile çalıştı ve Elasticsearch’e veri yazılamadı. Çözüm: `grok` yerine `dissect` kullanımı ve `pipeline.workers: 8` (CPU core sayısı kadar) ayarı ile **%70 performans artışı** sağlandı.

2.2. Elasticsearch Shard ve Index Stratejileri

Elasticsearch’in performansı, shard boyutları ve index yönetimi ile doğrudan ilişkilidir. Yanlış shard konfigürasyonları, aşağıdaki sorunlara yol açar:

  • Hot Threads: Tek bir shard’a aşırı yük binmesi, hot_threads API’sinde sürekli olarak aynı shard’ın görünmesine neden olur.
  • Merge Sıkışmaları: Büyük shard’ların birleşmesi (merge), disk I/O’yu tıkayarak query performansını %50 düşürebilir.
  • Cluster State Bloat: 1000+ index’in olduğu bir kümede, cluster state boyutu 100MB+ olabilir ve bu, master node’ların çökmesine neden olabilir.
💡 Mimari Karar **Index Lifecycle Management (ILM)** kullanarak, log verilerini **hot-warm-cold fazlarına** ayırmak, performansı ve maliyeti optimize eder: - **Hot Phase**: SSD disklerde, **1 shard/2 replica**, 7 günlük veriler. - **Warm Phase**: HDD disklerde, **1 shard/1 replica**, 30 günlük veriler. - **Cold Phase**: S3/Glacier’da, **snapshot** olarak saklanır. Bu strateji, **disk maliyetlerini %40 düşürürken**, query performansını **%30 artırır**.

2.3. Kibana ve Veri Görselleştirme Performansı

Kibana’nın dashboard performansı, Elasticsearch’e gönderilen query’lerin optimizasyonuna bağlıdır. Sık karşılaşılan sorunlar:

  • Aggregation Timeout: terms aggregation’ları, büyük veri setlerinde timeout hatalarına neden olabilir.
  • Dashboard Lag: 10+ visualization içeren dashboard’lar, browser memory leak’lerine yol açabilir.
  • Saved Object Bloat: 1000+ saved object (dashboard, visualization), Kibana’nın startup süresini 5 dakikaya kadar uzatabilir.
ℹ️ Best Practice Kibana performansını artırmak için: - **Index Pattern Optimization**: `logstash-*` yerine `logstash-2023.10.*` gibi **zaman bazlı index pattern** kullanın. - **Query Caching**: Elasticsearch’te `request_cache: true` ayarını etkinleştirin. - **Dashboard Optimization**: Her dashboard’ta **maksimum 5 visualization** kullanın ve `size: 0` ile gereksiz veri çekimini engelleyin.

3. Logstash Pipeline Optimizasyonları: Gerçek Dünya Kodları

3.1. Kafka Input Plugin Optimizasyonu

Kafka’dan log çekerken, fetch.max.bytes ve max.poll.records ayarları kritik öneme sahiptir. Aşağıdaki konfigürasyon, 50K EPS logları sorunsuz işler:

input {
  kafka {
    bootstrap_servers => 'kafka-broker1:9092,kafka-broker2:9092'
    topics => ['microservice-logs']
    group_id => 'logstash-consumer'
    auto_offset_reset => 'earliest'
    decorate_events => true
    fetch_max_bytes => '52428800'  # 50MB
    max_poll_records => '1000'
    consumer_threads => 4
    codec => 'json'
  }
}
🚨 Kritik Uyarı `max_poll_records` değerini **1000’in üzerine çıkarmak**, Logstash’in bellek kullanımını **patlatabilir**. Her worker thread için **2GB heap** ayırarak OOM hatalarını önleyin.

3.2. Grok vs. Dissect: Performans Karşılaştırması

grok filtresi, regex tabanlı olduğu için CPU-yoğun bir işlemdir. Aynı log formatını işlemek için dissect kullanmak, %80 daha hızlı çalışır:

# Grok (Yavaş - Regex Tabanlı)
filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:log_message}" }
  }
}

# Dissect (Hızlı - Delimiter Tabanlı)
filter {
  dissect {
    mapping => {
      "message" => "%{timestamp} %{level} %{log_message}"
    }
  }
}

3.3. Elasticsearch Output Plugin ve Bulk API Optimizasyonu

Elasticsearch’e veri yazarken, bulk API kullanmak kritik öneme sahiptir. Aşağıdaki konfigürasyon, 20K EPS logları sorunsuz işler:

output {
  elasticsearch {
    hosts => ['https://es-node1:9200', 'https://es-node2:9200']
    index => 'microservice-logs-%{+YYYY.MM.dd}'
    document_id => '%{[@metadata][kafka][offset]}'
    doc_as_upsert => true
    workers => 8
    bulk_max_actions => 1000
    bulk_max_size => '10mb'
    retry_max_interval => 60
    retry_on_conflict => 3
    ilm_enabled => true
    ilm_policy => 'microservice-logs-policy'
  }
}
💡 Mimari Karar `bulk_max_actions` ve `bulk_max_size` değerlerini **dengeleyin**. Çok küçük bulk boyutları, **HTTP overhead**’e neden olurken, çok büyük boyutlar **bellek sıkıntısı** yaratabilir. **1000-5000 action** ve **5-10MB bulk size** ideal aralıktır.

4. Merkezi Loglama Mimarisi: Gerçek Dünya Senaryosu

4.1. Mimarinin Genel Yapısı (SVG Şeması)

Aşağıdaki SVG, 150+ mikroservisin loglarını işleyen bir ELK mimarisini göstermektedir:

<rect x="0" y="0" width="200" height="100" rx="8" fill="#3b82f6" filter="url(#glow)"></rect>
<text x="100" y="55" text-anchor="middle" fill="white" font-family="Arial" font-size="14">Microservices (150+)</text>

<rect x="250" y="20" width="150" height="60" rx="8" fill="#ef4444" filter="url(#glow)"></rect>
<text x="325" y="50" text-anchor="middle" fill="white" font-family="Arial" font-size="14">Kafka (3 Broker)</text>

<rect x="450" y="0" width="200" height="100" rx="8" fill="#10b981" filter="url(#glow)"></rect>
<text x="550" y="30" text-anchor="middle" fill="white" font-family="Arial" font-size="14">Logstash (4 Node)</text>
<text x="550" y="50" text-anchor="middle" fill="white" font-family="Arial" font-size="12">Pipeline Workers: 8</text>
<text x="550" y="70" text-anchor="middle" fill="white" font-family="Arial" font-size="12">Heap: 4GB</text>

<rect x="700" y="0" width="200" height="100" rx="8" fill="#8b5cf6" filter="url(#glow)"></rect>
<text x="800" y="30" text-anchor="middle" fill="white" font-family="Arial" font-size="14">Elasticsearch (6 Node)</text>
<text x="800" y="50" text-anchor="middle" fill="white" font-family="Arial" font-size="12">Shards: 60 (10/shard)</text>
<text x="800" y="70" text-anchor="middle" fill="white" font-family="Arial" font-size="12">Replicas: 1</text>

<rect x="950" y="20" width="150" height="60" rx="8" fill="#f59e0b" filter="url(#glow)"></rect>
<text x="1025" y="50" text-anchor="middle" fill="white" font-family="Arial" font-size="14">Kibana</text>

<path d="M200 50 L250 50" stroke="#6b7280" stroke-width="2" marker-end="url(#arrowhead)"></path>
<path d="M400 50 L450 50" stroke="#6b7280" stroke-width="2" marker-end="url(#arrowhead)"></path>
<path d="M650 50 L700 50" stroke="#6b7280" stroke-width="2" marker-end="url(#arrowhead)"></path>
<path d="M900 50 L950 50" stroke="#6b7280" stroke-width="2" marker-end="url(#arrowhead)"></path>
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
  <polygon points="0 0, 10 3.5, 0 7" fill="#6b7280"></polygon>
</marker>

4.2. Kafka’dan Logstash’e Veri Akışı ve Backpressure Yönetimi

Kafka’dan Logstash’e veri akışında, backpressure yönetimi kritik öneme sahiptir. Aşağıdaki stratejilerle bu sorun çözülebilir:

  1. Kafka Consumer Lag İzleme: kafka-consumer-groups.sh ile lag metriğini sürekli izleyin.
  2. Logstash Pipeline Throttling: throttle filtresi ile belirli bir EPS limiti belirleyin:
    filter {
      throttle {
        before_count =&gt; 1000
        after_count =&gt; 1000
        period =&gt; 1
        key =&gt; '%{[@metadata][kafka][topic]}'
        add_tag =&gt; ['throttled']
      }
    }
    
  3. Dead Letter Queue (DLQ): İşlenemeyen logları ayrı bir index’e yönlendirin:
    output {
      if "_throttled" in [tags] {
        elasticsearch {
          hosts =&gt; ['https://es-node1:9200']
          index =&gt; 'logstash-dlq-%{+YYYY.MM.dd}'
        }
      }
    }
    
ℹ️ Best Practice Kafka topic’lerini **partition sayısına göre** Logstash node sayısını ayarlayın. Örneğin, 12 partition’lı bir topic için **3 Logstash node** (her biri 4 partition tüketir) ideal konfigürasyondur.

4.3. Elasticsearch Cluster Optimizasyonları

Elasticsearch kümesinde performans sorunlarını çözmek için:

  1. Shard Boyutu ve Sayısı: Her index için 1 shard/10GB veri kuralını uygulayın. Örneğin, günlük 100GB log üreten bir sistemde, 10 shard kullanın.
  2. Index Rollover: ILM ile index’leri otomatik olarak rollover edin:
    PUT _ilm/policy/microservice-logs-policy
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "50GB",
                "max_age": "1d"
              }
            }
          }
        }
      }
    }
    
  3. Node Rol Ayrımı: Kümede dedicated master, data, ve coordinating node’lar kullanın.
🚨 Kritik Uyarı **Master node’ları asla veri tutmayacak şekilde konfigüre edin**. Aksi halde, `cluster state` güncellemeleri sırasında **split-brain** riski artar.

5. Performans İzleme ve Metrikler

5.1. Kritik Metrikler ve Eşik Değerleri

Metrik Adı İzleme Aracı Eşik Değeri Aksiyon Planı
Logstash EPS Logstash Monitoring > 20K EPS Pipeline worker sayısını artırın.
Kafka Consumer Lag Kafka Manager > 100K mesaj Logstash node sayısını artırın.
Elasticsearch Query Time Kibana Dev Tools > 500ms Index pattern’i optimize edin.
Elasticsearch CPU Usage Elasticsearch API > %80 (5 dakika boyunca) Shard sayısını azaltın veya node ekleyin.
Kibana Dashboard Load Chrome DevTools > 5 saniye Dashboard’ı parçalayın.

5.2. Elasticsearch Query Optimizasyonu

Elasticsearch query’lerini optimize etmek için:

  1. Index Alias Kullanımı: Zaman bazlı index’ler için alias kullanın:
    POST _aliases
    {
      "actions": [
        {
          "add": {
            "index": "microservice-logs-2023.10.*",
            "alias": "microservice-logs"
          }
        }
      ]
    }
    
  2. Query Caching: Sık kullanılan query’ler için caching etkinleştirin:
    GET microservice-logs/_search?request_cache=true
    {
      "query": {
        "match": {
          "level": "ERROR"
        }
      }
    }
    
  3. Pagination Optimizasyonu: search_after yerine scroll kullanmaktan kaçının:
    GET microservice-logs/_search
    {
      "size": 1000,
      "query": { ... },
      "sort": [
        { "@timestamp": "asc" }
      ]
    }
    

6. Sonuç: ELK Stack’te Performans Mühendisliği

ELK Stack’in mikroservis loglarını merkezi olarak yönetirken karşılaşılan performans sorunları, doğru mimari kararlar ve optimizasyon teknikleri ile çözülebilir. Bu makalede ele aldığımız:

  • Logstash pipeline optimizasyonları (grok → dissect geçişi, bulk API ayarları),
  • Elasticsearch shard ve index stratejileri (ILM, rollover, node rol ayrımı),
  • Kafka backpressure yönetimi (throttle filtresi, DLQ),
  • Kibana dashboard optimizasyonları (query caching, index pattern),

yöntemler, gerçek prodüksiyon senaryolarında %70’e varan performans artışları sağlamıştır.

💡 Mimari Karar ELK Stack’i **ölçeklenebilir** ve **dayanıklı** hale getirmek için: 1. **Her katmanda monitoring** (Logstash, Kafka, Elasticsearch, Kibana) kurun. 2. **Otomatik scaling** (Kubernetes, AWS ECS) ile dinamik kaynak yönetimi sağlayın. 3. **Chaos Engineering** testleri yaparak, sistemin **prodüksiyon koşullarına dayanıklılığını** test edin.

Bu rehber, ELK Stack’in en zorlu prodüksiyon ortamlarında bile sorunsuz çalışmasını sağlayacak ileri düzey teknikler sunmaktadır. Performans mühendisliği, sadece doğru araçları kullanmakla değil, aynı zamanda sistematik optimizasyonlarla mümkündür.

Etiketler

Bu yazı nasıldı? Bir emoji bırak!

Yorumlar

0 Yorum

Bir Yorum Bırakın

💬

Henüz yorum yapılmamış. İlk yorumu siz yapın!