จะหยุด / ปิดโหนด elasticsearch ได้อย่างไร?


87

ฉันต้องการรีสตาร์ทโหนด elasticsearch ด้วยการกำหนดค่าใหม่ วิธีที่ดีที่สุดในการปิดโหนดอย่างสง่างามคืออะไร?

การฆ่ากระบวนการนี้เป็นวิธีที่ดีที่สุดในการปิดเซิร์ฟเวอร์หรือมี URL วิเศษที่ฉันสามารถใช้เพื่อปิดโหนดได้หรือไม่

คำตอบ:


127

คำตอบที่อัปเดต

_shutdown API ถูกลบออกใน elasticsearch 2.x

บางตัวเลือก:

  • ในเทอร์มินัลของคุณ (โดยทั่วไปโหมด dev) เพียงพิมพ์ "Ctrl-C"

  • หากคุณเริ่มต้นเป็น daemon ( -d) ให้ค้นหา PID และฆ่ากระบวนการ: SIGTERMจะปิด Elasticsearch ลงอย่างหมดจด ( kill -15 PID)

  • หากทำงานเป็นบริการให้เรียกใช้สิ่งต่อไปนี้service elasticsearch stop:

คำตอบก่อนหน้า ตอนนี้เลิกใช้งานจาก 1.6 แล้ว

ใช่. ดูเอกสารการปิดโหนดคลัสเตอร์ของผู้ดูแลระบบ

โดยทั่วไป:

# Shutdown local node
$ curl -XPOST 'http://localhost:9200/_cluster/nodes/_local/_shutdown'

# Shutdown all nodes in the cluster
$ curl -XPOST 'http://localhost:9200/_shutdown'

2
ดังนั้นจึงดูเหมือนว่า API การปิดระบบจะเลิกใช้งานตั้งแต่ elasticsearch 1.6 (ตามลิงค์ที่ให้มา) วิธีใหม่ในการปิดระบบที่แนะนำคืออะไร?
Mike

2
ฉันคิดว่าเลิกใช้แล้วเพราะตอนนี้คุณสามารถติดตั้งเป็นบริการและเรียกใช้ service stop elasticsearch ได้แล้ว หากคุณเรียกใช้เพื่อการทดสอบให้กด CTRL + C เท่านี้ก็เสร็จเรียบร้อย
dadoonet

"gracefull" => คุณสามารถย้ายชิ้นส่วนของคุณก่อนหน้านี้ได้ด้วย reroute API elastic.co/guide/en/elasticsearch/reference/2.4/…
Thomas Decaux

23

หากคุณต้องการใช้การกำหนดค่าใหม่คุณไม่จำเป็นต้องปิดตัวลง

$ sudo service elasticsearch restart

แต่ถ้าคุณต้องการปิดมันต่อไป:

$ sudo service elasticsearch stop

หรือ

$ sudo systemctl stop elasticsearch.service

$ sudo systemctl restart elasticsearch.service

นักเทียบท่า:

docker restart <elasticsearch-container-name or id>


1
คำถามเกี่ยวกับการหยุดบริการไม่ใช่การเริ่มต้นใหม่
Jean-François Fabre

1
ถึงที่สุดจำเป็นต้องปิดเซิร์ฟเวอร์เพื่อใช้การกำหนดค่าใหม่ มันไม่ใช่คำตอบมันเป็นวิธีแก้ปัญหาของเขา :)
Ijaz Ahmad Khan


7

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

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

วิธีการทั่วไปคือปิดการจัดสรรชาร์ดชั่วคราวโดยการออก:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}

ตอนนี้เมื่อคุณลบโหนด ES จะไม่พยายามจัดสรรชาร์ดจากโหนดนั้นไปยังโหนดอื่นและคุณสามารถดำเนินกิจกรรมการบำรุงรักษาได้จากนั้นเมื่อโหนดขึ้นคุณสามารถเปิดใช้งานการจัดสรรชาร์ดได้อีกครั้ง:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}

ที่มา: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html

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

PUT _cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
  }
}

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

(แทนที่จะเป็น _ip, _id, _name ที่มีสัญลักษณ์แทนจะใช้ได้ดี)

ข้อมูลเพิ่มเติม: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html

คำตอบอื่น ๆ ได้อธิบายวิธีการฆ่ากระบวนการ


4

ปลั๊กอิน Head สำหรับ Elasticsearch มีฟรอนต์เอนด์บนเว็บที่ยอดเยี่ยมสำหรับการดูแลระบบ Elasticsearch รวมถึงการปิดโหนด สามารถรันคำสั่ง Elasticsearch ได้เช่นกัน


3

ใช้คำสั่งต่อไปนี้เพื่อทราบ pid ของโหนดที่รันอยู่แล้ว

curl -XGET ' http: // localhost: 9200 / _nodes / กระบวนการ '

ฉันใช้เวลาหนึ่งชั่วโมงในการหาวิธีฆ่าโหนดและในที่สุดก็สามารถทำได้หลังจากใช้คำสั่งนี้ในหน้าต่างเทอร์มินัล


2

หากคุณไม่พบว่ากระบวนการใดกำลังเรียกใช้ elasticsearch บนเครื่อง windows คุณสามารถลองรันในคอนโซล:

netstat -a -n -o

มองหาพอร์ต ElasticSearch 9200กำลังทำงานเริ่มต้นคือ คอลัมน์สุดท้ายคือ PID สำหรับกระบวนการที่ใช้พอร์ตนั้น คุณสามารถปิดเครื่องได้ด้วยคำสั่งง่ายๆในคอนโซล

taskkill /PID here_goes_PID /F

1

ในกรณีที่คุณต้องการค้นหา PID ของอินสแตนซ์และฆ่ากระบวนการโดยสมมติว่าโหนดกำลังฟังพอร์ต 9300 (พอร์ตเริ่มต้น) คุณสามารถรันคำสั่งต่อไปนี้:

kill -9  $(netstat -nlpt | grep 9200 | cut -d ' ' -f 58 | cut -d '/' -f 1)

คุณอาจต้องเล่นกับตัวเลขในรหัสดังกล่าวข้างต้นเช่น 58 และ 1


พอร์ตเริ่มต้นคือ 9200
slhck

1

หากคุณกำลังใช้งานโหนดบน localhost ให้ลองใช้ brew service stop elasticsearch

ฉันเรียกใช้ elasticsearch บน iOS localhost


0

คำตอบสำหรับ Elasticsearch ภายใน Docker:

เพียงแค่หยุดคอนเทนเนอร์นักเทียบท่า ดูเหมือนว่าจะหยุดลงอย่างสง่างามเพราะบันทึก:

[INFO ][o.e.n.Node               ] [elastic] stopping ...

0

ถือว่าคุณมี 3 โหนด

เตรียมคลัสเตอร์ของคุณ

export ES_HOST=localhost:9200

# Disable shard allocation
curl -X PUT "$ES_HOST/_cluster/settings" -H 'Content-Type: application/json' -d'
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}
'

# Stop non-essential indexing and perform a synced flush
curl -X POST "$ES_HOST/_flush/synced"

หยุดบริการ elasticsearch ในแต่ละโหนด

# check nodes
export ES_HOST=localhost:9200
curl -X GET "$ES_HOST/_cat/nodes"

# node 1
systemctl stop elasticsearch.service

# node 2
systemctl stop elasticsearch.service

# node 3
systemctl stop elasticsearch.service

กำลังรีสตาร์ทคลัสเตอร์อีกครั้ง

# start
systemctl start elasticsearch.service

# Reenable shard allocation once the node has joined the cluster
curl -X PUT "$ES_HOST/_cluster/settings" -H 'Content-Type: application/json' -d'
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}
'

ทดสอบกับ Elasticseach 6.5

ที่มา:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/6.5/stopping-elasticsearch.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/6.5/rolling-upgrades.html
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.