Elasticsearch'teki kırıklar ve kopyalar


303

Elasticsearch'te parça ve replikanın ne olduğunu anlamaya çalışıyorum, ama anlayamadım. Elasticsearch'ü indirip komut dosyasını çalıştırırsam, bildiğim kadarıyla tek düğümlü bir küme başlattım. Şimdi bu düğümün (bilgisayarım) 5 parçası (?) Ve bazı kopyaları (?) Var.

Nedir bunlar, 5 endeks kopyası var mı? Öyleyse neden? Biraz açıklamaya ihtiyacım olabilir.



Ancak yine de soru cevapsız kalıyor.
LuckyLuke

Aldığınız yanıtı ve yukarıdaki bağlantılı cevabın bazı şeyleri netleştirmesi gerektiğini düşündüm. O zaman net olmayan ne var?
javanna

Bir kırığın ve kopyaların ne olduğunu anlamıyorum. Bir düğümde neden çok sayıda kırık ve replika olduğunu anlamıyorum.
LuckyLuke

1
Verileri dağıtabilmek için her dizin parçalara bölünebilir. Kırık, bir dizinin atomik kısmıdır ve daha fazla düğüm eklerseniz kümeye dağıtılabilir.
javanna

Yanıtlar:


966

Gerçek bir örnekle açıklamaya çalışacağım, çünkü aldığınız cevap ve cevaplar size yardımcı görünmüyor.

Elasticsearch'ü indirip başlattığınızda, varsa mevcut bir kümeye katılmaya çalışan veya yeni bir küme oluşturan bir elasticsearch düğümü oluşturursunuz. Diyelim ki yeni başladığınız tek bir düğmeyle kendi yeni kümenizi oluşturdunuz. Verimiz yok, bu nedenle bir dizin oluşturmamız gerekiyor.

Bir indeks oluşturduğunuzda (ilk dokümanı da indekslediğinizde otomatik olarak bir indeks oluşturulur) kaç kırıktan oluşacağını tanımlayabilirsiniz. Bir sayı belirtmezseniz, varsayılan parça sayısı: 5 primer olacaktır. Bunun anlamı ne?

Bu, elasticsearch'in verilerinizi içerecek 5 birincil parça oluşturacağı anlamına gelir:

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

Bir dokümanı her indekslediğinizde, elasticsearch, hangi birincil kırığın o dokümanı tutması gerektiğine karar verir ve orada dizine ekler. Birincil parçalar verilerin bir kopyası değildir, verilerdir! Birden fazla parçaya sahip olmak, tek bir makinede paralel işlemeden yararlanmaya yardımcı olur, ancak asıl mesele, aynı kümede başka bir elasticsearch örneği başlatırsak, parçaların küme üzerinde eşit bir şekilde dağıtılacağıdır.

Düğüm 1 daha sonra örneğin sadece üç parça tutacaktır:

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

Kalan iki kırık yeni başlayan düğüme taşındığından:

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

Bu neden oluyor? Elasticsearch dağıtılmış bir arama motoru olduğundan ve büyük miktarda veriyi yönetmek için birden fazla düğüm / makineden yararlanabilirsiniz.

Her elasticsearch indeksi, verilerin saklandığı yer olduğu için en az bir birincil parçadan oluşur. Bununla birlikte, her parça bir maliyete sahiptir, bu nedenle tek bir düğümünüz varsa ve öngörülebilir bir büyümeniz yoksa, tek bir birincil parçaya sadık kalın.

Başka bir kırık türü de bir kopyadır. Varsayılan 1'dir, yani her birincil parça aynı verileri içeren başka bir parçaya kopyalanır. Çoğaltmalar arama performansını artırmak ve başarısızlık için kullanılır. Bir çoğaltma parçası hiçbir zaman ilgili birincilin bulunduğu düğümde tahsis edilmeyecektir (orijinal verilerle aynı diske yedek koymak gibi bir şey olacaktır).

Örneğimize geri dönelim, 1 çoğaltma ile her düğümde tüm dizine sahip olacağız, çünkü ilk düğümde 2 çoğaltma parçası ayrılacak ve ikinci düğümdeki birincil parçalarla tamamen aynı verileri içereceklerdir:

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

Birinci düğümdeki birincil kırıkların bir kopyasını içerecek olan ikinci düğüm için aynı:

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

Bunun gibi bir kurulumla, bir düğüm aşağı inerse, tüm dizine sahip olursunuz. Çoğaltma parçaları otomatik olarak primer olur ve düğüm başarısızlığına rağmen küme düzgün şekilde çalışır:

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

Sahip olduğunuzdan "number_of_replicas":1, kopyalar hiçbir zaman birincil öğelerinin bulunduğu düğümde ayrılmadığından atanamaz. Eğer 5 atanmamış kırıkları, kopyaları gerekecek ve küme durumu olacak yüzden YELLOWyerine GREEN. Veri kaybı yok, ancak bazı parçalar atanamayacağı için daha iyi olabilir.

Kalan düğüm yedeklendiğinde, kümeye tekrar katılacak ve kopyalar yeniden atanacaktır. İkinci düğümdeki varolan kırık yüklenebilir, ancak düğüm çalışmıyorken yazma işlemleri büyük olasılıkla gerçekleştiği için diğer kırıklarla eşitlenmeleri gerekir. Bu işlemin sonunda, küme durumu olur GREEN.

Umarım bu sizin için bir şeyleri açıklığa kavuşturur.


57
Harika açıklama, bir araya getirmek için zaman ayırdığınız için teşekkürler! :)
LuckyLuke

6
Bu parça / çoğaltma kavramının en iyi açıklamasıdır. Çok teşekkürler :)
Frank Förster

1
@javanna Büyük açıklama, çoklu kümeler ve nasıl çalıştıkları hakkında biraz konuşabilir miyiz?
raffian

3
Aşağı inen düğüm tekrar yükseldiğinde ne olacağını daha fazla açıklamayı önerebilir miyim?
c0dem4gnetic

1
Öğretir misin? Çünkü tamamen yapmalısın. Harikasın. Ancak @Animesh Pandey'nin sorduğu gibi, iki kopya veya 3 düğümlü 1 çoğaltma ile ne olacağını merak ediyorum.
ayaz

24

Bir indeks onları dağıtmak ve ölçeklendirmek için parçalara ayrılır.

Çoğaltmalar, parçaların kopyalarıdır ve bir düğüm kaybolursa güvenilirlik sağlar. Çoğaltma sayısı == 1, kümenin yeşil durumda olması için parçanın ana ve çoğaltılmış bir kopyasına sahip olması gerektiği için bu sayıda genellikle karışıklık vardır.

Çoğaltmaların oluşturulması için kümenizde en az 2 düğümün olması gerekir.

Tanımları burada daha kolay bulabilirsiniz: http://www.elasticsearch.org/guide/reference/glossary/

Saygılarımla, Paul


Her belgenin söylediği şey budur - dizin kırıklara ayrılmıştır, ancak dizin gerçekte ne içerir?
Alex Pryiomka

@AlexPryiomka, Endeks veri içeriyor
Gaurav

Yani temelde kafka dünyasındaki bölüm-çoğaltma ile aynı mı?
beatrice

19

Eğer gerçekten sarı görmek istemiyorsanız. çoğaltma sayısını sıfır olarak ayarlayabilirsiniz:

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

Bunu yalnızca yerel geliştirme kutunuzda yapmanız gerektiğini unutmayın.


10

Shard:

  1. Dağıtılmış arama sunucusu olarak, dizin belgelerini tüm düğümlere dağıtmak için ElasticSearchçağrılan kavramı kullanır Shard.
  2. Bir indexpotansiyel olarak bir donanımın donanım sınırlarını aşan büyük miktarda veri depolayabilirsingle node
  3. Örneğin, 1 TB disk alanı kaplayan bir milyar belgenin tek bir dizini, tek bir düğümün diskine sığmayabilir veya tek bir düğümden arama isteklerini sunmak için çok yavaş olabilir.
  4. Bu sorunu çözmek Elasticsearchiçin, endeksinizi adlı birden fazla parçaya bölme olanağı sağlar shards.
  5. Bir dizin oluşturduğunuzda, istediğiniz numarayı tanımlayabilirsiniz shards .
  6. Documentssaklanır shardsve kırıkları tahsis edilir nodesde senincluster
  7. Senin gibi clusterbüyür veya küçülür, Elasticsearchirade arasında otomatik olarak geçirmek kırıkları nodes, böylece clusterkalıntıları dengeli.
  8. Bir parça ya a primary shardya da a olabilir replica shard.
  9. Dizininizdeki her belge a'ya aittir single primary shard, bu nedenle sahip olduğunuz birincil kırıkların sayısı, dizininizin alabileceği maksimum veri miktarını belirler
  10. A replica shardsadece birincil kırığın bir kopyasıdır.

kopya:

  1. Replica shardprimary Sharddonanım arızası durumunda veri kaybını önlemek için kopyasıdır .
  2. Elasticsearchdizininizin parçalarının bir veya daha fazla kopyasını çoğaltma parçaları olarak adlandırmanıza veya replicaskısaca kopyalamanıza olanak tanır .
  3. Bir indexde veya daha fazla kez (hayır kopyaları anlamında) sıfır çoğaltılabilir.
  4. number of shardsVe kopyaları endeksi oluşturulduğu an endeksi başına tanımlanabilir.
  5. Dizin oluşturulduktan sonra, yineleme sayısını istediğiniz zaman dinamik olarak değiştirebilirsiniz cannot change the number of shards .
  6. Varsayılan olarak, her dizine Elasticsearch5 birincil Parça ayrılır ve 1 replicabu da kümenizde en az iki düğümünüz varsa, dizininizde 5 birincil parça ve başka bir 5 çoğaltma parçası (1 tam çoğaltma) olacağı anlamına gelir. indeks.

6

Bir indeks onları dağıtmak ve ölçeklendirmek için parçalara ayrılır.

Kopyalar, parçaların kopyalarıdır.

Düğüm, bir kümeye ait çalışan elastik bir arama örneğidir.

Bir küme, aynı küme adını paylaşan bir veya daha fazla düğümden oluşur. Her kümede, küme tarafından otomatik olarak seçilen ve geçerli ana düğüm başarısız olursa değiştirilebilen tek bir ana düğüm bulunur.


Üç AWS ec2eşgörünüm var, her birinde elasticsearch yüklü. Burada üç düğümümüz mü var? Tüm bu düğümler aynı cluster.name: testözellik kümesine sahipse test, üç düğüme sahip bir Küme adı oluşturur mu?
TheCoder

5

Bunu gerçek bir kelime senaryosu kullanarak açıklayacağım. Bir e-ticaret sitesi işlettiğinizi düşünün. Daha popüler hale geldikçe daha fazla satıcı ve ürün web sitenize ekleyin. İndekslemeniz gerekebilecek ürün sayısının arttığını ve bir düğümün bir sabit diskine sığmayacak kadar büyük olduğunu fark edeceksiniz. Sabit diske sığsa bile, bir makinedeki tüm belgeler arasında doğrusal arama yapmak son derece yavaştır. bir düğümdeki bir dizin, elastik aramaların çalıştığı dağıtılmış küme yapılandırmasından yararlanmaz.

Böylece elasticsearch dizindeki belgeleri kümedeki birden çok düğüme böler. Belgenin her bir parçasına "kırık" adı verilir. Bir belgenin parçasını taşıyan her düğümün belgenin yalnızca bir alt kümesi olur. varsayalım 100 ürün ve 5 parça, her parça 20 ürün olacak. Bu veri parçalanması, elastik aramada düşük gecikmeli aramayı mümkün kılan şeydir. arama birden fazla düğüm üzerinde paralel olarak yapılır. Sonuçlar toplanır ve döndürülür. Ancak kırıklar hataya dayanıklılık sağlamaz. Yani, parçayı içeren herhangi bir düğüm bozulursa, küme sağlığı sarı olur. Yani bazı veriler mevcut değildir.

Arıza toleransını artırmak için kopyalar resme gelir. Deault elastik arama ile her kırığın tek bir kopyasını oluşturur. Bu kopyalar her zaman birincil kırığın bulunmadığı başka bir düğümde oluşturulur. Bu nedenle, sistem hatasına toleranslı hale getirmek için, kümenizdeki düğüm sayısını artırmanız gerekebilir ve bu da dizininizin parçalarının sayısına bağlıdır. Çoğaltmalara ve parçalara dayalı olarak gerekli düğüm sayısını hesaplamak için genel formül "düğüm sayısı = kırık sayısı * (çoğaltma sayısı + 1)" dir. Standart uygulamada hata toleransı için en az bir çoğaltma vardır.

Kırıkların sayısını ayarlamak statik bir işlemdir, yani bir dizin oluştururken belirtmeniz gerekir. Bu woulf'tan sonraki herhangi bir değişiklik, verilerin tamamen yeniden endekslenmesini gerektirir ve zaman alır. Ancak, çoğaltma sayısını ayarlamak dinamik bir işlemdir ve dizin oluşturulduktan sonra herhangi bir zamanda yapılabilir.

aşağıdaki komutla dizininiz için kırık ve kopya sayısını ayarlayabilirsiniz.

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

3

Bir cevap değil , ElastikSearch için temel kavramlar için başka bir referans ve bence @ javanna'nın cevabına iltifat olarak oldukça açıklar.

Kırıklar

Bir dizin potansiyel olarak tek bir düğümün donanım sınırlarını aşabilecek büyük miktarda veri depolayabilir. Örneğin, 1 TB disk alanı kaplayan bir milyar belgenin tek bir dizini, tek bir düğümün diskine sığmayabilir veya tek bir düğümden arama isteklerini sunmak için çok yavaş olabilir.

Bu sorunu çözmek için Elasticsearch, indeksinizi parça adı verilen birden fazla parçaya bölme olanağı sağlar. Bir dizin oluşturduğunuzda, istediğiniz kırık sayısını tanımlayabilirsiniz. Her parça kendi içinde, kümedeki herhangi bir düğümde barındırılabilen tamamen işlevsel ve bağımsız bir "dizin" dir.

Parçalama iki temel nedenden dolayı önemlidir:

  • İçerik hacminizi yatay olarak ayırmanıza / ölçeklendirmenize olanak tanır .
  • İşlemleri kırıklar arasında (potansiyel olarak birden çok düğümde) dağıtmanıza ve paralelleştirmenize olanak tanır, böylece performansı / verimi artırır .

Çoğaltılan

Arızaların her zaman beklenebileceği bir ağ / bulut ortamında, bir kırığın / düğümün bir şekilde çevrimdışı olması veya herhangi bir nedenle kaybolması durumunda yük devretme mekanizmasına sahip olması çok yararlıdır ve şiddetle tavsiye edilir. Bu amaçla Elasticsearch, dizininizin parçalarının bir veya daha fazla kopyasını çoğaltma parçaları veya kısaca kopyalar haline getirmenize olanak tanır.

Çoğaltma iki temel nedenden dolayı önemlidir:

  • Bir kırık / düğüm başarısız olursa yüksek kullanılabilirlik sağlar . Bu nedenle, çoğaltma parçasının asla kopyalandığı orijinal / birincil parça ile aynı düğüme tahsis edilmediğine dikkat etmek önemlidir .
  • Aramalar tüm kopyalarda paralel olarak yapılabileceğinden arama hacminizi / iş hacminizi ölçeklendirmenize olanak tanır .

1

Elastik Arama'da, en üst düzeyde belgeleri dizinlere indeksleriz. Her indeks, verileri dahili olarak dağıtan parçalara sahiptir ve parçaların içinde, verilerin temel depolaması olan Lucene segmentleri bulunur. Dizin 5 parçaya sahipse, veri parçalara dağıtılmış demektir ve parçalara aynı veri yoktur.

ES'nin çekirdeğini açıklayan videoyu izleyin https://www.youtube.com/watch?v=PpX7J-G2PEo

Çoklu indeksler veya çoklu parçalar hakkında makale Elastik arama, birden fazla indeks bir endekse karşı ve farklı veri kümeleri için türler?


1

Elasticsearch , tüm kredilerinin dağıtılmış mimarisine gitmesi ile mükemmel bir şekilde ölçeklenebilir. Parçalama nedeniyle mümkün olur. Şimdi, daha ileriye gitmeden önce, basit ve çok yaygın bir kullanım durumunu ele alalım. Diyelim ki, çok fazla belge içeren bir dizininiz var ve basitlik açısından, bu dizinin boyutunun 1 TB olduğunu (yani, bu dizindeki her belgenin boyutlarının toplamı 1 TB olduğunu düşünelim) ). Ayrıca, her biri veri depolamak için 512 GB alana sahip iki Düğüme sahip olduğunuzu varsayın. Açıkça görülebileceği gibi, tüm dizinimiz mevcut iki düğümden hiçbirinde saklanamaz ve bu nedenle dizinimizi bu Düğümler arasında dağıtmamız gerekir.

Bir dizinin büyüklüğünün tek bir düğümün donanım sınırlarını aştığı durumlarda, Sharding kurtarmaya gelir. Parçalama, bu sorunu indeksleri daha küçük parçalara bölerek çözer ve bu parçalar Parçalar olarak adlandırılır.


0

En basit terimiyle, sharddiskte ayrı bir klasörde depolanan bir dizinin bir bölümünden başka bir şey değildir:

Elasticsearch parçaları

Bu ekran görüntüsü Elasticsearch dizininin tamamını gösterir.

Gördüğünüz gibi, tüm veriler datadizine girer .

Endeksi inceleyerek C-mAfLltQzuas72iMiIXNwbiz beş kırıkları (klasörler olduğunu görmekteyiz 0için 4).

Diğer yandan, JH_A8PgCRj-GK0GeQ0limwdizinde yalnızca bir parça ( 0klasör) vardır.

Elasticsearch parçaları

priKırıkların sayısı görür.

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.