ElasticSearch: เศษที่ไม่ได้กำหนดวิธีการแก้ไข


166

ฉันมี ES คลัสเตอร์ที่มี 4 โหนด:

number_of_replicas: 1
search01 - master: false, data: false
search02 - master: true, data: true
search03 - master: false, data: true
search04 - master: false, data: true

ฉันต้องรีสตาร์ท search03 และเมื่อมันกลับมามันกลับมารวมกันอีกครั้งโดยไม่มีปัญหา แต่เหลือ 7 ชิ้นที่ไม่ได้ถูกมอบหมายวางลง

{
  "cluster_name" : "tweedle",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 15,
  "active_shards" : 23,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 7
}

ตอนนี้คลัสเตอร์ของฉันอยู่ในสถานะสีเหลือง วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คืออะไร

  • ลบ (ยกเลิก) เศษหรือไม่
  • ย้ายเศษไปยังโหนดอื่นหรือไม่
  • จัดสรรเศษให้กับโหนดหรือไม่
  • อัปเดต 'number_of_replicas' เป็น 2 หรือไม่
  • มีอะไรอีกบ้าง?

ที่น่าสนใจเมื่อมีการเพิ่มดัชนีใหม่โหนดนั้นเริ่มทำงานกับมันและเล่นได้ดีกับส่วนที่เหลือของคลัสเตอร์มันเพิ่งเหลือเศษที่ไม่ได้กำหนดไว้

ติดตามคำถาม: ฉันทำอะไรผิดหรือเปล่าที่ทำให้สิ่งนี้เกิดขึ้นตั้งแต่แรก? ฉันไม่มีความมั่นใจในคลัสเตอร์ที่ทำงานในลักษณะนี้เมื่อมีการรีสตาร์ทโหนด

หมายเหตุ:หากคุณใช้คลัสเตอร์โหนดเดียวด้วยเหตุผลบางประการคุณอาจต้องทำสิ่งต่อไปนี้:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'

คำตอบ:


118

โดยค่าเริ่มต้น Elasticsearch จะกำหนดเศษให้กับโหนดอีกครั้งแบบไดนามิก อย่างไรก็ตามหากคุณปิดการใช้งานการจัดสรรชิ้นส่วน (บางทีคุณอาจเริ่มต้นการเริ่มใช้งานใหม่และลืมเปิดใช้งานอีกครั้ง) คุณสามารถเปิดใช้งานการจัดสรรชิ้นส่วนได้อีกครั้ง

# v0.90.x and earlier
curl -XPUT 'localhost:9200/_settings' -d '{
    "index.routing.allocation.disable_allocation": false
}'

# v1.0+
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
    "transient" : {
        "cluster.routing.allocation.enable" : "all"
    }
}'

Elasticsearch จะมอบหมายเศษอีกครั้งตามปกติ สิ่งนี้อาจช้าพิจารณาเพิ่มindices.recovery.max_bytes_per_secและcluster.routing.allocation.node_concurrent_recoveriesเร่งความเร็ว

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

สุดท้ายคุณสามารถกำหนด shard ให้โหนดด้วยreroute APIอีกครั้ง

# Suppose shard 4 of index "my-index" is unassigned, so you want to
# assign it to node search03:
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands": [{
        "allocate": {
            "index": "my-index",
            "shard": 4,
            "node": "search03",
            "allow_primary": 1
        }
    }]
}'

3
เมื่อฉันทำอย่างที่ฉันได้รับ: { "error" : "ElasticsearchIllegalArgumentException[[allocate] failed to find [logstash-2015.01.05][1] on the list of unassigned shards]", "status" : 400 } แม้ว่าฉันจะเห็นว่าเศษเป็นหนึ่งในคนที่ไม่ได้ปันส่วนใน ES-Head
wjimenez5271

บังเอิญเศษอื่น ๆ ทำงานที่ถูกระบุว่าไม่ได้ถูกจัดสรรแล้วส่วนที่เหลือก็ทำการซ่อมแซมตัวเอง
wjimenez5271

นี่คือคำแนะนำที่ดี
Yehosef

1
ตั้งแต่รีลีส 5.0 คำสั่ง "จัดสรร" ได้เปลี่ยนไปเพื่อให้ตัวเลือกเพิ่มเติม - ตัวอย่างข้างต้นจะเป็น "allocate_empty_primary" โดยไม่ใช้พารามิเตอร์ "allow_primary"
jmb

4
คุณต้องเพิ่ม-H 'Content-Type: application/json'ถ้าคุณได้รับข้อผิดพลาดContent-Type header [application/x-www-form-urlencoded] is not supported
luckydonald

57

ตกลงฉันแก้ไขมันด้วยความช่วยเหลือจากฝ่ายสนับสนุนของ ES ใช้คำสั่งต่อไปนี้กับ API บนทุกโหนด (หรือโหนดที่คุณเชื่อว่าเป็นสาเหตุของปัญหา):

curl -XPUT 'localhost:9200/<index>/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

ซึ่ง<index>เป็นดัชนีที่คุณเชื่อว่าเป็นผู้กระทำผิด หากคุณไม่มีแนวคิดให้เปิดใช้งานบนโหนดทั้งหมด:

curl -XPUT 'localhost:9200/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

ฉันยังเพิ่มบรรทัดนี้ในการกำหนดค่า yaml ของฉันและตั้งแต่นั้นมาการรีสตาร์ทเซิร์ฟเวอร์ / บริการใด ๆ ก็ไม่มีปัญหา เศษที่จัดสรรใหม่กลับมาทันที

FWIW เพื่อตอบคำถามที่ถูกขอให้ตั้งค่า MAX_HEAP_SIZE เป็น 30G ยกเว้นว่าเครื่องของคุณมีหน่วยความจำน้อยกว่า 60G ซึ่งในกรณีนี้ให้ตั้งค่าเป็นครึ่งหนึ่งของหน่วยความจำที่มีอยู่

อ้างอิง


2
เพื่อแก้ปัญหานี้ในเวอร์ชัน 1.1.1 ฉันควรใช้ cluster.routing.allocation.enable = none หรือไม่
user3175226

1
การปิดใช้งานการจัดสรรไม่ได้รับการบันทึกไว้ที่นั่นอีกแล้วอย่างน้อยไม่ใช่เมื่อวันที่ 20 พ.ย.

3
โปรดทราบว่าการจัดสรรการกำหนดเส้นทางเป็นการตั้งค่าทั่วทั้งคลัสเตอร์ดังนั้นจึงไม่สำคัญว่าคุณจะส่งคำสั่งไปที่โหนดใด
Wilfred Hughes

ฉันเพิ่มทั้งสองในไฟล์ es yml ของฉัน index.routing.allocation.disable_allocation : false cluster.routing.allocation.enable: noneแต่ยังมีเศษชิ้นส่วนที่ยังไม่ได้กำหนด .. มีเหตุผลอะไรบ้าง
bagui

1
ในรุ่น 6.8 ฉันได้รับข้อผิดพลาด:{ "type": "illegal_argument_exception", "reason": "unknown setting [index.routing.allocation.disable_allocation] please check that any required plugins are installed, or check the breaking changes documentation for removed settings" } ],
Janac Meena

39

สคริปต์ทุบตีเล็ก ๆ น้อย ๆ นี้จะดุร้ายกำลังมอบหมายใหม่คุณอาจสูญเสียข้อมูล

NODE="YOUR NODE NAME"
IFS=$'\n'
for line in $(curl -s 'localhost:9200/_cat/shards' | fgrep UNASSIGNED); do
  INDEX=$(echo $line | (awk '{print $1}'))
  SHARD=$(echo $line | (awk '{print $2}'))

  curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
     "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
          }
        }
    ]
  }'
done

ทำงานเหมือนจับใจ ขอบคุณ!
เปาโล Pires

ฉันได้รับข้อผิดพลาดนี้: <br> {"ผิดพลาด": "JsonParseException [อักขระที่ไม่คาดคิด (',' (รหัส 44)): คาดว่าค่าที่ถูกต้อง (หมายเลข, สตริง, อาร์เรย์, วัตถุ, 'จริง', 'เท็จ' หรือ 'null') \ n ที่ [ที่มา: [B @ 3b1fadfb; บรรทัด: 6, คอลัมน์: 27]] "," สถานะ ": 500} - สิ่งที่ฉันควรทำเพื่อแก้ไข
biolinh

ขอบคุณตัน! มันช่วยประหยัดเวลาอันมีค่า !!
Sathish

สคริปต์พ่นข้อผิดพลาด:{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
Janac Meena

17

สิ่งเดียวที่ทำงานได้สำหรับฉันคือการเปลี่ยน number_of_replicas (ฉันมี 2 แบบจำลองดังนั้นฉันเปลี่ยนเป็น 1 แล้วเปลี่ยนกลับเป็น 2)

ครั้งแรก:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 1
     }
}

แล้ว:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 2
     }
}

(ฉันตอบแล้วในคำถามนี้ )


9

Elasticsearch จะจัดสรรเศษโดยอัตโนมัติหากตั้งค่าด้านล่างเป็นทั้งหมด การกำหนดค่านี้สามารถตั้งค่าโดยใช้ส่วนที่เหลือเช่นกัน cluster.routing.allocation.enable: all

หากแม้หลังจากการประยุกต์ใช้การกำหนดค่าด้านล่างนี้ es ล้มเหลวในการกำหนดเศษโดยอัตโนมัติแล้วคุณจะต้องบังคับให้กำหนดชิ้นส่วนด้วยตัวเอง ES ลิงค์อย่างเป็นทางการสำหรับสิ่งนี้

ฉันได้เขียนสคริปต์เพื่อบังคับให้มอบหมายเศษที่ไม่ได้กำหนดทั้งหมดในคลัสเตอร์

อาร์เรย์ด้านล่างมีรายการโหนดที่คุณต้องการสร้างสมดุลของเศษที่ไม่ได้กำหนด

#!/bin/bash
array=( node1 node2 node3 )
node_counter=0
length=${#array[@]}
IFS=$'\n'
for line in $(curl -s 'http://127.0.0.1:9200/_cat/shards'|  fgrep UNASSIGNED); do
    INDEX=$(echo $line | (awk '{print $1}'))
    SHARD=$(echo $line | (awk '{print $2}'))
    NODE=${array[$node_counter]}
    echo $NODE
    curl -XPOST 'http://127.0.0.1:9200/_cluster/reroute' -d '{
        "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
            }
        }
        ]
    }'
    node_counter=$(((node_counter)%length +1))
done

สคริปต์นี้ใช้งานไม่ได้นั่นคือหลังจากฉันวิ่งแล้วฉันยังคงมีเศษที่ไม่ได้ลงนาม
Chris F

@ChrisF ใน line1: คุณต้องแทนที่ node1, node2, node3 ด้วยชื่อโหนดจริง คุณสามารถรับพวกเขาด้วย curl localhost: 9200 / _cat / nodes
sidi

6

วันนี้ฉันติดปัญหาเรื่องการจัดสรรเศษ สคริปต์ที่ W. แอนดรู Loe IIIเสนอไว้ในคำตอบของเขาไม่ได้ผลสำหรับฉันดังนั้นฉันจึงปรับเปลี่ยนเล็กน้อยและในที่สุดก็ใช้งานได้:

#!/usr/bin/env bash

# The script performs force relocation of all unassigned shards, 
# of all indices to a specified node (NODE variable)

ES_HOST="<elasticsearch host>"
NODE="<node name>"

curl ${ES_HOST}:9200/_cat/shards > shards
grep "UNASSIGNED" shards > unassigned_shards

while read LINE; do
  IFS=" " read -r -a ARRAY <<< "$LINE"
  INDEX=${ARRAY[0]}
  SHARD=${ARRAY[1]}

  echo "Relocating:"
  echo "Index: ${INDEX}"
  echo "Shard: ${SHARD}"
  echo "To node: ${NODE}"

  curl -s -XPOST "${ES_HOST}:9200/_cluster/reroute" -d "{
    \"commands\": [
       {
         \"allocate\": {
           \"index\": \"${INDEX}\",
           \"shard\": ${SHARD},
           \"node\": \"${NODE}\",
           \"allow_primary\": true
         }
       }
     ]
  }"; echo
  echo "------------------------------"
done <unassigned_shards

rm shards
rm unassigned_shards

exit 0

ตอนนี้ฉันไม่ได้เป็นกูรู Bash แต่สคริปต์ใช้งานได้จริงสำหรับกรณีของฉัน โปรดทราบว่าคุณจะต้องระบุค่าที่เหมาะสมสำหรับตัวแปร "ES_HOST" และ "NODE"


ขออภัย ES5x ยากจนความเข้ากันได้: elastic.co/guide/en/elasticsearch/reference/5.1/...
Fawix

2
เพื่อให้สคริปต์ด้านบนทำงานกับ ES5x ให้แทนที่allocateด้วยallocate_empty_primaryและแทนที่\"allow_primary\": trueด้วย\"accept_data_loss\": true
Fawix

ได้รับ{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}แม้หลังจากใช้ข้อเสนอแนะของ
Fawix

6

ในกรณีของฉันถึงขีด จำกัด บนของพื้นที่ฮาร์ดดิสก์แล้ว

ดูบทความนี้: https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html

โดยทั่วไปฉันวิ่ง:

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.info.update.interval": "1m"
  }
}

เพื่อที่จะจัดสรรหากใช้พื้นที่ว่างในฮาร์ดดิสก์ <90% และย้ายชิ้นส่วนไปยังเครื่องอื่นในคลัสเตอร์ถ้าใช้พื้นที่ว่างบนฮาร์ดดิสก์ 95%; และจะตรวจสอบทุก 1 นาที


4

บางทีมันอาจช่วยใครบางคน แต่ฉันมีปัญหาเดียวกันและเป็นเพราะพื้นที่จัดเก็บไม่เพียงพอที่เกิดจากการบันทึกที่ใหญ่เกินไป

หวังว่ามันจะช่วยให้ใครบางคน! :)


4

ในกรณีของฉันเมื่อฉันสร้างดัชนีใหม่ดังนั้นnumber_of_replicasเริ่มต้นจะถูกตั้งค่าเป็น 1 และจำนวนโหนดในคลัสเตอร์ของฉันเป็นเพียงหนึ่งเดียวดังนั้นจึงไม่มีโหนดพิเศษในการสร้างแบบจำลองดังนั้นสุขภาพจึงเปลี่ยนเป็นสีเหลือง ดังนั้นเมื่อฉันสร้างดัชนีด้วยคุณสมบัติการตั้งค่าและตั้งค่า number_of_replicasเป็น 0 จากนั้นก็ใช้งานได้ดี หวังว่านี่จะช่วยได้

PUT /customer
{
    "settings": {
        "number_of_replicas": 0
    }
}

3

ฉันมีปัญหาเดียวกัน แต่สาเหตุที่แท้จริงคือความแตกต่างของหมายเลขเวอร์ชัน (1.4.2 บนสองโหนด (มีปัญหา) และ 1.4.4 บนสองโหนด (ok) คำตอบที่หนึ่งและที่สอง (การตั้งค่า "index.routing.allocation.disable_allocation" เป็น false และการตั้งค่า "cluster.routing.allocation.enable" เป็น "all") ไม่ทำงาน

อย่างไรก็ตามคำตอบโดย @Wilfred Hughes (การตั้งค่า "cluster.routing.allocation.enable" เป็น "all" โดยใช้ transient) ทำให้ฉันมีข้อผิดพลาดด้วยคำสั่งต่อไปนี้:

[ไม่ (รุ่นโหนดเป้าหมาย [1.4.2] เก่ากว่ารุ่นโหนดต้นทาง [1.4.4])]

หลังจากอัพเดตโหนดเก่าเป็น 1.4.4 โหนดเหล่านี้เริ่ม resnc กับโหนดที่ดีอื่น ๆ


3

ฉันมีปัญหานี้เช่นกันและฉันพบวิธีง่ายๆในการแก้ไข

  • รับดัชนีเศษที่ไม่ได้กำหนด

    $ curl -XGET http://172.16.4.140:9200/_cat/shards
    
  • ติดตั้งเครื่องมือผู้ดูแลและใช้เพื่อลบดัชนี

    $ curator --host 172.16.4.140 delete indices --older-than 1 \
           --timestring '%Y.%m.%d' --time-unit days --prefix logstash
    

    หมายเหตุ:ในกรณีของฉันดัชนีคือล็อกอัพของวัน 2016-04-21

  • จากนั้นตรวจสอบเศษอีกครั้งเศษที่ไม่ได้กำหนดทั้งหมดหายไป!

1
@sim ขอบคุณมากสำหรับการแก้ไขสำหรับคำตอบของฉัน ฉันยากจนมากในการแก้ไขจะให้ความสำคัญกับมันมากขึ้น
user3391471

สำหรับฉันมันเป็น:curator_cli --host 127.0.0.1 delete_indices --filter_list '[{"filtertype":"pattern","kind":"prefix","value":"logstash-"}]'
Gaui

2

ฉันเจอสถานการณ์นี้และสุดท้ายก็แก้ไขมัน

ประการแรกฉันจะอธิบายสถานการณ์ของฉัน ฉันมีสองโหนดในกลุ่ม ElasticSearch พวกเขาสามารถค้นหาซึ่งกันและกัน แต่เมื่อฉันสร้างดัชนีด้วยการตั้งค่า"number_of_replicas": 2 , "number_of_shards": 5, ES แสดงสัญญาณสีเหลืองและ unassigned_shards คือ 5

ปัญหาเกิดขึ้นเนื่องจากค่าของnumber_of_replicasเมื่อฉันตั้งค่าเป็น1ทั้งหมดจะดี


4
จำนวนเรพลิกาควรเป็น N-1 ตามจำนวนโหนดที่คุณมี ดังนั้นในสถานการณ์ของคุณที่มี 2 โหนด 1 ในโหนดนั้นมีชาร์ดหลักในขณะที่โหนดอื่น ๆ มีเรพลิกาดังนั้นจำนวนเรพลิกาของคุณควรถูกตั้งค่าเป็น 1 N = 2, N - 1 = 1
slm

1

ในกรณีของฉันโหนดเก่าที่มีการแชร์แบบเก่ากำลังเข้าร่วมคลัสเตอร์ดังนั้นเราจึงต้องปิดโหนดเก่าและลบดัชนีด้วยเศษที่ไม่ได้กำหนด


1

ฉันลองคำแนะนำด้านบนหลายข้อ แต่น่าเสียดายที่ไม่มีคำแนะนำใด ๆ เลย เรามีดัชนี "บันทึก" ในสภาพแวดล้อมที่ต่ำกว่าซึ่งแอปเขียนข้อผิดพลาด เป็นคลัสเตอร์โหนดเดียว สิ่งที่แก้ไขได้สำหรับฉันคือการตรวจสอบไฟล์กำหนดค่า YML สำหรับโหนดและเห็นว่ามันยังคงมีการตั้งค่าเริ่มต้น "เกตเวย์ที่ไม่คาดคิด: 2" นี่คือการแทนที่การตั้งค่าอื่น ๆ ที่เรามี เมื่อใดก็ตามที่เราจะสร้างดัชนีบนโหนดนี้มันจะพยายามกระจาย 3 จาก 5 เศษไปยังโหนดที่สองของแฟนทอม สิ่งเหล่านี้จะปรากฏเป็นไม่ได้กำหนดและพวกเขาไม่สามารถถูกย้ายไปยังโหนดที่ 1 และโหนดเดียว

วิธีแก้ปัญหาคือแก้ไขการตั้งค่าเปลี่ยนการตั้งค่า "เกตเวย์ที่ไม่คาดคิด" เป็น 1 ดังนั้นมันจะออกจากการค้นหาพี่ชายที่ไม่เคยพบมาก่อนในคลัสเตอร์และรีสตาร์ทอินสแตนซ์บริการแบบยืดหยุ่น นอกจากนี้ฉันต้องลบดัชนีและสร้างดัชนีใหม่ หลังจากสร้างดัชนีเศษทั้งหมดจะปรากฏขึ้นบนโหนดที่ 1 และโหนดเดียวและไม่มีการมอบหมายใด ๆ

# Set how many nodes are expected in this cluster. Once these N nodes
# are up (and recover_after_nodes is met), begin recovery process immediately
# (without waiting for recover_after_time to expire):
#
# gateway.expected_nodes: 2
gateway.expected_nodes: 1

1

สำหรับฉันนี้ได้รับการแก้ไขโดยการเรียกใช้จากคอนโซล dev: "POST / _cluster / reroute? retry_failed"

.....

ฉันเริ่มต้นด้วยการดูรายการดัชนีเพื่อดูว่าดัชนีใดแดงแล้ววิ่ง

"รับ /_cat/shards?h=thTHEXNAME เหมือนกัน, shard,prirep,state,unassigned.reason"

และเห็นว่ามีเศษชิ้นส่วนติดอยู่ในสถานะ ALLOCATION_FAILED ดังนั้นการเรียกใช้การลองใหม่ด้านบนทำให้พวกเขาลองจัดสรรใหม่อีกครั้ง


ในฐานะของเวอร์ชัน 5.6.3 คำสั่งนั้นควรจะได้รับ /_cat/shards/ [/ index_name ]?h=,shard,prirep,state,unassigned.reason
fasantos

0

อาจช่วยได้ แต่ฉันมีปัญหานี้เมื่อพยายามเรียกใช้ ES ในโหมดฝังตัว แก้ไขคือเพื่อให้แน่ใจว่าโหนดมีการตั้งค่าท้องถิ่น (จริง)


0

อีกเหตุผลที่เป็นไปได้สำหรับเศษชิ้นส่วนที่ไม่ได้กำหนดคือคลัสเตอร์ของคุณกำลังรัน Elasticsearch มากกว่าหนึ่งเวอร์ชัน

shard replication จากเวอร์ชั่นที่ใหม่กว่าไปเป็นเวอร์ชั่นก่อนหน้าจะไม่ทำงาน

นี่อาจเป็นสาเหตุหลักของเศษที่ไม่ได้กำหนด

เอกสารประกอบแบบยืดหยุ่น - กระบวนการอัปเกรดกลิ้ง


0

ฉันพบปัญหาเดียวกันทั้งหมด สิ่งนี้สามารถป้องกันได้ด้วยการตั้งค่าการจัดสรรชาร์ดชั่วคราวให้เป็นเท็จก่อนที่จะรีสตาร์ทการค้นหาด้วยอีลาสติก แต่ก็ไม่สามารถแก้ไขเศษที่ไม่ได้กำหนดถ้ามันมีอยู่

ในกรณีของฉันมันเกิดจากการขาดพื้นที่ว่างในโหนดข้อมูล เศษที่ไม่ได้กำหนดซึ่งยังคงอยู่บนโหนดข้อมูลหลังจากการรีสตาร์ท แต่ยังไม่ได้รับการยอมรับจากต้นแบบ

เพียงแค่ทำความสะอาด 1 โหนดจากดิสก์ก็เริ่มกระบวนการจำลองแบบสำหรับฉัน นี่เป็นกระบวนการที่ค่อนข้างช้าเพราะข้อมูลทั้งหมดจะต้องถูกคัดลอกจากโหนดข้อมูลหนึ่งไปยังอีกโหนดหนึ่ง


0

ฉันพยายามลบเศษที่ไม่ได้กำหนดหรือกำหนดให้โหนดข้อมูลเฉพาะ มันใช้งานไม่ได้เพราะเศษที่ไม่ได้กำหนดยังคงปรากฏและสถานะสุขภาพเป็น "สีแดง" ซ้ำแล้วซ้ำอีก จากนั้นฉันสังเกตเห็นว่าหนึ่งในโหนดข้อมูลติดอยู่ในสถานะ "รีสตาร์ท" ฉันลดจำนวนโหนดข้อมูลฆ่ามัน ปัญหาไม่สามารถทำซ้ำได้อีก


0

ฉันมีสองดัชนีที่มีเศษที่ไม่ได้กำหนดซึ่งดูเหมือนจะไม่สามารถรักษาตัวเองได้ ในที่สุดฉันก็แก้ปัญหานี้ได้โดยเพิ่มdata-node พิเศษ[1]ชั่วคราว หลังจากที่ดัชนีมีสุขภาพดีและทุกอย่างมีเสถียรภาพเป็นสีเขียวฉันได้ลบโหนดพิเศษและระบบก็สามารถปรับสมดุล (อีกครั้ง) และตั้งอยู่ในสถานะที่มีสุขภาพดี

เป็นความคิดที่ดีที่จะหลีกเลี่ยงการฆ่าโหนดข้อมูลหลาย ๆ อันในคราวเดียว เป็นไปได้ว่าฉันไม่ได้เก็บรักษาสำเนา / แบบจำลองใด ๆ สำหรับเศษอย่างน้อยหนึ่งชิ้น โชคดีที่ Kubernetes เก็บที่อยู่ดิสก์ไว้รอบ ๆ และนำมาใช้ใหม่เมื่อฉันเปิดดาต้าโหนดใหม่


... บางเวลาผ่านไป ...

คราวนี้แค่เพิ่มโหนดดูเหมือนจะไม่ทำงาน (หลังจากรอหลายนาทีเพื่อให้เกิดอะไรขึ้น) ดังนั้นฉันจึงเริ่มแหย่ไปที่ REST API

GET /_cluster/allocation/explain

"decision": "YES"นี้แสดงให้เห็นโหนดใหม่ของฉันด้วย

โดยวิธีการที่ทุกโหนดที่มีอยู่ก่อนได้เนื่องจาก"decision": "NO" "the node is above the low watermark cluster setting"ดังนั้นนี่อาจเป็นกรณีที่แตกต่างจากกรณีที่ฉันพูดก่อนหน้านี้

แล้วฉันจะทำ POST ง่ายๆดังต่อไป[2] กับร่างกายไม่มี , ที่เตะสิ่งที่เข้าเกียร์ ...

POST /_cluster/reroute

หมายเหตุอื่น ๆ :

  • มีประโยชน์มาก: https://datadoghq.com/blog/elasticsearch-unassigned-shards

  • อย่างอื่นที่อาจใช้การได้ ตั้งcluster_concurrent_rebalanceไป0แล้วnull- ขณะที่ผมแสดงให้เห็นถึงที่นี่


[1]ทำได้ง่าย ๆ ใน Kubernetes ถ้าคุณมีพื้นที่ว่างเพียงพอ: แค่ปรับขนาดชุดที่รัฐผ่านแดชบอร์ด

[2]การใช้อินเทอร์เฟซ Kibana "Dev Tools" ฉันไม่ต้องรำคาญกับเชลล์ SSH / exec


0

ฉันเพิ่งเพิ่มขึ้น

"index.number_of_replicas"

โดย 1 (รอจนกว่าจะซิงค์โหนด) จากนั้นลดลงทีละ 1 หลังจากนั้นจึงลบเศษที่ไม่ได้กำหนดและคลัสเตอร์เป็นสีเขียวอีกครั้งโดยไม่เสี่ยงต่อการสูญเสียข้อมูลใด ๆ

ฉันเชื่อว่ามีวิธีที่ดีกว่า แต่มันง่ายกว่าสำหรับฉัน

หวังว่านี่จะช่วยได้


0

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

การตั้งค่าดัชนีด้วยแบบจำลองที่ไม่ได้กำหนดเพื่อใช้ปัจจัยการจำลองที่ 0:

curl -XGET http://localhost:9200/_cat/shards |\
  grep UNASSIGNED | grep ' r ' |\
  awk '{print $1}' |\
  xargs -I {} curl -XPUT http://localhost:9200/{}/_settings -H "Content-Type: application/json" \
  -d '{ "index":{ "number_of_replicas": 0}}'

ตั้งค่ากลับเป็น 1:

curl -XGET http://localhost:9200/_cat/shards |\
  awk '{print $1}' |\
  xargs -I {} curl -XPUT http://localhost:9200/{}/_settings -H "Content-Type: application/json" \
  -d '{ "index":{ "number_of_replicas": 1}}'

หมายเหตุ:อย่ารันสิ่งนี้หากคุณมีปัจจัยการจำลองแบบที่แตกต่างกันสำหรับดัชนีที่แตกต่างกัน นี่จะ hardcode ปัจจัยการจำลองแบบสำหรับดัชนีทั้งหมดถึง 1

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