bir kümedeki dizini nasıl yeniden adlandırabilirim?


110

Ben (kendi adına bir küme birkaç dizinleri yeniden adlandırmak gerekir gerekir , ben kullanamıyorum değiştirilebilir takma adları ).

Bunu yapmanın desteklenen bir yolu olmadığını gördüm, en yakın bulduğum dizin dizinini yeniden adlandırmak , bunu bir kümede denedim.

Küme 3 makineleri vardır A, Bve Cve kırıkları bunların her biri üzerinde çoğaltılır. Elasticsearch'ü kapattım A, adını /var/lib/elasticsearch/security/nodes/0/indices/oldindexnamedeğiştirdim /var/lib/elasticsearch/security/nodes/0/indices/newindexnameve yeniden başlattım A.

Kümenin durumu sarıydı ve elasticsearch, doğru durumu geri getirmek için biraz sihir yapıyordu. Bir süre sonra bitirdim

  • oldindexnamemevcut ve tamamen kopyalanmış (kurtarıldı Bve Csanırım)
  • newindexname mevcut (arama yapabilirim) ancak head eklentisi, parçalarının "Atanmamış" durumda olduğunu ve gri renkte olduğunu (kopyalanmamış) gösteriyor

Kurtarma sırasında security.logaşağıdaki mesajı gösterdi:

[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

newindexnameAranabilir olsa da, kesinlikle normal bir durumda değildir.

Silerek önceki duruma geri döndüm newindexname. Küme, herhangi bir "Atanmamış" giriş olmadan yeşile döner.

Olduğu göz önüne alındığında, nasıl yeniden adlandırabilir oldindexnameiçin newindexnamebir kümede?

Not: Aklımdaki nihai çözüm kaydırma kopya etmektir oldindexiçine newindexve silme oldindexsonradan. Bu zaman alacaktır, bu yüzden daha doğrudan bir çözüm varsa harika olur.

Yanıtlar:


19

ElasticSearch 7.4'ten başlayarak, bir dizini yeniden adlandırmanın en iyi yöntemi, yeni sunulan Klon Dizini API'sini kullanarak dizini kopyalamak ve ardından Dizini Sil API'sini kullanarak orijinal dizini silmektir .

Clone Index API'nin Snapshot API veya Reindex API'nin aynı amaç için kullanımına göre temel avantajı hızdır, çünkü Clone Index API, segmentleri kaynak dizinden hedef dizine, içeriğinin hiçbirini yeniden işlemeden (açık Açıkçası sabit bağlantıları destekleyen dosya sistemleri; aksi takdirde dosyalar dosya sistemi düzeyinde kopyalanır, bu da alternatiflerden çok daha etkilidir). Klon Dizini ayrıca hedef dizinin kaynak dizinin her noktasında aynı olduğunu garanti eder (yani, Reindex yaklaşımının aksine ayarları ve eşlemeleri manuel olarak kopyalamaya gerek yoktur) ve yerel bir anlık görüntü dizininin yapılandırılmasını gerektirmez .

Yan not: Bu prosedür önceki çözümlerden çok daha hızlı olsa da, yine de aksama süresi anlamına gelir. Endeksleri yeniden adlandırmayı haklı kılan gerçek kullanım durumları vardır (örneğin, bölme, küçültme veya yedekleme iş akışında bir adım olarak), ancak endeksleri yeniden adlandırmak günlük işlemlerin bir parçası olmamalıdır. İş akışı sık dizin adlandırma gerektiriyorsa, o zaman kullanmayı düşünmelisiniz Endeksler diğer adları yerine.

Burada, dizini yeniden adlandırmak için eksiksiz bir işlem dizisinin bir örneği source_indexverilmiştir target_index. Kibana'ya entegre olan gibi bazı ElasticSearch'e özgü konsol kullanılarak çalıştırılabilir . Elastic Search konsolu yerine bu örneğin alternatif bir sürümü için bu öze bakın 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

Bunu yapmak için REINDEX'i kullanabilirsiniz .

Reindex, hedef dizini oluşturmaya çalışmaz. Kaynak dizinin ayarlarını kopyalamaz. Sen olmalıdır hedef endeksi kurmak eşleştirmeleri, shard sayımları, kopyaları, vb kurma, bir _reindex eylemi çalıştıran dahil öncesinde

  1. Önce dizini yeni bir isme kopyalayın
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Şimdi Dizini silin
DELETE /twitter

Bu, her iki dizin için de (geçici olarak) yer gerektirse de, bu basittir ve tamamen sunucu üzerindedir - bu nedenle, şu ana kadarki en iyi çözüm bu gibi görünüyor (her ne kadar belge 'deneysel' bir durum konusunda uyarıyor olsa da). Teşekkür ederim.
WoJ

2
Eşleştirme varsa bu çalışır mı _source: {enabled: false}?
Harald

2
@Harald No, orijinal belge verisi olarak _reindexkullanır _source.
Agop

6
Bu eşleştirmesini kopyalamaz twitteriçin new_twitterbildiğim kadarıyla olarak.
Nick

3
_Reindex'in çözümüne katılıyorum, ancak soru değiştirilmeli. Yeniden dizin oluşturma, yalnızca bir yeniden adlandırma değildir. Verilerin nasıl indeksleneceğini bile değiştirebilir.
lucabelluccini

62

Endeksinizi yeniden adlandırmak için Elasticsearch Snapshot modülünü kullanabilirsiniz.

Önce dizininizin anlık görüntüsünü almalısınız. Onu geri yüklerken dizininizi yeniden adlandırabilirsiniz.

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

rename_replacement: -Verilerinizi yedeklemek istediğiniz yeni dizin adı.


4
Holycrap, bu inanılmaz derecede faydalı. Teşekkür ederim!
Chris Cogdon

1
Kabul edilen çözümden çok daha iyi! Bu aslında dizinin ikili bir kopyasıdır, bu nedenle herhangi bir şey kaybetme riski yoktur _sourceve dizinde etkinleştirilmesi gerekmez . Bazı çoklu TB endekslerini bu şekilde herhangi bir sorun olmadan yeniden adlandırdım.
Jacket

2
@Jacket - Cevabımın size gerçekten yardımcı olduğunu bildiğime sevindim.
krishna kumar

1
Ben, yeniden dizin çok daha iyi bir çözüm, hiçbir veri kaybı sorunları, çok HIZLI için de büyük indeksleri katılıyorum
Romain Hautefeuille

1
eşlemeyi koruyor mu?
Amogh Mishra

5

Bu nedenle, ES'de dizini kopyalamak veya yeniden adlandırmak için doğrudan bir yöntem yoktur (kendi projem için kapsamlı bir şekilde arama yaptım)

Ancak çok kolay bir seçenek, popüler bir taşıma aracı [Elastic-Exporter] kullanmaktır.

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

[Not: bu benim blogum değil, sadece rastladım ve iyi buldum]

Böylece dizini / türü kopyalayabilir ve ardından eskisini silebilirsiniz.


Bağlantı artık çalışmıyor. Onu bulabileceğimiz veya bu bilgiye sahip olabileceğimiz başka bir yer var mı?
elachell

5

REINDEX yapamazsanız, geçici bir çözüm takma adlar kullanmaktır . Gönderen resmi belgeler:

Elasticsearch'teki API'ler, belirli bir dizine karşı çalışırken bir dizin adını ve uygun olduğunda birkaç endeksi kabul eder. Dizin takma adları API'si, tüm API'ler takma adı gerçek dizin adına otomatik olarak dönüştürerek bir dizine bir adla takma ad vermeyi sağlar. Bir takma ad birden fazla dizine eşlenebilir ve bunu belirtirken takma ad otomatik olarak takma ad dizinlerine genişler. Bir takma ad, arama ve yönlendirme değerleri sırasında otomatik olarak uygulanacak bir filtre ile de ilişkilendirilebilir. Bir takma ad, bir dizin ile aynı ada sahip olamaz.

Buna Benzer Diğer özelliği kullanıyorsanız, bu çözümün işe yaramayacağını unutmayın. 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).Yazan @WoJ
Thales P

Neden takma adı işe yaramaz : kullanmak alias , önceden plan yapmanızı ve orijinal dizin adını as an aliasgerçek bir dizine oluşturmanızı gerektirir . Daha sonra yeni bir takma ad oluşturabilir ve eski takma adı başka bir şey için yeniden kullanabilirsiniz. Ancak , yalnızca bir real_index'iniz varsa, eski verilere erişiminizi kaybedersiniz, ona bir takma ad yapın, eski real_index'i silin. Rumuz artık hiçbir şeye işaret etmiyor.
Jesse Chisholm

@JesseChrisholm Bence "hiçbir şeye işaret eden bir takma ad" olamaz. Real_index'i kaldırmayı deneyin, "onun takma adı" takma adının da kaldırılacağını göreceksiniz.
mgaert

5

Bir indeksin eşlemelerini yeniden adlandırmanın veya değiştirmenin başka bir farklı yolu, logstash kullanarak yeniden indekslemektir. Logstash 2.1 yapılandırmasının bir örneğini burada bulabilirsiniz:

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
Yani bir Elasticsearch indeksini yeniden indekslemenin en iyi yolunun Logstash'ı kurmak ve sonra onu yeniden indekslemek için kullanmak olduğunu mu söylüyorsunuz? Biraz abartılı görünüyor, özellikle de Logstash'ı gerçekten istemiyorsanız / kullanmıyorsanız ...
M. Justin

Cevaptaki tek sorun "en iyi" kısmıdır. "Başka bir yol" derdim. Bunun dışında, bu iyi bir cevap.
Robert


-5

Birisinin hala ihtiyacı olması durumunda. Dizinleri yeniden adlandırmanın resmi değil başarılı yolu şunlardır:

  1. Yeniden adlandırılması gereken dizinleri kapatın
  2. Ana ve veri düğümlerinin tüm veri dizinlerinde dizin klasörlerini yeniden adlandırın.
  3. Eski kapalı dizinleri yeniden açın (kofp eklentisi kullanıyorum). Eski dizinler yeniden açılacak ancak atanmayacaktır. Yeni dizinler kapalı durumda görünecek
  4. Yeni dizinleri yeniden açın
  5. Eski dizinleri silin

Bu hatayı "sarkan dizin dizin adı şudur" alırsanız, tüm ana düğümlerdeki (veri düğümleri değil) dizin klasörünü kaldırın ve veri düğümlerinden birini yeniden başlatın.


2
Elastic tarafından kesinlikle cesareti kırıldı. Bunu yaparsanız yedeklerin olduğundan emin olun.
lucabelluccini

Veri dizininde indeks adının nerede göründüğünü anlamıyorum. / Var / lib / elasticsearch / nodes / 0 / indices / dizinlerine baktığımda, "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch sürüm 5.6.3) gibi rastgele oluşturulmuş
Johan Boulé

1
@ JohanBoulé, bu yöntem artık Elasticsearch'ün 5. sürümünden beri geçerli değil.
Anh Le

@lucabelluccini, kabul etti. Onları olduğu gibi bırakmak ve takma adlar kullanmak daha iyidir.
Anh Le
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.