कैसे एक क्लस्टर में एक सूचकांक का नाम बदलने के लिए?


110

मुझे एक क्लस्टर में कई इंडेक्स का नाम बदलने की जरूरत है (उनका नाम अवश्य होना चाहिए बदला जा, मैं उपयोग नहीं कर सकते उपनाम )।

मैंने देखा कि ऐसा करने के लिए कोई भी समर्थित तरीका नहीं है, जो मैंने पाया वह निकटतम है वह सूचकांक की निर्देशिका का नाम बदलना है , मैंने इसे एक क्लस्टर में आज़माया।

क्लस्टर में 3 मशीनें हैं A, Bऔर Cशार्क उनमें से प्रत्येक पर दोहराई जाती है। मैंने Aनाम बदलकर इलास्टिक्स खोज को बंद कर दिया/var/lib/elasticsearch/security/nodes/0/indices/oldindexname करने के लिए /var/lib/elasticsearch/security/nodes/0/indices/newindexnameऔर पुन: प्रारंभA

क्लस्टर की स्थिति पीले रंग की थी और सही स्थिति को बहाल करने के लिए इलास्टिक्स खोज कुछ जादू कर रही थी। कुछ समय बाद मैं खत्म हो गया

  • 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 या Reindex API के उपयोग के लिए क्लोन इंडेक्स API का मुख्य लाभ एक ही उद्देश्य के लिए गति है, क्योंकि क्लोन इंडेक्स API सोर्सबैंक से टार्गेट इंडेक्स के हार्डगिंक्स सेगमेंट को अपनी किसी भी सामग्री के पुनर्संसाधन के बिना उपयोग करता है। फाइलसिस्टम जो हार्डलिंक का समर्थन करते हैं, स्पष्ट रूप से; अन्यथा, फाइल सिस्टम स्तर पर फाइलों की नकल की जाती है, जो अभी भी बहुत अधिक कुशल है कि वैकल्पिक विकल्प)। क्लोन इंडेक्स यह भी गारंटी देता है कि टारगेट इंडेक्स, सोर्स इंडेक्स के हर बिंदु में समान है (अर्थात, मैन्युअल रूप से सेटिंग्स और मैपिंग को कॉपी करने की कोई आवश्यकता नहीं है, Reindex दृष्टिकोण के विपरीत), और स्थानीय स्नैपशॉट निर्देशिका को कॉन्फ़िगर करने की आवश्यकता नहीं है। ।

साइड नोट: भले ही यह प्रक्रिया पिछले समाधानों की तुलना में बहुत तेज है, लेकिन यह अभी भी समय से कम है। वास्तविक उपयोग के मामले हैं जो नाम बदलने के सूचकांकों को सही ठहराते हैं (उदाहरण के लिए, विभाजन, सिकुड़न या बैकअप वर्कफ़्लो में एक कदम के रूप में), लेकिन नाम बदलना सूचक दिन-प्रतिदिन के कार्यों का हिस्सा नहीं होना चाहिए। यदि आपके वर्कफ़्लो को बार-बार अनुक्रमणिका का नाम बदलने की आवश्यकता होती है, तो आपको इसके बजाय Indices Aliases का उपयोग करने पर विचार करना चाहिए ।

अनुक्रमणिका source_indexका नाम बदलने के लिए संचालन के पूर्ण अनुक्रम का एक उदाहरण यहां दिया गया है target_index। इसे कुछ इलास्टिक खोज विशिष्ट कंसोल का उपयोग करके निष्पादित किया जा सकता है, जैसे कि किबाना में एकीकृत । एक लोचदार खोज कंसोल के बजाय का उपयोग करके इस उदाहरण के वैकल्पिक संस्करण के लिए इस जिस्ट को देखें curl

# 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
@ हेराल्ड नहीं, मूल दस्तावेज़ डेटा के रूप में _reindexउपयोग करता है _source
अगोप

6
इस की मैपिंग कॉपी नहीं करेंगे twitterकरने के लिए new_twitterजहाँ तक मुझे पता है।
निक

3
मैं _reindex के समाधान पर सहमत हूं, लेकिन प्रश्न को बदल दिया जाना चाहिए। Reindexing केवल एक नामकरण नहीं है। यह भी बदल सकता है कि डेटा को कैसे अनुक्रमित किया जाए।
ल्युबलबेलिनी

62

अपने अनुक्रमणिका का नाम बदलने के लिए आप एलाटिक्स खोज स्नैपशॉट मॉड्यूल का उपयोग कर सकते हैं।

सबसे पहले आपको अपने सूचकांक का स्नैपशॉट लेना होगा। इसके बाद इसे बहाल करके आप अपने सूचकांक का नाम बदल सकते हैं।

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

rename_replacement: -New indexname जिसमें आप अपने डेटा का बैकअप चाहते हैं।


4
Holycrap, यह अविश्वसनीय रूप से उपयोगी है। धन्यवाद!
क्रिस कॉगडन

1
स्वीकृत समाधान से बहुत बेहतर! यह वास्तव में सूचकांक की एक द्विआधारी प्रतिलिपि है, इसलिए कुछ भी खोने का कोई जोखिम नहीं है _sourceऔर सूचकांक में सक्षम होने की आवश्यकता नहीं है । मैंने बिना किसी मुद्दे के कुछ मल्टी-टीबी सूचकांकों का नाम बदल दिया है।
जैकेट

2
@ जैकेट - मुझे यह जानकर खुशी हुई कि मेरा जवाब वास्तव में आपकी मदद करता है।
कृष्ण कुमार

1
मैं सहमत हूं, ज्यादा बेहतर समाधान, कोई डेटा हानि के मुद्दे नहीं, बहुत तेजी से और साथ ही बड़े सूचकांकों के लिए
रीइंडेक्सिंग की

1
क्या यह मैपिंग को बनाए रखता है?
अमोघ मिश्रा

5

जैसे कि ES में अनुक्रमणिका का नाम बदलने या उसका नाम बदलने का कोई प्रत्यक्ष तरीका नहीं है (मैंने अपनी परियोजना के लिए बड़े पैमाने पर खोज की)

हालाँकि, एक बहुत आसान विकल्प एक लोकप्रिय प्रवासन उपकरण [लोचदार-निर्यातक] का उपयोग करना है।

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

[पुनश्च: यह मेरा ब्लॉग नहीं है, बस ठोकर खाई और इसे अच्छा पाया]

जिससे आप सूचकांक / प्रकार की प्रतिलिपि बना सकते हैं और फिर पुराने को हटा सकते हैं।


लिंक अब काम नहीं करता है। कोई अन्य जगह हम इसे पा सकते हैं या इसकी जानकारी है?
इलाचेल

5

आप पुन: अनुक्रमणिका नहीं कर सकता है एक वैकल्पिक हल का उपयोग है उपनाम । से आधिकारिक प्रलेखन:

इलास्टिक्सखोज में एपीआई एक विशिष्ट सूचकांक के खिलाफ काम करते समय एक सूचकांक नाम को स्वीकार करते हैं, और जब लागू होते हैं तो कई सूचकांक। इंडेक्स अलायसेस एपीआई एक इंडेक्स को एक नाम के साथ एक उपनाम देने की अनुमति देता है, सभी एपीआई स्वचालित रूप से उपनाम नाम को वास्तविक इंडेक्स नाम में परिवर्तित करते हैं। एक उपनाम भी एक से अधिक सूचकांक में मैप किया जा सकता है, और इसे निर्दिष्ट करते समय, उपनाम स्वचालित रूप से उपनामों के सूचकांकों तक फैल जाएगा। एक उपनाम भी एक फिल्टर से जुड़ा हो सकता है जो खोज करते समय और मूल्यों को राउटिंग करते समय स्वचालित रूप से लागू होगा। एक उपनाम का एक सूचकांक के समान नाम नहीं हो सकता है।

ध्यान रखें कि यदि आप इस तरह की सुविधा का उपयोग कर रहे हैं तो यह समाधान काम नहीं करता है। 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 द्वारा
थेल्स पी

कारण अन्य काम नहीं करेगा : आपको आगे की योजना बनाने और वास्तविक सूचकांक में मूल सूचकांक नाम बनाने की alias आवश्यकता हैas an alias । फिर आप एक नया उपनाम नाम बना सकते हैं और किसी अन्य चीज़ के लिए पुराने उपनाम नाम का पुनः उपयोग कर सकते हैं। लेकिन आप पुराने_डेटा तक पहुंच खो देते हैं यदि आपके पास केवल एक वास्तविक_इंडेक्स है, तो इसके लिए एक उपनाम बनाएं, पुराने रियल_इंडेक्स को हटा दें। उर्फ अब कुछ नहीं करने का इशारा करता है।
जेसी चिशोल्म

@JesseChrisholm मुझे लगता है कि किसी के पास "उपनाम नहीं है जो कुछ भी नहीं इंगित करता है"। Real_index निकालने का प्रयास करें, आप देखेंगे कि उपनाम "इसके लिए एक उपनाम" भी हटा दिया जाएगा।
मैगर्ट

5

अनुक्रमणिका के लिए नाम बदलने या मैपिंग को प्राप्त करने के लिए एक और अलग तरीका लॉगस्टैश का उपयोग करके फिर से लिखना है। यहाँ लॉगस्टैश 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
तो आप सबसे अच्छा तरीका कह रहे हैं कि एक एलीस्टेसर्च इंडेक्स को रीइन्डेक्स करने के लिए लॉगस्टैश को इंस्टॉल करना है, और फिर रिइंडेक्स के लिए इसका उपयोग करना है? थोड़ा overkill लगता है, खासकर यदि आप वास्तव में नहीं चाहते हैं / Logstash का उपयोग करें ...
एम। जस्टिन

उत्तर में एकमात्र समस्या "सबसे अच्छा" भाग है। मैं कहूंगा "एक और तरीका '। इसके अलावा, यह एक अच्छा जवाब है।
रॉबर्ट

3

जैसा कि स्नैपशॉट मॉड्यूल के लिए एलिटिक्स खोज संदर्भ में इंगित किया गया है ,

Rename_pattern और rename_replacement विकल्पों का उपयोग नियमित अभिव्यक्ति का उपयोग करके पुनर्स्थापना पर सूचकांक का नाम बदलने के लिए भी किया जा सकता है


-5

बस के मामले में किसी को अभी भी इसकी जरूरत है। सफल, आधिकारिक नहीं, अनुक्रमित नाम बदलने का तरीका है:

  1. उन अनुक्रमणिकाओं को बंद करें जिनका नाम बदलने की आवश्यकता है
  2. मास्टर और डेटा नोड्स के सभी डेटा निर्देशिकाओं में अनुक्रमित फ़ोल्डर का नाम बदलें।
  3. पुराने बंद इंडेक्स को फिर से खोलें (मैं कोफ प्लगइन का उपयोग करता हूं)। पुराने अनुक्रमों को फिर से खोल दिया जाएगा लेकिन अप्रकाशित रहें। नए सूचकांक बंद अवस्था में दिखाई देंगे
  4. नए इंडेक्स को फिर से खोलें
  5. पुराने इंडेक्स को डिलीट करें

यदि आपको यह त्रुटि "ख़राब इंडेक्स डायरेक्टरी नाम" प्राप्त करने के लिए होती है, तो सभी मास्टर नोड्स (डेटा नोड्स नहीं) में इंडेक्स फ़ोल्डर को हटा दें, और डेटा नोड्स में से एक को पुनरारंभ करें।


2
इलास्टिक द्वारा दृढ़ता से हतोत्साहित किया गया। यदि आप ऐसा करते हैं तो बैकअप सुनिश्चित करें।
लुकाबेल्लुकिनि

मुझे समझ नहीं आ रहा है कि डेटा निर्देशिका में सूचकांक का नाम कहां दिखाई देता है। जब मैं / var / lib / elasticsearch / nodes / 0 / indices / निर्देशिकाओं के नाम यादृच्छिक-उत्पन्न करता हूं, जैसे "1aS4RusHSYWLdt-Wx7NnBw" (एलिजाबेथ संस्करण 5.6.3)
जोहान

1
@ जोहानूले, यह विधि अब एलिस्टिक्स के संस्करण 5 के बाद से मान्य नहीं है।
अन ले ले

@lucabelluccini, सहमत। बेहतर है कि बस उन्हें छोड़ दें और उपनाम का उपयोग करें।
अन ले ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.