bagaimana cara mengganti nama indeks di cluster?

110

Saya perlu mengganti nama beberapa indeks dalam sebuah cluster (nama mereka harus diubah, saya tidak dapat menggunakan alias ).

Saya melihat bahwa tidak ada cara yang didukung untuk melakukan itu, yang paling dekat yang saya temukan adalah mengganti nama direktori indeks , saya mencoba ini di cluster.

Kluster memiliki 3 mesin A, Bdan Cpecahannya direplikasi pada masing-masing mesin. Aku menutup elasticsearch pada A, nama /var/lib/elasticsearch/security/nodes/0/indices/oldindexnameuntuk /var/lib/elasticsearch/security/nodes/0/indices/newindexnamedan restart A.

Status cluster berwarna kuning dan elasticsearch melakukan sihir untuk memulihkan status yang benar. Setelah beberapa waktu saya berakhir dengan

  • oldindexnametersedia dan direplikasi sepenuhnya (dipulihkan dari Bdan Csaya kira)
  • newindexname sedang tersedia (saya dapat mencarinya) tetapi plugin head menunjukkan bahwa shard-nya berada dalam status "Belum ditetapkan" dan berwarna abu-abu (tidak direplikasi)

Selama pemulihan security.logmenunjukkan pesan berikut:

[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

Meskipun newindexnamedapat dicari, ini tentu tidak dalam keadaan normal.

Saya memutar kembali ke keadaan sebelumnya dengan menghapus newindexname. Cluster kembali menjadi hijau tanpa entri "Belum ditetapkan".

Mengingat itu, bagaimana saya bisa mengganti nama oldindexnamemenjadi newindexnamedalam sebuah cluster?

Catatan: solusi pamungkas yang ada dalam pikiran saya adalah menggulir-salin oldindexke newindexdan menghapus oldindexsesudahnya. Ini akan memakan waktu, jadi jika ada solusi yang lebih langsung, itu akan bagus.

WoJ
sumber

Jawaban:

19

Dimulai dengan ElasticSearch 7.4, metode terbaik untuk mengganti nama indeks adalah menyalin indeks menggunakan API Indeks Klon yang baru diperkenalkan , lalu menghapus indeks asli menggunakan API Hapus Indeks .

Keuntungan utama Clone Index API dibandingkan penggunaan Snapshot API atau Reindex API untuk tujuan yang sama adalah kecepatan, karena segmen hardlink Clone Index API dari indeks sumber ke indeks target, tanpa memproses ulang kontennya (pada sistem berkas yang mendukung tautan keras, jelas; jika tidak, berkas disalin pada tingkat sistem berkas, yang masih jauh lebih efisien daripada alternatif lainnya). Clone Index juga menjamin bahwa indeks target identik di setiap titik ke indeks sumber (yaitu, tidak perlu menyalin pengaturan dan pemetaan secara manual, bertentangan dengan pendekatan Reindex), dan tidak memerlukan konfigurasi direktori snapshot lokal .

Catatan samping: meskipun prosedur ini jauh lebih cepat daripada solusi sebelumnya, tetap saja menyiratkan waktu henti. Ada kasus penggunaan nyata yang membenarkan penggantian nama indeks (misalnya, sebagai langkah dalam alur kerja terpisah, menyusut, atau cadangan), tetapi mengganti nama indeks tidak boleh menjadi bagian dari operasi sehari-hari. Jika alur kerja Anda memerlukan penggantian nama indeks yang sering, Anda harus mempertimbangkan untuk menggunakan Alias ​​Indeks sebagai gantinya.

Berikut adalah contoh dari urutan lengkap operasi untuk mengubah nama indeks source_indexke target_index. Ini dapat dijalankan menggunakan beberapa konsol khusus ElasticSearch, seperti yang terintegrasi di Kibana . Lihat inti ini untuk versi alternatif dari contoh ini, dengan menggunakan curlkonsol Pencarian Elastis.

# 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
jwatkins.dll
sumber
163

Anda dapat menggunakan REINDEX untuk melakukan itu.

Indeks ulang tidak mencoba menyiapkan indeks tujuan. Itu tidak menyalin pengaturan indeks sumber. Anda harus menyiapkan indeks tujuan sebelum menjalankan tindakan _reindex, termasuk menyiapkan pemetaan, jumlah shard, replika, dll.

  1. Pertama-tama salin indeks ke nama baru
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Sekarang hapus Indeks
DELETE /twitter
reto
sumber
Meskipun ini memerlukan ruang untuk kedua indeks (sementara), ini sederhana dan sepenuhnya ada di server - jadi ini tampaknya menjadi solusi terbaik sejauh ini (meskipun dokumen memperingatkan tentang status 'eksperimental'). Terima kasih.
WoJ
2
Apakah ini berfungsi jika pemetaan sudah _source: {enabled: false}?
Harald
2
@Harald No, _reindexgunakan _sourcesebagai data dokumen asli.
Agop
6
Sejauh yang saya tahu, ini tidak akan menyalin pemetaan twitterke new_twitter.
Nick
3
Saya setuju dengan solusi _reindex, tetapi pertanyaannya harus diubah. Mengindeks ulang bukan sekadar mengganti nama. Ia bahkan dapat mengubah cara data diindeks.
lucabelluccini
62

Untuk mengganti nama indeks Anda, Anda dapat menggunakan modul Elasticsearch Snapshot.

Pertama, Anda harus mengambil snapshot dari indeks Anda. Saat memulihkannya, Anda dapat mengganti nama indeks Anda.

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

rename_replacement: -Nama indeks baru di mana Anda ingin membuat cadangan data Anda.

krishna kumar
sumber
4
Holycrap, itu sangat berguna. Terima kasih!
Chris Cogdon
1
Jauh lebih baik daripada solusi yang diterima! Ini sebenarnya adalah salinan indeks biner, jadi tidak ada risiko kehilangan apa pun dan tidak perlu _sourcediaktifkan di indeks. Saya telah mengganti nama beberapa indeks multi-TB dengan cara ini tanpa masalah.
Jaket
2
@Jacket - Saya senang mengetahui bahwa jawaban saya sangat membantu Anda.
krishna kumar
1
Saya setuju, solusi yang jauh lebih baik, tidak ada masalah kehilangan data, juga LEBIH CEPAT untuk indeks besar daripada pengindeksan ulang
Romain Hautefeuille
1
apakah itu mempertahankan pemetaan?
Amogh Mishra
5

Karena itu tidak ada metode langsung untuk menyalin atau mengganti nama indeks di ES (saya melakukan pencarian ekstensif untuk proyek saya sendiri)

Namun pilihan yang sangat mudah adalah dengan menggunakan alat migrasi populer [Elastic-Exporter].

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

[NB: ini bukan blog saya, baru saja menemukan dan menganggapnya bagus]

Dengan demikian Anda dapat menyalin indeks / tipe dan kemudian menghapus yang lama.

lazywiz
sumber
Tautan tidak berfungsi lagi. Adakah tempat lain yang dapat kami temukan atau dapatkan info ini?
elachell
5

Jika Anda tidak dapat REINDEX, solusinya adalah dengan menggunakan alias . Dari dokumentasi resmi :

API di elasticsearch menerima nama indeks saat bekerja pada indeks tertentu, dan beberapa indeks jika berlaku. API alias indeks memungkinkan untuk membuat alias indeks dengan nama, dengan semua API secara otomatis mengubah nama alias menjadi nama indeks sebenarnya. Alias ​​juga dapat dipetakan ke lebih dari satu indeks, dan saat menentukannya, alias secara otomatis akan diperluas ke indeks alias. Alias ​​juga dapat dikaitkan dengan filter yang secara otomatis akan diterapkan saat mencari, dan nilai rute. Alias ​​tidak boleh memiliki nama yang sama dengan indeks.

Ketahuilah bahwa solusi ini tidak berfungsi jika Anda menggunakan fitur Lainnya Seperti Ini. https://github.com/elastic/elasticsearch/issues/16560

Leo
sumber
1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).Oleh @WoJ
Thales P
Alias ​​alasan tidak akan berfungsi : Menggunakan alias mengharuskan Anda merencanakan ke depan dan membuat nama indeks asli as an aliaske indeks asli. Kemudian Anda dapat membuat nama alias baru dan menggunakan kembali nama alias lama untuk sesuatu yang lain. Tetapi Anda kehilangan akses ke old_data jika Anda hanya memiliki real_index, membuat alias, menghapus real_index lama. Alias ​​itu sekarang tidak menunjukkan apa-apa.
Jesse Chisholm
@JesseChrisholm Saya pikir seseorang tidak dapat memiliki "alias yang tidak menunjukkan apa-apa". Coba hapus real_index, Anda akan melihat bahwa alias "alias untuk itu" juga akan dihapus.
mgaert
5

Cara lain yang berbeda untuk mengganti nama atau mengubah pemetaan untuk indeks adalah dengan mengindeks ulang menggunakan logstash. Berikut adalah contoh konfigurasi 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"
 }
}
Gabriel Rosca
sumber
4
Jadi, menurut Anda cara terbaik untuk mengindeks ulang indeks Elasticsearch adalah dengan menginstal Logstash, lalu menggunakannya untuk mengindeks ulang? Tampaknya sedikit berlebihan, terutama jika Anda tidak benar-benar ingin / penggunaan Logstash ...
M. Justin
Satu-satunya masalah dalam jawaban ini adalah bagian "yang terbaik". Saya akan mengatakan "Cara lain '. Selain itu, ini adalah jawaban yang bagus.
Robert
-5

Kalau-kalau ada yang masih membutuhkannya. Cara yang berhasil, tidak resmi, untuk mengganti nama indeks adalah:

  1. Tutup indeks yang perlu diganti namanya
  2. Ubah nama folder indeks di semua direktori data master dan node data.
  3. Buka kembali indeks tertutup lama (saya menggunakan plugin kofp). Indeks lama akan dibuka kembali tetapi tetap tidak ditetapkan. Indeks baru akan muncul dalam keadaan tertutup
  4. Buka kembali indeks baru
  5. Hapus indeks lama

Jika Anda mendapatkan kesalahan ini "nama direktori indeks menjuntai", hapus folder indeks di semua node master (bukan node data), dan restart salah satu node data.

Anh Le
sumber
2
Sangat tidak disarankan oleh Elastic. Pastikan untuk memiliki cadangan jika Anda melakukannya.
lucabelluccini
Saya tidak mengerti di mana nama indeks muncul di direktori data. Ketika saya melihat di / var / lib / elasticsearch / node / 0 / indices / nama direktori dibuat secara acak, seperti "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch versi 5.6.3)
Johan Boulé
1
@ JohanBoulé, metode ini tidak lagi valid sejak Elasticsearch versi 5.
Anh Le
@lucabelluccini, setuju. Lebih baik biarkan saja apa adanya dan gunakan alias.
Anh Le