ข้อผิดพลาดของ Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / index read-only / allow delete (api)], ลายน้ำดิสก์ท่วมเกิน


136

เมื่อพยายามโพสต์เอกสารไปยัง Elasticsearch ตามปกติฉันได้รับข้อผิดพลาดนี้:

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

ฉันยังเห็นข้อความนี้ในบันทึกของ Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only

ฉันเพิ่งพบปัญหานี้เมื่อคุณใส่คำถามนี้ ES พูดถึงการเพิ่มหน่วยความจำ
Abhijith S

คำตอบ:


249

สิ่งนี้เกิดขึ้นเมื่อ Elasticsearch คิดว่าดิสก์มีพื้นที่เหลือน้อยดังนั้นจึงทำให้ตัวเองอยู่ในโหมดอ่านอย่างเดียว

โดยค่าเริ่มต้นการตัดสินใจของ Elasticsearch จะขึ้นอยู่กับเปอร์เซ็นต์ของเนื้อที่ดิสก์ที่ว่างดังนั้นบนดิสก์ขนาดใหญ่สิ่งนี้อาจเกิดขึ้นได้แม้ว่าคุณจะมีพื้นที่ว่างหลายกิกะไบต์ก็ตาม

โดยค่าเริ่มต้นลายน้ำจะอยู่ที่ 95% ดังนั้นในไดรฟ์ 1TB คุณต้องมีพื้นที่ว่างอย่างน้อย 50GB มิฉะนั้น Elasticsearch จะทำให้ตัวเองอยู่ในโหมดอ่านอย่างเดียว

สำหรับเอกสารเกี่ยวกับขั้นตอนน้ำท่วมลายน้ำดูhttps://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html

โซลูชันที่เหมาะสมขึ้นอยู่กับบริบทตัวอย่างเช่นสภาพแวดล้อมการผลิตเทียบกับสภาพแวดล้อมการพัฒนา

โซลูชันที่ 1: เพิ่มเนื้อที่ว่างบนดิสก์

การเพิ่มเนื้อที่ว่างบนดิสก์ให้เพียงพอเพื่อให้มีพื้นที่ว่างมากกว่า 5% ของดิสก์จะช่วยแก้ปัญหานี้ได้ Elasticsearch จะไม่นำตัวเองออกจากโหมดอ่านอย่างเดียวโดยอัตโนมัติเมื่อดิสก์ว่างเพียงพอคุณจะต้องทำสิ่งนี้เพื่อปลดล็อกดัชนี:

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

โซลูชันที่ 2: เปลี่ยนการตั้งค่าลายน้ำขั้นตอนน้ำท่วม

เปลี่ยนการ"cluster.routing.allocation.disk.watermark.flood_stage"ตั้งค่าเป็นอย่างอื่น สามารถกำหนดเป็นเปอร์เซ็นต์ที่ต่ำกว่าหรือเป็นค่าสัมบูรณ์ก็ได้ นี่คือตัวอย่างวิธีเปลี่ยนการตั้งค่าจากเอกสาร :

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"
  }
}

อีกครั้งหลังจากทำสิ่งนี้คุณจะต้องใช้คำสั่ง curl ด้านบนเพื่อปลดล็อกดัชนี แต่หลังจากนั้นไม่ควรเข้าสู่โหมดอ่านอย่างเดียวอีก


9
สวัสดี. แต่ฉันได้รับข้อผิดพลาดนี้แม้ว่าจะมีพื้นที่ว่างเพียงพอในระบบของฉันก็ตาม มีสาเหตุอื่น ๆ ที่อาจรายงานปัญหานี้หรือไม่
Sankalpa Timilsina

ฉันมีปัญหาเดียวกันแม้ว่าฉันจะมีดิสก์ 82.43% ฉันแก้ไขด้วยคำสั่ง curl แต่หลังจากนั้นไม่กี่วันฉันก็เป็นเหมือนเดิม
manu

@SankalpaTimilsina คุณได้รับคำตอบฉันกำลังเผชิญกับปัญหาเดียวกัน
Malik Faiq

72

ตามค่าเริ่มต้น Elasticsearch ที่ติดตั้งจะเข้าสู่โหมดอ่านอย่างเดียวเมื่อคุณมีเนื้อที่ว่างในดิสก์น้อยกว่า 5% หากคุณพบข้อผิดพลาดในลักษณะนี้:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "reason": "ถูกบล็อกโดย: [FORBIDDEN / 12 / ดัชนีอ่านอย่างเดียว / อนุญาตให้ลบ (api)]; "}]," type ":" cluster_block_exception "," reason ":" ถูกบล็อกโดย: [FORBIDDEN / 12 / index read-only / allow delete (api)]; " }, "สถานะ": 403}

หรือใน/usr/local/var/log/elasticsearch.logคุณจะเห็นบันทึกที่คล้ายกับ:

ลายน้ำของดิสก์น้ำท่วม [95%] เกินบน [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0] ฟรี: 15.3gb [4.1%] ดัชนีทั้งหมดในโหนดนี้จะถูกทำเครื่องหมายว่าอ่านแล้ว - เท่านั้น

จากนั้นคุณสามารถแก้ไขได้โดยเรียกใช้คำสั่งต่อไปนี้:

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

31
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

จาก

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


ฉันได้{"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"รับคำสั่งจากคุณมีความคิดอย่างไร
Cyril Duchon-Doris

1
ขอบคุณ! ดิสก์ของฉันมีพื้นที่เหลือน้อย แม้ว่าฉันจะได้เพิ่มพื้นที่ว่างแล้ว แต่ปัญหาก็ยังคงอยู่ คำสั่งนี้ช่วยแก้ปัญหาของฉันได้!
Fred

นี่เป็นวิธีแก้ปัญหาที่ถูกต้องสำหรับ Elasticsearch เวอร์ชันทันสมัย _allแต่มันก็ไม่ได้ทำงานร่วมกับ ฉันต้องใช้มันกับแต่ละดัชนีด้วยตนเอง
rubik

@rubik ช่วยพูดถึงวิธี "นำไปใช้กับแต่ละดัชนีด้วยตนเอง" ได้ไหม ฉันเป็นคนใหม่ใน Elasticsearch และประสบปัญหาเดียวกันกับที่ _all ใช้งานไม่ได้
รอม

@ จากชัวร์. เพียงแค่แทนที่_allด้วยชื่อดัชนีและทำซ้ำคำขอสำหรับแต่ละดัชนี
rubik

6

ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อเครื่องของคุณมีพื้นที่ดิสก์เหลือน้อย ขั้นตอนที่ต้องปฏิบัติตามเพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดนี้

  1. การรีเซ็ตบล็อกดัชนีแบบอ่านอย่างเดียวบนดัชนี:

    $ curl -X PUT -H "Content-Type: application/json" http://127.0.0.1:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
    
    Response
    ${"acknowledged":true}
    
  2. การอัปเดตลายน้ำต่ำเป็นอย่างน้อย 50 กิกะไบต์ฟรีลายน้ำสูงอย่างน้อย 20 กิกะไบต์ฟรีและลายน้ำขั้นสูง 10 กิกะไบต์ฟรีและอัปเดตข้อมูลเกี่ยวกับคลัสเตอร์ทุกนาที

     Request
     $curl -X PUT "http://127.0.0.1:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d' { "transient": { "cluster.routing.allocation.disk.watermark.low": "50gb", "cluster.routing.allocation.disk.watermark.high": "20gb", "cluster.routing.allocation.disk.watermark.flood_stage": "10gb", "cluster.info.update.interval": "1m"}}'
    
      Response
      ${
       "acknowledged" : true,
       "persistent" : { },
       "transient" : {
       "cluster" : {
       "routing" : {
       "allocation" : {
       "disk" : {
         "watermark" : {
           "low" : "50gb",
           "flood_stage" : "10gb",
           "high" : "20gb"
         }
       }
     }
    }, 
    "info" : {"update" : {"interval" : "1m"}}}}}
    

หลังจากรันคำสั่งสองคำสั่งนี้คุณต้องรันคำสั่งแรกอีกครั้งเพื่อไม่ให้ดัชนีกลับเข้าสู่โหมดอ่านอย่างเดียวอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.