Elasticsearch Olası Sorunları ve Çözümleri
Disk Doluluğu Nedeniyle Log Yazımının Durdurulması
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"
}
}'
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
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
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)
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.