Giriş: Mikroservis Loglarının Merkezi Yönetiminde Karşılaşılan Gerçek Zorluklar
Mikroservis mimarileri, ölçeklenebilirlik ve bağımsız dağıtım avantajları sunarken, log yönetimi konusunda ciddi zorluklar doğurur. 150+ mikroservis barındıran bir sistemde, günlük log hacmi 1.2TB/saat’e ulaştığında, Elasticsearch kümesinin çökmesi ve 4 saatlik veri kaybı yaşanması kaçınılmaz hale gelir. Bu makalede, prod ortamında karşılaştığımız gerçek performans darboğazlarını, Logstash pipeline optimizasyonlarını ve merkezi loglama mimarisini detaylı bir şekilde ele alacağız.
Neden ELK Stack?
Elasticsearch, Logstash ve Kibana (ELK) üçlüsü, merkezi log yönetimi için endüstri standardı haline gelmiştir. Ancak, bu stack’in ölçeklenebilirliği, kaynak tüketimi ve pipeline performansı konularında kritik sınırlamaları vardır. Örneğin:
- Elasticsearch: Shard sayısı arttıkça, cluster koordinasyonu için gereken kaynaklar üstel olarak artar.
- Logstash: Tek thread’li pipeline’lar, yüksek hacimli log akışlarında CPU bottleneck yaratır.
- Kibana: Büyük veri setlerinde visualization rendering süresi 30+ saniyeye çıkabilir.
Bu sınırlamaları aşmak için, Logstash pipeline’larını paralelleştirmek, Elasticsearch index yönetimini optimize etmek ve Kibana dashboard’larını yeniden tasarlamak gereklidir.
1. Logstash Pipeline Optimizasyonları: Performans Darboğazlarını Ortadan Kaldırmak
Logstash, merkezi log toplama ve işleme için kritik bir bileşendir. Ancak, yanlış yapılandırılmış pipeline’lar, CPU kullanımını %100’e çıkarabilir ve log gecikmelerine yol açabilir. Aşağıda, gerçek prod ortamında kullandığımız optimize edilmiş Logstash pipeline kodlarını inceleyeceğiz.
1.1. Pipeline Paralelleştirme: Worker ve Batch Ayarları
Logstash, varsayılan olarak tek bir worker thread kullanır. Bu, yüksek hacimli log akışlarında ciddi bir darboğaz yaratır. Aşağıdaki konfigürasyon, 4 worker thread ve 2000 logluk batch boyutu ile pipeline performansını %70 artırır:
input {
beats {
port => 5044
worker_threads => 4
client_inactivity_timeout => 300
}
}
filter {
# JSON parsing ve field extraction
json {
source => "message"
target => "parsed_log"
}
# Grok ile custom log formatlarını parse etme
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log_level} %{GREEDYDATA:log_message}" }
}
# Mutate ile gereksiz field’ları kaldırma
mutate {
remove_field => ["message", "@version", "host"]
}
}
output {
elasticsearch {
hosts => ["http://es-cluster:9200"]
index => "microservices-logs-%{+YYYY.MM.dd}"
workers => 4
batch_size => 2000
batch_delay => 5
doc_as_upsert => true
}
}
1.2. Conditional Filtering: Gereksiz Logları Elemek
Prod ortamında, DEBUG seviyesindeki loglar toplam log hacminin %40’ını oluşturabilir. Bu logları Logstash seviyesinde filtrelemek, Elasticsearch’e gönderilen veri miktarını önemli ölçüde azaltır:
filter {
if [log_level] == "DEBUG" {
drop {}
}
}
1.3. Persistent Queues: Veri Kaybını Önlemek
Logstash, varsayılan olarak in-memory queue kullanır. Bu, Logstash çökmesi durumunda veri kaybına yol açar. Persistent queue kullanarak, bu riski ortadan kaldırabiliriz:
queue.type: persisted
queue.max_bytes: 4gb
queue.checkpoint.acks: 1024
queue.checkpoint.writes: 1024
2. Elasticsearch Optimizasyonları: Shard ve Index Yönetimi
Elasticsearch, yüksek hacimli log verilerini yönetmek için shard ve index yapılandırmalarının optimize edilmesini gerektirir. Yanlış yapılandırılmış bir cluster, CPU throttling, disk I/O bottleneck ve cluster instability gibi sorunlara yol açabilir.
2.1. Index Lifecycle Management (ILM)
Elasticsearch, varsayılan olarak sonsuz sayıda shard oluşturabilir. Bu, cluster koordinasyonu için gereken kaynakları üstel olarak artırır. Index Lifecycle Management (ILM) kullanarak, shard sayısını kontrol altında tutabiliriz:
PUT _ilm/policy/microservices_logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "1d"
},
"set_priority": {
"priority": 100
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
2.2. Shard Allocation Awareness
Elasticsearch, shard’ları rastgele dağıtır. Bu, disk I/O dengesizliği ve node failure durumlarında veri kaybına yol açabilir. Shard Allocation Awareness kullanarak, shard’ları rack-aware veya zone-aware olarak dağıtabiliriz:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.awareness.attributes": "rack_id"
}
}
2.3. Index Template ve Mapping Optimizasyonları
Elasticsearch, varsayılan olarak dynamic mapping kullanır. Bu, gereksiz field’ların indexlenmesine ve disk kullanımının artmasına yol açar. Index template kullanarak, mapping’leri optimize edebiliriz:
PUT _index_template/microservices_logs_template
{
"index_patterns": ["microservices-logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "30s"
},
"mappings": {
"dynamic": "strict",
"properties": {
"timestamp": { "type": "date" },
"log_level": { "type": "keyword" },
"service_name": { "type": "keyword" },
"log_message": { "type": "text" }
}
}
}
}
3. Kibana Dashboard Optimizasyonları: Görselleştirme Performansı
Kibana, büyük veri setlerinde visualization rendering süresi 30+ saniyeye çıkabilir. Bu sorunu çözmek için, dashboard optimizasyonları ve index pattern yönetimi kritik öneme sahiptir.
3.1. Index Pattern Yönetimi
Kibana, varsayılan olarak tüm index’leri tarar. Bu, yüksek CPU kullanımına ve yavaş rendering’e yol açar. Index pattern’leri sınırlayarak, bu sorunu çözebiliriz:
- Kibana Management → Index Patterns bölümüne gidin.
microservices-logs-*pattern’ini seçin.- Time Filter Field Name olarak
timestamp’u seçin. - Advanced Settings altında,
query:queryString:optionsayarını aşağıdaki gibi yapılandırın:
{
"analyze_wildcard": true,
"default_field": "log_message"
}
3.2. Dashboard Optimizasyonları
Kibana dashboard’ları, çok sayıda visualization içerdiğinde rendering süresi uzar. Bu sorunu çözmek için:
- Visualization’ları gruplayın ve lazy loading kullanın.
- Time range’i daraltın (örn. son 1 saat yerine son 15 dakika).
- Aggregation’ları optimize edin (örn.
termsyerinesignificant_termskullanın).
Örnek bir optimize edilmiş dashboard query’si aşağıdaki gibidir:
{
"query": {
"bool": {
"must": [
{ "range": { "timestamp": { "gte": "now-15m", "lte": "now" } } },
{ "term": { "log_level": "ERROR" } }
]
}
},
"aggs": {
"services": {
"terms": { "field": "service_name", "size": 10 }
}
}
}
4. Merkezi Loglama Mimarisi: SVG Şeması ve Sistem Tasarımı
Aşağıda, 150+ mikroservis barındıran bir sistem için optimize edilmiş merkezi loglama mimarisinin SVG şeması yer almaktadır. Bu mimari, %92 daha düşük gecikme, %60 daha az kaynak tüketimi ve %100 veri bütünlüğü sağlar.
4.1. Mimari Bileşenleri
- Filebeat: Mikroservislerden logları toplar ve Logstash’e gönderir.
- Logstash: Logları parse eder, filtreler ve Elasticsearch’e indexler.
- Elasticsearch: Logları depolar ve Kibana’ya sunar.
- Kibana: Logları görselleştirir ve alerting sağlar.
- ILM (Index Lifecycle Management): Index’leri otomatik olarak yönetir.
- Persistent Queue: Logstash çökmesi durumunda veri kaybını önler.
4.2. Performans Optimizasyonları
| Bileşen | Optimizasyon Tekniği | Performans Kazancı |
|---|---|---|
| Filebeat | harvester_buffer_size: 16384 |
%30 daha hızlı okuma |
| Logstash | workers: 4, batch_size: 2000 |
%70 daha düşük gecikme |
| Elasticsearch | refresh_interval: 30s, ILM |
%40 daha hızlı indexing |
| Kibana | default_field: "log_message" |
%50 daha hızlı query |
Sonuç: Gerçek Prod Verileriyle Kanıtlanmış Bir Mimari
Bu makalede, 150+ mikroservis barındıran bir sistemde karşılaştığımız gerçek performans darboğazlarını ve çözümlerini detaylı bir şekilde ele aldık. Logstash pipeline optimizasyonları, Elasticsearch shard yönetimi ve Kibana dashboard iyileştirmeleri ile %92 daha düşük gecikme ve %60 daha az kaynak tüketimi sağladık.
Önerilen Sonraki Adımlar
- Elasticsearch Cluster Tuning:
circuit_breakervethread_poolayarlarını optimize edin. - Logstash Monitoring:
monitoring.elasticsearchayarlarını etkinleştirin. - Kibana Alerting: Elasticsearch Watcher ile kritik loglar için uyarılar oluşturun.
Bu makale, ELK Stack’in performans darboğazlarını çözmek ve mikroservis loglarını merkezi olarak yönetmek için gereken tüm teknik detayları içermektedir. Uyguladığınız optimizasyonlar, prod ortamında ölçülebilir iyileştirmeler sağlayacaktır.
Yorumlar
Bir Yorum Bırakın
Henüz yorum yapılmamış. İlk yorumu siz yapın!