Kesalahan Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / index read-only / allow delete (api)], watermark disk tahap banjir terlampaui

107

Saat mencoba memposting dokumen ke Elasticsearch seperti biasa, saya mendapatkan kesalahan ini:

cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];

Saya juga melihat pesan ini di log Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Sean Hammond
sumber
Saya baru saja mengalami masalah ini saat Anda mengajukan pertanyaan ini. ES membahas mengatakan membebaskan memori
Abhijith S

Jawaban:

215

Ini terjadi saat Elasticsearch menganggap disk kehabisan ruang sehingga menempatkan dirinya dalam mode hanya-baca.

Secara default, keputusan Elasticsearch didasarkan pada persentase ruang disk yang kosong, jadi pada disk besar hal ini dapat terjadi meskipun Anda memiliki banyak gigabyte ruang kosong.

Watermark tahap banjir adalah 95% secara default, jadi pada drive 1TB Anda memerlukan setidaknya 50GB ruang kosong atau Elasticsearch akan menempatkan dirinya dalam mode hanya-baca.

Untuk dokumen tentang tanda air tahap banjir, lihat https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .

Solusi yang tepat bergantung pada konteksnya - misalnya lingkungan produksi vs lingkungan pengembangan.

Solusi 1: Kosongkan ruang disk

Mengosongkan ruang disk yang cukup sehingga lebih dari 5% disk kosong akan menyelesaikan masalah ini. Elasticsearch tidak akan secara otomatis keluar dari mode hanya-baca setelah cukup disk kosong, Anda harus melakukan sesuatu seperti ini untuk membuka kunci indeks:

$ curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Solusi 2: Ubah pengaturan watermark tahap banjir

Ubah "cluster.routing.allocation.disk.watermark.flood_stage"pengaturan ke yang lain. Ini dapat diatur ke persentase yang lebih rendah atau ke nilai absolut. Berikut adalah contoh cara mengubah pengaturan dari dokumen :

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

Sekali lagi, setelah melakukan ini Anda harus menggunakan perintah curl di atas untuk membuka kunci indeks, tetapi setelah itu mereka tidak boleh masuk ke mode hanya-baca lagi.

Sean Hammond
sumber
8
Hai. Tetapi saya mendapatkan kesalahan ini, meskipun ada cukup ruang kosong di sistem saya. Apakah ada alasan lain yang mungkin dapat melaporkan masalah ini?
Sankalpa Timilsina
Saya memiliki masalah yang sama, meskipun saya memiliki 82,43% disk yang tersedia. Saya memperbaikinya dengan perintah curl tetapi setelah beberapa hari saya mendapatkan yang sama.
manu
@SankalpaTimilsina apakah Anda mendapatkan jawabannya, saya menghadapi masalah yang sama.
Malik Faiq
53

Secara default, Elasticsearch yang diinstal masuk ke mode hanya-baca jika Anda memiliki kurang dari 5% ruang disk kosong. Jika Anda melihat kesalahan seperti ini:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "reason": "diblokir oleh: [FORBIDDEN / 12 / index read-only / allow delete (api)]; "}]," type ":" cluster_block_exception "," reason ":" diblokir oleh: [FORBIDDEN / 12 / index read-only / allow delete (api)]; " }, "status": 403}

Atau di /usr/local/var/log/elasticsearch.log Anda dapat melihat log yang mirip dengan:

watermark disk tahap banjir [95%] melebihi [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / node / 0] gratis: 15.3gb [4.1%], semua indeks pada node ini akan ditandai telah dibaca -hanya

Kemudian Anda dapat memperbaikinya dengan menjalankan perintah berikut:

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster.routing.allocation.disk.threshold_enabled": false } }'
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
Payam Khaninejad
sumber
23
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

DARI

https://techoverflow.net/2019/04/17/how-to-fix-elasticsearch-forbidden-12-index-read-only-allow-delete-api/

zaibatsu
sumber
Saya mendapatkan {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"dengan perintah Anda, ada ide?
Cyril Duchon-Doris
1
Terima kasih! Disk saya kehabisan ruang. Bahkan setelah saya mengosongkan sebagian ruang, masalahnya masih ada. Perintah ini memecahkan masalah saya!
Fred
Ini adalah solusi yang tepat untuk versi Elasticsearch modern. Namun, itu tidak berhasil _all. Saya harus menerapkannya ke setiap indeks secara manual.
rubik
@rubik dapatkah Anda menyebutkan bagaimana Anda "menerapkannya ke setiap indeks secara manual"? Saya baru di Elasticsearch dan menghadapi masalah yang sama di mana _all tidak berfungsi.
rom
@ dari Tentu. Cukup ganti _alldengan nama indeks, dan ulangi permintaan untuk setiap indeks.
rubik