Pecahan dan replika di Elasticsearch


303

Saya mencoba memahami apa itu shard dan replika di Elasticsearch, tetapi saya tidak berhasil memahaminya. Jika saya mengunduh Elasticsearch dan menjalankan skrip, maka dari apa yang saya tahu saya telah memulai sebuah cluster dengan satu node. Sekarang node ini (PC saya) memiliki 5 pecahan (?) Dan beberapa replika (?).

Apa mereka, apakah saya memiliki 5 duplikat indeks? Jika demikian mengapa? Saya perlu penjelasan.



Namun pertanyaannya tetap tidak terjawab.
LuckyLuke

Saya pikir jawaban yang Anda dapatkan dan jawaban terkait di atas harus mengklarifikasi hal-hal. Apa yang tidak jelas?
javanna

Saya tidak mengerti apa itu pecahan dan replika. Saya tidak mengerti mengapa ada banyak pecahan dan replika pada satu simpul.
LuckyLuke

1
Setiap indeks dapat dibagi menjadi pecahan untuk dapat mendistribusikan data. Beling adalah bagian atom dari indeks, yang dapat didistribusikan melalui cluster jika Anda menambahkan lebih banyak node.
javanna

Jawaban:


966

Saya akan mencoba menjelaskan dengan contoh nyata karena jawaban dan balasan yang Anda miliki sepertinya tidak membantu Anda.

Ketika Anda mengunduh elasticsearch dan memulainya, Anda membuat simpul elasticsearch yang mencoba untuk bergabung dengan kluster yang ada jika tersedia atau membuat yang baru. Katakanlah Anda membuat cluster baru Anda sendiri dengan satu simpul, yang baru saja Anda mulai. Kami tidak memiliki data, oleh karena itu kami perlu membuat indeks.

Ketika Anda membuat indeks (indeks secara otomatis dibuat saat Anda mengindeks dokumen pertama juga) Anda dapat menentukan berapa banyak pecahan itu akan terdiri dari. Jika Anda tidak menentukan nomor, nomor itu akan memiliki jumlah standar pecahan: 5 primer. Apa artinya?

Ini berarti elasticsearch akan membuat 5 pecahan utama yang akan berisi data Anda:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Setiap kali Anda mengindeks dokumen, elasticsearch akan memutuskan pecahan utama mana yang seharusnya menyimpan dokumen itu dan akan mengindeksnya di sana. Pecahan primer bukan salinan data, melainkan data! Memiliki banyak pecahan memang membantu mengambil keuntungan dari pemrosesan paralel pada satu mesin, tetapi intinya adalah bahwa jika kita memulai contoh elasticsearch lain pada kluster yang sama, pecahan akan didistribusikan secara merata di atas kluster.

Node 1 kemudian akan menampung misalnya hanya tiga pecahan:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

Karena dua pecahan yang tersisa telah dipindahkan ke simpul yang baru dimulai:

 ____    ____
| 4  |  | 5  |
|____|  |____|

Mengapa ini terjadi? Karena elasticsearch adalah mesin pencari terdistribusi dan dengan cara ini Anda dapat menggunakan beberapa node / mesin untuk mengelola data dalam jumlah besar.

Setiap indeks elasticsearch terdiri dari setidaknya satu beling primer karena di situlah data disimpan. Namun, setiap beling berharga mahal, jadi jika Anda memiliki satu simpul dan tidak ada pertumbuhan yang dapat diperkirakan, tetap gunakan beling primer tunggal.

Jenis beling lain adalah replika. Standarnya adalah 1, artinya setiap pecahan primer akan disalin ke pecahan lain yang akan berisi data yang sama. Replika digunakan untuk meningkatkan kinerja pencarian dan untuk kegagalan. Sebuah replika shard tidak akan pernah dialokasikan pada simpul yang sama di mana primer terkait adalah (itu akan seperti meletakkan cadangan pada disk yang sama dengan data asli).

Kembali ke contoh kita, dengan 1 replika kita akan memiliki seluruh indeks pada setiap simpul, karena 2 pecahan replika akan dialokasikan pada simpul pertama dan mereka akan berisi data yang persis sama dengan pecahan utama pada simpul kedua:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

Sama untuk simpul kedua, yang akan berisi salinan pecahan utama pada simpul pertama:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Dengan pengaturan seperti ini, jika sebuah simpul turun, Anda masih memiliki seluruh indeks. Pecahan replika akan secara otomatis menjadi pendahuluan dan cluster akan berfungsi dengan baik meskipun simpul gagal, sebagai berikut:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Karena sudah "number_of_replicas":1, replika tidak dapat ditetapkan lagi karena tidak pernah dialokasikan pada simpul yang sama di mana primernya. Itu sebabnya Anda akan memiliki 5 pecahan yang tidak ditetapkan, replika, dan status gugusnya YELLOWbukan GREEN. Tidak ada kehilangan data, tetapi bisa lebih baik karena beberapa pecahan tidak dapat ditugaskan.

Segera setelah simpul yang tersisa dicadangkan, itu akan bergabung dengan gugus lagi dan replika akan ditugaskan lagi. Shard yang ada pada node kedua dapat dimuat tetapi mereka harus disinkronkan dengan shard lainnya, karena operasi penulisan kemungkinan besar terjadi saat node sedang down. Pada akhir operasi ini, status cluster akan menjadi GREEN.

Semoga ini menjelaskan hal-hal untuk Anda.


57
Penjelasan yang luar biasa, terima kasih telah meluangkan waktu Anda untuk menyatukannya! :)
LuckyLuke

6
Itu adalah penjelasan terbaik dari konsep shard / replica. Terima kasih banyak :)
Frank Förster

1
@ Jayvan Penjelasan luar biasa, dapatkah Anda berbicara sedikit tentang multi kluster dan bagaimana cara kerjanya?
raffian

3
Bolehkah saya menyarankan untuk menjelaskan lebih lanjut apa yang akan terjadi ketika simpul yang turun muncul kembali?
c0dem4gnetic

1
Apakah kamu mengajar? Karena kamu benar-benar harus. Kamu keren. Tetapi ketika @Animesh Pandey bertanya, saya juga ingin tahu apa yang terjadi dengan dua replika, atau 1 replika dengan 3 simpul.
frostymarvelous

24

Indeks dipecah menjadi pecahan untuk mendistribusikan dan skala.

Replika adalah salinan pecahan dan memberikan keandalan jika sebuah simpul hilang. Sering ada kebingungan dalam angka ini karena jumlah replika == 1 berarti cluster harus memiliki salinan utama dan salinan beling yang tersedia untuk berada dalam keadaan hijau.

Agar replika dibuat, Anda harus memiliki setidaknya 2 node di cluster Anda.

Anda dapat menemukan definisi di sini lebih mudah untuk dipahami: http://www.elasticsearch.org/guide/reference/glossary/

Salam, Paul


Inilah yang dikatakan setiap dokumen - indeks dipecah menjadi pecahan, tetapi apa yang sebenarnya terkandung dalam indeks?
Alex Pryiomka

@AlexPryiomka, Indeks berisi data
Gaurav

Jadi pada dasarnya sama dengan replikasi partisi di dunia kafka?
beatrice

19

Jika Anda benar-benar tidak suka melihatnya berwarna kuning. Anda dapat mengatur jumlah replika menjadi nol:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'

Perhatikan bahwa Anda harus melakukan ini hanya pada kotak pengembangan lokal Anda.


10

Beling:

  1. Menjadi server pencarian terdistribusi, ElasticSearchmenggunakan konsep yang disebut Sharduntuk mendistribusikan dokumen indeks di semua node.
  2. Sebuah indexberpotensi menyimpan sejumlah besar data yang dapat melebihi batas perangkat keras asingle node
  3. Misalnya, indeks tunggal dari satu miliar dokumen yang menggunakan 1TB ruang disk mungkin tidak muat pada disk dari satu node atau mungkin terlalu lambat untuk melayani permintaan pencarian dari satu node saja.
  4. Untuk mengatasi masalah ini, Elasticsearchberikan kemampuan untuk membagi indeks Anda menjadi beberapa bagian yang disebut shards.
  5. Saat Anda membuat indeks, Anda dapat dengan mudah menentukan jumlah shards yang Anda inginkan.
  6. Documentsdisimpan di shards, dan pecahan dialokasikan ke nodesdalam Andacluster
  7. Saat Anda clustertumbuh atau menyusut, Elasticsearchsecara otomatis akan memigrasi pecahan antara nodessehingga clustertetap seimbang.
  8. Pecahan dapat berupa a primary shardatau a replica shard.
  9. Setiap dokumen dalam indeks Anda milik a single primary shard, sehingga jumlah pecahan utama yang Anda miliki menentukan jumlah maksimum data yang dapat disimpan oleh indeks Anda
  10. A replica shardhanyalah salinan pecahan utama.

Replika:

  1. Replica shardadalah salinan dari primary Shard, untuk mencegah kehilangan data jika terjadi kegagalan perangkat keras.
  2. Elasticsearchmemungkinkan Anda untuk membuat satu atau lebih salinan pecahan indeks Anda menjadi apa yang disebut pecahan replika, atau replicassingkatnya.
  3. Sebuah indexjuga dapat direplikasi nol (artinya tidak ada replika) kali atau lebih.
  4. The number of shardsdan replika dapat didefinisikan per indeks pada saat indeks dibuat.
  5. Setelah indeks dibuat, Anda dapat mengubah jumlah replika secara dinamis kapan saja, tetapi cannot change the number of shards setelahnya.
  6. Secara default, setiap indeks Elasticsearchdialokasikan 5 pecahan utama dan 1 replicayang berarti bahwa jika Anda memiliki setidaknya dua node di cluster Anda, indeks Anda akan memiliki 5 pecahan primer dan 5 pecahan replika lainnya (1 replika lengkap) dengan total 10 pecahan per indeks.

6

Indeks dipecah menjadi pecahan untuk mendistribusikan dan skala.

Replika adalah salinan pecahan.

Node adalah instance pencarian elastis yang dimiliki oleh sebuah cluster.

Cluster terdiri dari satu atau lebih node yang memiliki nama cluster yang sama. Setiap cluster memiliki satu master node yang dipilih secara otomatis oleh cluster dan yang bisa diganti jika master node saat ini gagal.


Saya punya tiga AWS ec2contoh, masing-masing memiliki elasticsearch diinstal di atasnya. Berarti kita punya tiga simpul di sini? Jika semua node ini memiliki cluster.name: testset properti yang sama , apakah akan membuat nama Cluster testyang akan memiliki tiga node?
TheCoder

5

Saya akan menjelaskan ini menggunakan skenario kata nyata. Bayangkan Anda menjalankan situs web e-niaga. Ketika Anda menjadi lebih populer, semakin banyak penjual dan produk yang ditambahkan ke situs web Anda. Anda akan menyadari bahwa jumlah produk yang perlu Anda indeks telah bertambah dan terlalu besar untuk dimasukkan ke dalam satu hard disk dari satu simpul. Bahkan jika itu cocok dengan hard disk, melakukan pencarian linear melalui semua dokumen dalam satu mesin sangat lambat. satu indeks pada satu node tidak akan mengambil keuntungan dari konfigurasi cluster terdistribusi di mana elasticsearch bekerja.

Jadi elasticsearch membagi dokumen dalam indeks di beberapa node dalam cluster. Masing-masing dan setiap bagian dokumen disebut pecahan. Setiap node yang membawa pecahan dokumen hanya akan memiliki sebagian dari dokumen tersebut. misalkan Anda memiliki 100 produk dan 5 pecahan, setiap pecahan akan memiliki 20 produk. Pecahan data inilah yang memungkinkan pencarian latensi rendah dimungkinkan dalam elasticsearch. pencarian dilakukan paralel pada banyak node. Hasil dikumpulkan dan dikembalikan. Namun pecahan tidak memberikan toleransi kesalahan. Berarti jika ada simpul yang mengandung pecahan, kesehatan cluster menjadi kuning. Berarti beberapa data tidak tersedia.

Untuk meningkatkan replika toleransi kesalahan datanglah ke gambar. Dengan membatalkan pencarian elastis menciptakan replika tunggal dari setiap pecahan. Replika ini selalu dibuat pada node lain di mana shard utama tidak berada. Jadi untuk membuat sistem toleran terhadap kesalahan, Anda mungkin harus meningkatkan jumlah node di cluster Anda dan itu juga tergantung pada jumlah pecahan indeks Anda. Rumus umum untuk menghitung jumlah node yang diperlukan berdasarkan replika dan pecahan adalah "jumlah node = jumlah pecahan * (jumlah replika + 1)". Praktik standar adalah memiliki setidaknya satu replika untuk toleransi kesalahan.

Menyiapkan jumlah pecahan adalah operasi statis, artinya Anda harus menentukannya saat membuat indeks. Setiap perubahan setelah itu akan memerlukan pengindeksan ulang data secara lengkap dan akan memakan waktu. Tetapi, pengaturan jumlah replika adalah operasi yang dinamis dan dapat dilakukan kapan saja setelah pembuatan indeks juga.

Anda dapat mengatur jumlah pecahan dan replika untuk indeks Anda dengan perintah di bawah ini.

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'

3

Bukan jawaban tetapi referensi lain untuk konsep inti ke ElasticSearch, dan saya pikir mereka cukup jelas sebagai pujian untuk jawaban @ javanna.

Pecahan

Indeks berpotensi menyimpan sejumlah besar data yang dapat melebihi batas perangkat keras dari satu node. Misalnya, indeks tunggal dari satu miliar dokumen yang menggunakan 1TB ruang disk mungkin tidak muat pada disk dari satu node atau mungkin terlalu lambat untuk melayani permintaan pencarian dari satu node saja.

Untuk mengatasi masalah ini, Elasticsearch menyediakan kemampuan untuk membagi indeks Anda menjadi beberapa bagian yang disebut pecahan. Saat Anda membuat indeks, Anda cukup menentukan jumlah pecahan yang Anda inginkan. Setiap beling itu sendiri merupakan "indeks" yang berfungsi penuh dan independen yang dapat di-host pada sembarang simpul dalam gugus.

Sharding penting karena dua alasan utama:

  • Ini memungkinkan Anda untuk secara horizontal membagi / skala volume konten Anda.
  • Ini memungkinkan Anda untuk mendistribusikan dan memparalelkan operasi lintas pecahan (berpotensi pada banyak node) sehingga meningkatkan kinerja / throughput .

Replika

Dalam lingkungan jaringan / cloud di mana kegagalan dapat terjadi kapan saja, sangat berguna dan sangat disarankan untuk memiliki mekanisme failover jika beling / node entah bagaimana offline atau menghilang karena alasan apa pun. Untuk tujuan ini, Elasticsearch memungkinkan Anda untuk membuat satu atau lebih salinan pecahan indeks Anda menjadi apa yang disebut replika pecahan, atau singkatnya replika.

Replikasi penting karena dua alasan utama:

  • Ini menyediakan ketersediaan tinggi jika beling / node gagal. Untuk alasan ini, penting untuk dicatat bahwa shard replika tidak pernah dialokasikan pada node yang sama dengan shard asli / primer yang disalin.
  • Hal ini memungkinkan Anda untuk memperkecil volume pencarian / throughput Anda karena pencarian dapat dilakukan pada semua replika secara paralel.

1

Di ElasticSearch, di tingkat teratas kami mengindeks dokumen menjadi indeks. Setiap indeks memiliki jumlah pecahan yang secara internal mendistribusikan data dan di dalam pecahan ada segmen Lucene yang merupakan penyimpanan inti data. Jadi jika indeks memiliki 5 pecahan itu berarti data telah didistribusikan di seluruh pecahan dan tidak ada data yang sama ke dalam pecahan.

Tonton video yang menjelaskan inti ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Artikel tentang beberapa indeks atau beberapa pecahan Pencarian elastis, beberapa indeks vs satu indeks, dan jenis untuk kumpulan data yang berbeda?


1

Elasticsearch memiliki skalabel yang luar biasa dengan semua kredit digunakan untuk arsitektur terdistribusi. Hal ini dimungkinkan karena Sharding. Sekarang, sebelum melangkah lebih jauh ke dalamnya, mari kita pertimbangkan kasus penggunaan yang sederhana dan sangat umum. Mari kita anggap, Anda memiliki indeks yang berisi banyak sekali dokumen, dan demi kesederhanaan, pertimbangkan bahwa ukuran indeks itu adalah 1 TB (yaitu, Jumlah ukuran masing-masing dan setiap dokumen dalam indeks itu adalah 1 TB ). Juga, asumsikan bahwa Anda memiliki dua Node masing-masing dengan 512 GB ruang yang tersedia untuk menyimpan data. Seperti dapat dilihat dengan jelas, seluruh indeks kami tidak dapat disimpan di salah satu dari dua simpul yang tersedia dan karenanya kami perlu mendistribusikan indeks kami di antara simpul-simpul ini.

Dalam kasus seperti ini di mana ukuran indeks melebihi batas perangkat keras dari satu node, Sharding datang untuk menyelamatkan. Sharding memecahkan masalah ini dengan membagi indeks menjadi potongan-potongan kecil dan potongan-potongan ini dinamai Shard.


0

Dalam istilah yang paling sederhana, shardini hanyalah bagian dari indeks yang disimpan pada disk di dalam folder yang terpisah:

Pecahan elasticsearch

Tangkapan layar ini menunjukkan seluruh direktori Elasticsearch.

Seperti yang Anda lihat, semua data masuk ke data direktori.

Dengan memeriksa indeks C-mAfLltQzuas72iMiIXNwkita melihat bahwa ia memiliki lima pecahan (folder 0untuk4 ).

Di sisi lain, JH_A8PgCRj-GK0GeQ0limwindeks hanya memiliki satu shard ( 0folder).

Pecahan elasticsearch

The primemandang jumlah pecahan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.