Elasticsearch kullanırken indeksleme sırasında şu hatayla karşılaşabilirsiniz:
Invalid NEST response built from a unsuccessful low level call on POST: /posts/postem
# Audit trail of this API call:
- [1] BadResponse: Node: recepserit.com:9200/ Took: 00:00:03.6455357
# OriginalException: Elasticsearch.Net.ElasticsearchClientException:
The remote server returned an error: (403) Forbidden..
Call: Status code 403 from: POST /posts/postem.
ServerError: Type: cluster_block_exception
Reason: "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]";
Elasticsearch’ün tasarımında önleyici bir mekanizma vardır. Diskte boş alan kritik seviyenin altına düştüğünde sistem otomatik olarak indeksleri salt okunur moda geçirir. Bunun sebebi, diskin tamamen dolmasıyla veri kaybı veya indekslerin bozulmasının önüne geçmektir. Yani bu beklenmedik bir hata değil, bilinçli bir güvenlik önlemidir.
Yani hatanın genel sebebi, disk alanından kaynaklıdır. Sunucunuzda daha fazla disk alanı yer açtığınızda sorun çözülecektir.
Neden böyle bir önlem var?
Elasticsearch sürekli yazma yapan bir sistemdir. Disk tamamen dolarsa, yarım kalan yazma işlemleri indeks tutarlılığını bozabilir. Bu tür durumlarda sistemin en güvenli davranışı, yazmayı durdurup yalnızca silmeye izin vermektir. Böylece kullanıcı gereksiz dosyaları silerek alan açabilir veya node üzerinde bakım yapabilir.
“disk doldu, sistem çöktü” gibi bir felaketi önlemek için düşünülmüş otomatik bir emniyettir.
Varsayılan değerleri nasıl belirleniyor?
Elasticsearch, disk threshold decider adında bir mekanizma kullanır. Varsayılan olarak disk kullanımına göre şu eşikler vardır:
- %85 kullanıma ulaştığında uyarı verir.
- %90 kullanıma ulaştığında yeni shard tahsisi engellenir.
- %95 kullanıma ulaştığında indeksler salt okunur moda geçer.
Bu değerler yüzdeye göre hesaplanır, fakat büyük disklerde (örneğin 1 TB) “en az 50 GB boş alan bırak” gibi sabit bir kural da geçerlidir. Yani diskiniz büyük olsa da Elasticsearch yine de boş alanı garanti altına almak ister.
Elasticsearch 5.x ve 6.x sürümlerinde bu davranış neredeyse aynı şekilde uygulanır. 7.x ve sonrası sürümlerde eşik değerleri daha esnek hale gelmiştir, ayrıca disk.watermark.low, disk.watermark.high, disk.watermark.flood_stage ayarlarıyla özelleştirilebilir.
Yani çözüm mantığı hep aynı olsa da, kullanılan ayar parametreleri sürüme göre küçük değişiklikler gösterebilir.
Diskte yer açtıktan sonra indekslerin kilidini açmanız gerekir. Elasticsearch bu kilidi otomatik kaldırmaz, sizin manuel olarak ayar yapmanız gerekir. Bunun için:
curl -XPUT -H "Content-Type: application/json" \
https://[ENDPOINT_ADRESINIZ]:9200/_all/_settings \
-d '{"index.blocks.read_only_allow_delete": null}'
Bu komut tüm indekslerdeki salt okunur kilidini kaldırır ve tekrar yazma işlemlerine izin verir. Eğer tek bir indeks için açmak istiyorsanız _all yerine indeks adını yazabilirsiniz.
Bunun hakkında bilgi için: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html
Umarım sorununuz çözülmüştür.
Yorum bırakın