Ana içeriğe geç

Elasticsearch Olası Sorunları ve Çözümleri

Disk Doluluğu Nedeniyle Log Yazımının Durdurulması

uyarı

Elasticsearch varsayılan ayarlarıyla kurulduğunda, bulunduğu disk %85 doluluk oranına ulaştığında uyarı verir ve %90'a geldiğinde log yazımını durdurur.

Çözüm

Diskte yer açılması ya da diskin büyütülmesi gerekmektedir. Bu işlem sonrasında aşağıdaki komut ile diskin tekrar yazıma hazır olduğu bildirilir:

curl -X PUT "<ELASTIC_IP>:9200/_all/_settings?pretty" \
-H 'Content-Type: application/json' \
-d '{
"index.blocks.read_only_allow_delete": null
}'

Disk Watermark Ayarları

Bu durum büyük disklerde miktar olarak yüksek alanların kullanılamamasına yol açabildiğinden sunucularına özel ayarlanması tavsiye edilir. Bu limitler yüzdesel ya da sayısal olarak disk boyutu verilerek güncellenebilir.

Sayısal Limit ile Ayarlama

curl -X PUT "<ELASTIC_IP>:9200/_cluster/settings" \
-H 'Content-Type: application/json' \
-d '{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "80gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "50gb",
"cluster.info.update.interval": "1m"
}
}'

Yüzdesel Limit ile Ayarlama

curl -X PUT "<ELASTIC_IP>:9200/_cluster/settings" \
-H 'Content-Type: application/json' \
-d '{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "93%",
"cluster.routing.allocation.disk.watermark.flood_stage": "95%",
"cluster.info.update.interval": "1m"
}
}'
not

Sonrasında anlık çalışmaya devam ettirdiğiniz Elasticsearch'ün konfigürasyon dosyasına da aynı değerleri girmelisiniz. Bu uygulamanın olası bir restart durumunda ayarlarınızın kaybolmaması için gereklidir.

elasticsearch.yml dosyasına eklenecek ayarlar:

cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.low: 93%
cluster.routing.allocation.disk.watermark.high: 95%

Kibana'da Highlight Hatası

Hata Mesajı

x of y shards failed: The data you are seeing might be incomplete or wrong.
The length of [X] field of [Y] doc of [<INDEX_NAME>] index has exceeded [1000000]
- maximum allowed to be analyzed for highlighting

Sebep

Elasticsearch'ün her bir kayıt için highlight işlemini yapabileceği veri büyüklüğü limiti varsayılan olarak 1.000.000 karakter olarak gelir. Elasticsearch'ün JVM RAM kullanımı ve arama hızı için belirlediği optimal değer bu şekildedir.

Çözüm

Bu ayar aşağıdaki komut yardımıyla yükseltilebilir. Bu değeri, eğer veri boyutunuzu bilmiyorsanız, azar miktarda arttırarak verilerinize uygun limite ayarlayabilirsiniz.

curl -XPUT "<ELASTIC_IP>:9200/.ds-apinizer-log-apiproxy-AAAA-000*/_settings" \
-H "Content-Type: application/json" \
-d '{
"index": {
"highlight.max_analyzed_offset": 2000000
}
}'

API Trafik Ekranlarında "I/O Reactor Status: STOPPED" Hatası

Hata Mesajı

Request cannot be executed; I/O reactor status: STOPPED

Sebep

Elasticsearch'ün kullandığı RAM limitlerinin yükseltilmesi gereklidir.

Çözüm

Bu ayar jvm.options dosyasından yükseltilebilir. Toplam RAM miktarının yarısını aşmaması önerilir.

sudo vi /opt/elasticsearch/elasticsearch-7.9.2/config/jvm.options

Dosyaya aşağıdaki satırları ekleyin:

-Xms8g
-Xmx8g

Değişikliklerin uygulanması için Elasticsearch'i yeniden başlatın:

systemctl restart elasticsearch

Trafik Logları Elasticsearch'e Yazılamıyor

Belirti

API trafik ekranlarında son isteklere ait kayıtlar görünmez ve gateway (worker) uygulama logunda şu satırlar tekrarlanır:

ERROR ConnectorElasticSearchIndex - Elasticsearch traffic log could not be indexed for connection [<BAGLANTI_ID>]: ...
WARN ConnectorElasticSearchIndex - Elasticsearch I/O reactor stopped (...) for connection [<BAGLANTI_ID>]. Client evicted ...

Sebep

Elasticsearch bağlantısı geçici olarak yanıt veremez duruma geldiğinde (yukarıdaki "I/O Reactor Status: STOPPED" durumu, cluster'ın yeniden başlatılması, ağ kesintisi) Apinizer bağlantıyı kapatıp yeniden kurar. Yeniden kurulum sürerken gelen istekler bağlantıyı hazır bulamaz.

Davranış

  • API çağrıları etkilenmez. Trafik logunun yazılması istemciye dönen yanıtı geciktirmez veya engellemez.
  • Kayıt kaybolmaz. İlgili bağlantı için bir Failover Connector tanımlıysa yazılamayan trafik kaydı oraya yazılır. Failover Connector tanımlı değilse kayıt düşer ve log'a bu konuda ayrı bir uyarı satırı basılır.
  • Yeniden kurulum bir soğuma süresine bağlıdır. Hatadan sonra bağlantı en fazla 10 saniyede bir yeniden kurulur. Bu sayede yoğun trafikte her istek için ayrı bir yeniden kurulum denenmesinden kaynaklanan hata fırtınası oluşmaz; soğuma süresi içindeki denemeler sessizce atlanır ve yalnız DEBUG seviyesinde görünür. Bu nedenle yukarıdaki uyarı satırının 10 saniyede birden sık tekrarlanmaması normaldir.

Kontrol Adımları

  1. Elasticsearch cluster'ının durumunu doğrulayın; bu sayfadaki "I/O Reactor Status: STOPPED" ve "Disk Doluluğu Nedeniyle Log Yazımının Durdurulması" bölümlerini uygulayın.
  2. İlgili Elasticsearch bağlantı tanımı için bir Failover Connector seçili olduğundan emin olun; seçili değilse kesinti süresindeki trafik kayıtları saklanmaz.
  3. Uyarı satırları Elasticsearch düzeldikten sonra da sürüyorsa bağlantı tanımındaki adres, kimlik bilgileri ve index adını kontrol edin.

Log Satırında Yığın İzi (Stack Trace) Görünmüyorsa

Java sanal makinesi aynı hatayı çok kez ürettiğinde bir süre sonra yığın izini kısaltır ve log satırında yalnızca hatanın kendisi kalır. Ayrıntılı yığın izine ihtiyaç duyulan teşhis çalışmalarında gateway (worker) uygulaması -XX:-OmitStackTraceInFastThrow seçeneği ile başlatılabilir. Bu seçenek yalnızca teşhis amaçlıdır; sorun çözüldükten sonra kaldırılması önerilir.


Maximum Shards Limit Hatası

Hata Mesajı

Elasticsearch exception [type=validation_exception, reason=Validation Failed:
1: this action would add [2] total shards, but this cluster currently has [1000]/[1000] maximum shards open;]

Sebep

_cluster.max_shards_per_node limitine ulaşılmıştır. Veri tutan node sayısını arttırmak, cluster'daki shard sayısını azaltmak veya sistem üzerindeki shard limitini yükseltmek gerekmektedir.

Çözüm 1: Data Node Sayısını Arttırma

not

Bu sorunun önerilen çözümü veri tutan node sayısını arttırmaktır.

Çözüm 2: Shard Limitini Yükseltme

Data node'ları artırmak her zaman mümkün olmayabileceğinden, shard'ların manuel olarak yönetilmesi de kullanılabilir bir çözümdür:

curl -XPUT http://<ELASTICSEARCH_IP>:9200/_cluster/settings \
--header "Content-Type:application/json" \
-d '{
"persistent": {
"cluster.routing.allocation.total_shards_per_node": 2000,
"cluster.max_shards_per_node": 2000
}
}'

Rollover işlemini tetikleyin:

curl http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-<INDEX_KEY>/_rollover

Çözüm 3: Eski Index'leri Silme (Önerilmez)

uyarı

Bu yöntem eski loglarda kayba neden olacağından ÖNERİLMEMEKTEDİR. Sadece son çare olarak kullanılmalıdır.

curl -XDELETE http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-<INDEX_KEY>-<INDEX_NUMBER>

Unassigned Shards - CLUSTER-RECOVERED

Sebep

Shard dağıtımını olası bir sunucu restart'ı ya da dosya kaybı sonrasında yapamıyor olabilir.

Çözüm Adımları

1. Node Durumunu Kontrol Etme

Tüm Elasticsearch node'larının çalıştığından ve dosya kaybı olmadığından emin olunması gerekir.

Elasticsearch master node'unda config/elasticsearch.yml dosyası kontrol edilir. Burada diğer node'ların IP'leri bulunabilir ve onların da çalıştığından emin olunmalıdır. Bağlı node'lar kapalıyken GET /_nodes isteği ile de bu node'ları göremezsiniz.

2. Cluster Durumunu Kontrol Etme

Aşağıdaki komutlar ile node'ların, cluster'ın ve shard'ların durumu kontrol edilir:

# Node'ları listele
curl "<ELASTICSEARCH_IP>:9200/_nodes"

# Shard allocation açıklamasını al
curl "<ELASTICSEARCH_IP>:9200/_cluster/allocation/explain"

# Shard durumunu kontrol et
curl "<ELASTICSEARCH_IP>:9200/_cat/shards?v=true&h=index,shard,prirep,state,node,unassigned.reason&s=state"

3. Allocation'ı Tekrar Aktif Etme

Aşağıdaki komut ile node'lar üzerindeki paylaştırma tekrar aktif edilir:

curl -XPUT "<ELASTICSEARCH_IP>:9200/_cluster/settings?pretty" \
-H 'Content-Type: application/json' \
-d '{
"transient": {
"cluster.routing.allocation.enable": true
}
}'

4. Reroute İşlemi

Üstteki komut yeterli olmadığında aşağıdaki komut ile bu işlem zorlanır:

curl -XPOST "<ELASTICSEARCH_IP>:9200/_cluster/reroute?retry_failed=true&pretty"

NAS Disk Mount Erişim Hatası

Sebep

NAS diskine bağlanmaya çalışırken, dosya sistemi erişim izinlerinin ayarlanması gerekmektedir.

Çözüm

1. Elasticsearch Kullanıcı ID Bilgilerini Alma

id elasticsearch

Örnek çıktı:

uid=1000(elasticsearch) gid=1000(elasticsearch) groups=1000(elasticsearch),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),101(lxd)

2. NAS Diskini Mount Etme

NAS diskini mount etmek için uygun yetkiler verilerek aşağıdaki komutla mount işlemi gerçekleştirilir:

sudo mount -t cifs \
-o rw,uid=1000,gid=1000,file_mode=0755,dir_mode=0755,username=elasticsearch,password=1234 \
//192.168.111.248/LogApinizer \
/home/data/

3. Kalıcı Mount Ayarları

Mount işleminin kalıcı olması için fstab dosyasına aşağıdaki satırları ekleyin:

sudo vi /etc/fstab

Ekleyeceğiniz satır:

//192.168.111.248/LogApinizer /home/data cifs rw,uid=1000,gid=1000,file_mode=0755,dir_mode=0755,username=elasticsearch,password=1234 0 0