Problem

Elasticsearch sunucularındaki disk doluluğu nedeniyle Elasticsearch'ün log yazımını durdurması

Sebep/NedenElasticsearch 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 bildirilmelidir.

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

Ek Öneri

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


Disk boyutu sayısal limitle 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"
}}'


Disk boyutunu yüzdesel limitle 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"
}}'


#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.


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


Problem

Kibana'da log aramalarında alınabilen "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" hatası

Sebep/Neden

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 gelmektedir. 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 ayarlamanız tavsiye edilir.

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

  "index" : {

    "highlight.max_analyzed_offset" : 2000000

  }

}'


Problem

Api Trafik ekranlarında "Request cannot be executed; I/O reactor status: STOPPED" uyarısı ile logların görünmemesi

Sebep/Neden

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

Çözüm

Bu ayar jvm.options dosyasından yükseltilebilinir. Toplam ram miktarının yarısını aşmaması tavsiye edilir.

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

-Xms8g
-Xmx8g

systemctl restart elasticsearch


Problem

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/Neden

 You are reaching the limit cluster.max_shards_per_node. Add more data node, reduce the number of shards in cluster or increase the shard limit on the system.

Çözüm

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

Alternatif Çözüm

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. Bunun için aşağıdaki komutlar kullanılabilir.


curl 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
  }
}'

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

Alternatif Çözüm

Önceki çözümlerin ikisi de kullanılabilir değilse, en son çare eski dizinleri temizlemek/silmektir. Bu yöntem eski loglarda kayba neden olacağından ÖNERİLMEMEKTEDİR.

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


Problem

Unassigned Shards - CLUSTER-RECOVERED

Sebep/Neden

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

Çözüm

Bu sorunun birden fazla çözümü olabilir. Tüm elasticsearch node'larının çalıştığından ve dosya kaybı olmadığından emin olunması gerekmektedir.

Alternatif Çözüm

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 olunulmalıdır. Bağlı node'lar kapalıyken "GET /_nodes" isteği ile de bu node'ları göremezsiniz.


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


curl "<ELASTICSEARCH_IP>:9200/_nodes"


curl "<ELASTICSEARCH_IP>:9200/_cluster/allocation/explain"


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



#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 } }'


#Ü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"