วิธีการเปลี่ยนชื่อดัชนีในคลัสเตอร์?


110

ฉันจำเป็นต้องเปลี่ยนชื่อหลายดัชนีในคลัสเตอร์ (ชื่อของพวกเขาจะต้องมีการเปลี่ยนแปลงฉันไม่สามารถใช้นามแฝง )

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

กลุ่มที่มี 3 เครื่องA, BและCและเศษที่มีการจำลองแบบของเขาแต่ละคน ฉันปิด ElasticSearch บนAเปลี่ยน/var/lib/elasticsearch/security/nodes/0/indices/oldindexnameไปและเริ่มต้นใหม่/var/lib/elasticsearch/security/nodes/0/indices/newindexnameA

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

  • oldindexnameพร้อมใช้งานและจำลองแบบเต็มที่ (กู้คืนจากBและCฉันเดา)
  • newindexname มีอยู่ (ฉันสามารถค้นหาได้) แต่ปลั๊กอินส่วนหัวแสดงให้เห็นว่าเศษของมันอยู่ในสถานะ "ไม่ได้กำหนด" และเป็นสีเทา (ไม่ได้จำลองแบบ)

ในระหว่างการกู้คืนsecurity.logแสดงข้อความต่อไปนี้:

[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name

แม้ว่าnewindexnameจะสามารถค้นหาได้ แต่ก็ไม่ได้อยู่ในสถานะปกติอย่างแน่นอน

newindexnameผมย้อนกลับสู่สถานะก่อนหน้านี้โดยการลบ คลัสเตอร์จะกลับมาเป็นสีเขียวโดยไม่มีรายการ "Unassigned"

ด้วยเหตุนี้ฉันoldindexnameจะเปลี่ยนชื่อnewindexnameเป็นคลัสเตอร์ได้อย่างไร

หมายเหตุ:ทางออกที่ดีที่สุดที่ฉันมีในใจคือการเลื่อนสำเนาoldindexเข้าnewindexและลบoldindexหลังจากนั้น ซึ่งจะต้องใช้เวลาดังนั้นหากมีวิธีแก้ปัญหาที่ตรงกว่านี้ก็จะดีมาก

คำตอบ:


19

เริ่มต้นด้วย ElasticSearch 7.4 วิธีที่ดีที่สุดที่จะเปลี่ยนชื่อดัชนีคือการคัดลอกดัชนีโดยใช้ที่เพิ่งแนะนำโคลนดัชนี APIแล้วลบดัชนีเดิมโดยใช้ดัชนี API

ข้อได้เปรียบหลักของ Clone Index API เหนือการใช้ Snapshot API หรือ Reindex API เพื่อจุดประสงค์เดียวกันคือความเร็วเนื่องจาก Clone Index API ฮาร์ดลิงก์เซ็กเมนต์จากดัชนีต้นทางไปยังดัชนีเป้าหมายโดยไม่ต้องประมวลผลเนื้อหาใด ๆ อีกครั้ง (บน ระบบไฟล์ที่รองรับฮาร์ดลิงก์อย่างชัดเจนมิฉะนั้นไฟล์จะถูกคัดลอกที่ระดับระบบไฟล์ซึ่งยังมีประสิทธิภาพมากกว่าทางเลือกอื่น ๆ ) Clone Index ยังรับประกันว่าดัชนีเป้าหมายเหมือนกันในทุกจุดของดัชนีต้นทาง (นั่นคือไม่จำเป็นต้องคัดลอกการตั้งค่าและการแมปด้วยตนเองซึ่งตรงกันข้ามกับวิธีการ Reindex) และไม่จำเป็นต้องกำหนดค่าไดเร็กทอรีสแน็ปช็อตภายในเครื่อง .

หมายเหตุด้านข้าง:แม้ว่าขั้นตอนนี้จะเร็วกว่าวิธีแก้ปัญหาก่อนหน้านี้มาก แต่ก็ยังหมายถึงเวลาที่หยุดทำงาน มีกรณีการใช้งานจริงที่ปรับเปลี่ยนชื่อดัชนี (ตัวอย่างเช่นเป็นขั้นตอนในเวิร์กโฟลว์การแบ่งย่อขนาดหรือสำรองข้อมูล) แต่การเปลี่ยนชื่อดัชนีไม่ควรเป็นส่วนหนึ่งของการดำเนินการแบบวันต่อวัน หากเวิร์กโฟลว์ของคุณต้องการการเปลี่ยนชื่อดัชนีบ่อยๆคุณควรพิจารณาใช้Indices Aliasesแทน

นี่คือตัวอย่างของลำดับที่สมบูรณ์ของการดำเนินการจัดทำดัชนีเปลี่ยนชื่อไปsource_index target_indexก็สามารถที่จะดำเนินการโดยใช้บางส่วนเฉพาะคอนโซล ElasticSearch เช่นหนึ่งแบบบูรณาการใน Kibana ดูส่วนสำคัญนี้สำหรับเวอร์ชันอื่นของตัวอย่างนี้โดยใช้curlแทน Elastic Search Console

# Make sure the source index is actually open
POST /source_index/_open

# Put the source index in read-only mode
PUT /source_index/_settings
{
  "settings": {
    "index.blocks.write": "true"
  }
}

# Clone the source index to the target name, and set the target to read-write mode
POST /source_index/_clone/target_index
{
  "settings": {
    "index.blocks.write": null 
  }
}

# Wait until the target index is green;
# it should usually be fast (assuming your filesystem supports hard links).
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s

# If it appears to be taking too much time for the cluster to get back to green,
# the following requests might help you identify eventual outstanding issues (if any)
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain

# Delete the source index
DELETE /source_index

163

คุณสามารถใช้REINDEXเพื่อทำเช่นนั้น

Reindex ไม่ได้พยายามตั้งค่าดัชนีปลายทาง ไม่คัดลอกการตั้งค่าของดัชนีแหล่งที่มา คุณควรตั้งค่าดัชนีปลายทางก่อนที่จะเรียกใช้การดำเนินการ _reindex รวมถึงการตั้งค่าการแมปจำนวนชาร์ดแบบจำลอง ฯลฯ

  1. ก่อนอื่นคัดลอกดัชนีเป็นชื่อใหม่
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. ตอนนี้ลบดัชนี
DELETE /twitter

แม้ว่าสิ่งนี้จะต้องมีพื้นที่ว่างสำหรับดัชนีทั้งสอง (ชั่วคราว) แต่ก็ทำได้ง่ายและสมบูรณ์บนเซิร์ฟเวอร์ดังนั้นนี่จึงเป็นวิธีแก้ปัญหาที่ดีที่สุด (แม้ว่าเอกสารจะเตือนเกี่ยวกับสถานะ 'ทดลอง' ก็ตาม) ขอบคุณ.
WoJ

2
ทำงานนี้ถ้าทำแผนที่มี_source: {enabled: false}?
Harald

2
@Harald No _reindexใช้_sourceเป็นข้อมูลเอกสารต้นฉบับ
Agop

6
สิ่งนี้จะไม่คัดลอกการแมปtwitterถึงnew_twitterเท่าที่ฉันรู้
นิค

3
ฉันเห็นด้วยกับการแก้ปัญหาของ _reindex แต่ควรเปลี่ยนคำถาม การจัดทำดัชนีใหม่ไม่ใช่แค่การเปลี่ยนชื่อ มันยังสามารถเปลี่ยนวิธีการจัดทำดัชนีข้อมูล
lucabelluccini

62

สำหรับการเปลี่ยนชื่อดัชนีของคุณคุณสามารถใช้โมดูล Elasticsearch Snapshot

ก่อนอื่นคุณต้องถ่ายภาพดัชนีของคุณในขณะที่กู้คืนคุณสามารถเปลี่ยนชื่อดัชนีของคุณได้

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "jal",
     "ignore_unavailable": "true",
     "include_global_state": false,
     "rename_pattern": "jal",
     "rename_replacement": "jal1"
     }

rename_replacement: - ชื่อดัชนีใหม่ที่คุณต้องการสำรองข้อมูลของคุณ


4
Holycrap มีประโยชน์อย่างไม่น่าเชื่อ ขอบคุณ!
Chris Cogdon

1
ดีกว่าวิธีแก้ปัญหาที่ยอมรับ! นี่เป็นสำเนาไบนารีของดัชนีดังนั้นจึงไม่มีความเสี่ยงที่จะสูญเสียอะไรและไม่จำเป็นต้อง_sourceเปิดใช้งานในดัชนี ฉันได้เปลี่ยนชื่อดัชนีหลาย TB ด้วยวิธีนี้โดยไม่มีปัญหาใด ๆ
เสื้อแจ็คเก็ต

2
@ แจ็คเก็ต - ฉันดีใจที่รู้ว่าคำตอบของฉันช่วยคุณได้จริงๆ
krishna kumar

1
ฉันเห็นด้วยวิธีแก้ปัญหาที่ดีกว่ามากไม่มีปัญหาการสูญหายของข้อมูลเร็วกว่ามากเช่นกันสำหรับดัชนีขนาดใหญ่กว่าการทำดัชนีใหม่
Romain Hautefeuille

1
มันยังคงการทำแผนที่ไว้หรือไม่
Amogh Mishra

5

ด้วยเหตุนี้จึงไม่มีวิธีโดยตรงในการคัดลอกหรือเปลี่ยนชื่อดัชนีใน ES (ฉันค้นหาโครงการของตัวเองอย่างครอบคลุม)

อย่างไรก็ตามตัวเลือกที่ง่ายมากคือการใช้เครื่องมือการย้ายข้อมูลยอดนิยม [Elastic-Exporter]

http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/

[PS: นี่ไม่ใช่บล็อกของฉันเพียงแค่สะดุดและพบว่ามันดี]

ดังนั้นคุณสามารถคัดลอกดัชนี / พิมพ์แล้วลบอันเก่า


ลิงก์ไม่ทำงานอีกต่อไป สถานที่อื่นที่เราสามารถหาได้หรือมีข้อมูลนี้หรือไม่?
elachell

5

ถ้าคุณไม่สามารถดัชนีวิธีแก้ปัญหาคือการใช้ชื่อแทน จากเอกสารอย่างเป็นทางการ :

APIs ใน elasticsearch ยอมรับชื่อดัชนีเมื่อทำงานกับดัชนีเฉพาะและดัชนีหลายตัวเมื่อเกี่ยวข้อง API นามแฝงของดัชนีอนุญาตให้ใช้แทนดัชนีด้วยชื่อโดย API ทั้งหมดจะแปลงชื่อนามแฝงเป็นชื่อดัชนีจริงโดยอัตโนมัติ นามแฝงสามารถแมปกับดัชนีได้มากกว่าหนึ่งดัชนีและเมื่อระบุนามแฝงจะขยายไปยังดัชนีนามแฝงโดยอัตโนมัติ นามแฝงสามารถเชื่อมโยงกับตัวกรองที่จะใช้โดยอัตโนมัติเมื่อค้นหาและกำหนดเส้นทางค่า นามแฝงไม่สามารถมีชื่อเดียวกับดัชนีได้

โปรดทราบว่าโซลูชันนี้ใช้ไม่ได้หากคุณใช้ฟีเจอร์ More Like นี้ https://github.com/elastic/elasticsearch/issues/16560


1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).โดย @WoJ
Thales P

นามแฝงเหตุผลใช้ไม่ได้ : การalias ใช้คุณต้องวางแผนล่วงหน้าและสร้างชื่อดัชนีเดิมas an aliasเป็นดัชนีจริง จากนั้นคุณสามารถสร้างชื่อนามแฝงใหม่และนำชื่อนามแฝงเก่าไปใช้อย่างอื่นได้ แต่คุณจะไม่สามารถเข้าถึง old_data ได้หากคุณมีเพียง real_index สร้างนามแฝงลบ real_index เก่า ขณะนี้นามแฝงชี้ไปที่ความว่างเปล่า
Jesse Chisholm

@JesseChrisholm ฉันคิดว่าไม่มีใครมี "นามแฝงที่ชี้ไปที่ความว่างเปล่า" ลองลบ real_index คุณจะพบว่านามแฝง "นามแฝงของมัน" จะถูกลบออกไปด้วย
mgaert

5

อีกวิธีหนึ่งในการเปลี่ยนชื่อหรือเปลี่ยนการแมปสำหรับดัชนีคือการสร้างดัชนีใหม่โดยใช้ logstash นี่คือตัวอย่างของการกำหนดค่า logstash 2.1:

input {
  elasticsearch {
   hosts => ["es01.example.com", "es02.example.com"]
   index => "old-index-name"
   size => 500
   scroll => "5m"
  }
}
filter {

 mutate {
  remove_field => [ "@version" ]
 }

 date {
   "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ]
   target => "@timestamp"
 }

}
output {
 elasticsearch {
   hosts => ["es01.example.com", "es02.example.com" ]
   manage_template => false
   index => "new-index-name"
 }
}

4
คุณกำลังบอกวิธีที่ดีที่สุดในการสร้างดัชนี Elasticsearch ซ้ำคือการติดตั้ง Logstash จากนั้นใช้สิ่งนั้นเพื่อจัดทำดัชนีใหม่? ดูเหมือนว่า overkill บิตโดยเฉพาะอย่างยิ่งถ้าคุณไม่ต้องการจริง / ใช้ Logstash ...
เอ็มจัสติน

ปัญหาเดียวในคำตอบคือส่วน "ที่ดีที่สุด" ฉันจะบอกว่า "อีกวิธีหนึ่ง" นอกเหนือจากนั้นก็เป็นคำตอบที่ดี
โรเบิร์ต


-5

ในกรณีที่ยังมีคนต้องการ วิธีที่ประสบความสำเร็จไม่เป็นทางการในการเปลี่ยนชื่อดัชนีคือ:

  1. ปิดดัชนีที่ต้องเปลี่ยนชื่อ
  2. เปลี่ยนชื่อโฟลเดอร์ดัชนีในไดเร็กทอรีข้อมูลทั้งหมดของโหนดหลักและโหนดข้อมูล
  3. เปิดดัชนีปิดเก่าอีกครั้ง (ฉันใช้ปลั๊กอิน kofp) ดัชนีเก่าจะเปิดขึ้นมาใหม่ แต่ยังคงไม่ได้มอบหมาย ดัชนีใหม่จะปรากฏในสถานะปิด
  4. เปิดดัชนีใหม่อีกครั้ง
  5. ลบดัชนีเก่า

หากคุณได้รับข้อผิดพลาดนี้ "dangled index directory name is" ให้ลบโฟลเดอร์ดัชนีในโหนดหลักทั้งหมด (ไม่ใช่โหนดข้อมูล) และเริ่มต้นโหนดข้อมูลใหม่


2
ท้อใจอย่างยิ่งกับ Elastic ตรวจสอบให้แน่ใจว่ามีการสำรองข้อมูลหากคุณทำเช่นนั้น
lucabelluccini

ฉันไม่เข้าใจว่าชื่อของดัชนีปรากฏในไดเร็กทอรีข้อมูลที่ใด เมื่อฉันดูใน / var / lib / elasticsearch / nodes / 0 / indices / ชื่อของไดเร็กทอรีจะถูกสร้างแบบสุ่มเช่น "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch เวอร์ชัน 5.6.3)
Johan Boulé

1
@ JohanBouléวิธีนี้ใช้ไม่ได้อีกต่อไปเนื่องจาก Elasticsearch เวอร์ชัน 5
Anh Le

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