MongoDB'de Sharding Ve Replikasyon Arasındaki Fark


77

Sadece Sharding ve Replication hakkında kafa karıştırıcı olduklarını düşünüyorum.

Çoğaltma: MongoDB'de ayarlanan bir kopya, aynı veri kümesini koruyan bir grup mongod işlemidir.

Sharding: Sharding, birden fazla makinede veri depolamak için bir yöntemdir.

Anladığım kadarıyla 75 GB veri varsa çoğaltmayla (3 sunucu) veri depolarsa, her sunucuda 75 GB veri depolar, Sunucu-1'de 75GB, sunucu-2'de 75GB ve sunucu-3'te 75GB. eğer hatalıysam) .. ve paylaşarak sunucu-1'de 25GB veri, sunucu-2'de 25GB veri ve sunucu-3'te 25GB veri olarak depolanacak. (Sağ?) ... fakat sonra bu satırda karşılaştığım öğretici

Parçalar verileri saklar. Yüksek kullanılabilirlik ve veri tutarlılığı sağlamak için, bir üretim bölümlenmiş kümesinde, her parça bir kopya kümesidir

Replica set 75GB'lık olmasına rağmen, shard 25GB'ydi, o zaman nasıl eşdeğer olabiliyorlardı ... Bu beni çok şaşırtıyor ... Sanırım bunda harika bir şey eksik. Lütfen bana bu konuda yardımcı olun.

Yanıtlar:


111

Bir Çoğaltma Kümesi , her biri birbirinin tüm verilerini yansıtan birden fazla MongoDB örneği bulunduğunuz anlamına gelir. Bir kopya seti bir Master ("Birincil" olarak da bilinir) ve bir veya daha fazla Slave'den (aka İkincil) oluşur. Okuma işlemleri herhangi bir bağımlı tarafından yapılabilir, böylece çoğaltma setine daha fazla bağımlı ekleyerek okuma performansını artırabilirsiniz (müşteri uygulamanız gerçekten farklı üyeler kullanabiliyorsa). Ancak, yazma işlemleri her zaman kopya kümesinin efendisinde gerçekleşir ve daha sonra kölelere yayılır, böylece daha fazla köle eklediğinizde yazma işlemi daha hızlı gerçekleşmez.

Çoğaltma setleri de hata toleransı sunar. Çoğaltma grubunun üyelerinden biri aşağı indiğinde diğerleri devraldı. Master düştüğünde, köleler yeni bir master seçeceklerdir. Bu nedenle , üretken dağıtımın her zaman en az üç sunucunun çoğaltma kümesi olarak MongoDB'yi kullanması önerilir ; bunlardan ikisi veri tutar (üçüncüsü, yeni bir ana makineyi belirlemek için gerekli olan veri içermeyen bir "hakemdir") kölelerden biri aşağı iner).

Kesikli Bir Küme , kümenin her bir parçasının (aynı zamanda bir çoğaltma kümesi de olabilir) verilerin bir bölümünü karşıladığı anlamına gelir. Hem okuyan hem de yazan her istek, verilerin bulunduğu küme tarafından yerine getirilir. Bu, bir kümeye daha fazla kırık eklenerek hem okuma hem de yazma performansının arttırılabileceği anlamına gelir. Hangi belgenin üzerinde bulunduğu hangi belge , her bir koleksiyonun shard anahtarıyla belirlenir . Verilerin tüm kümelere eşit olarak dağıtılabileceği şekilde seçilmelidir ve böylece shard anahtarının bulunduğu en yaygın sorgular için açıktır (örneğin: sık user_namesorduğunuzda, shard anahtarınız alan, user_nameböylece her sorgu yalnızca bu belgeye sahip olan bir gruba devredilebilir).

Dezavantajı, hata toleransının zarar görmesidir. Bir kümenin bir parçası düştüğünde, onun üzerindeki hiçbir veriye erişilemez. Bu nedenle, kümenin her bir üyesi aynı zamanda bir kopya kümesi olmalıdır. Bu gerekli değil. Yüksek kullanılabilirliği umursamıyorsanız, bir kırılma, çoğaltmadan tek bir mongod örneği de olabilir . Ancak üretimde kullanmak için her zaman çoğaltma kullanmalısınız .

Peki bu sizin örneğiniz için ne anlama geliyor?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

75 GB'lık verilerinizi her biri 25 GB'lik 3 parçaya bölmek istediğinizde, üç çoğaltma kümesinde organize edilmiş en az 6 veritabanı sunucusuna ihtiyacınız vardır. Her kopya grubu, aynı 25 GB veriye sahip iki sunucudan oluşur.

Ayrıca üç kopya setinin hakemleri için sunucuların yanı sıra, mongos yönlendiricisini ve küme için config sunucusunu da kullanabilirsiniz. Hakemler çok hafiftir ve sadece bir kopya setinin düştüğü durumlarda gereklidir, bu yüzden genellikle aynı donanımı başka bir şeyle paylaşabilirler. Ancak Moğol yönlendiricisi ve config sunucusu yedekli olmalı ve kendi sunucularında olmalıdır.


2
Ayrıntılı cevap için çok teşekkür ederim ... bir soru daha ... eğer bir yazma ya da okuma işlemi gerçekleştirilirken birincil kapalıysa o zaman ..1) ikincillerden birincil seçmenin gecikmesi nedir ve 2) Bu gecikme sırasında veriler geçici olarak nerede saklanacak?
Saad Saadi

4
@SaadSaadi Birincil seçim süreci belgelerde açıklanmıştır . Sekonderlerin birincil düştüğünü fark etmeleri 10 ila 12 saniye sürer. İlk seçimin kendisi genellikle sadece milisaniyeyi alacak. Çoğaltma kümesi birincil değilken salt okunurdur. Bu süre içinde uygulamalardan veri yazma girişimleri başarısız olacaktır.
Philipp

1
@Philipp: Sadece iki yorum: (1) parça anahtarı değiştirilemez (yani farklı bir anahtar kullanarak parçalayamazsınız) ve (2) kopya setinin ikincil düğümlerinden okuyabilirsiniz, ancak tutarlılık yazma konusundaki endişeye bağlıdır (in Tutarlı olmak için, w seçeneğinin, uygun olmayan çoğaltma kümesine eşit olması gerekir, çünkü her bir kırılma, kasıtlı olarak veya düğüm hataları nedeniyle farklı çoğaltma küme boyutlarına sahip olabilir).
Mike Argyriou

@Philipp üzerinde soruları takip ayrıca answer misiniz dba.stackexchange.com/questions/208482/... ?
user3198603

18
  • Keskinleştirme , veri kümesini ayrı bölümlere ayırır .
  • Çoğaltma veri kümesini çoğaltır.

Bu iki şey farklı olduklarından istiflenebilir. Her ikisini de kullanarak, veri kümenizi birden fazla kopya grubuna ayırdığınız anlamına gelir. Başka bir deyişle, parçaları koparın; parçaları olmayan bir veri seti, tek bir 'shard'.

Üç parçalı ve 3 kopya içeren bir Mongo kümesi 9 düğüm alacaktır.

  • 3 kümeli 3 düğümlü kopyalar.
  • Her kopya setinde tek bir parça var.

Büyük bir dosya için, bir shard'a mı yoksa birden fazla shard'a mı (yani düğümlerin karşısına) depolanıyor mu?
Tony,

MongoDB 3.4 veya daha yüksek sürümlerde, yapılandırma için mongoDB sunucularına ve mongos yönlendiricisi olarak çalışmak için ek bir sunucuya ihtiyacınız olacağını unutmayın. Bu, örneğinizdeki 3x3 kümenin toplamını toplam 13 sunucuya getirir.
dthrasher

9

By Kırma işleminde , birkaç parça halinde toplama bölün. Veritabanınızı
çoğaltmak , veri kümenizin aynalarını yaptığınız anlamına gelir.


4

Gönderilen işlevsellik açısından. Paylaşım ölçeklenebilirlik ve paralellik sağlar Çoğaltma kullanılabilirliği sağlar


hayır, çoğaltma da yalnızca okumaların yazdıklarından çok daha sık olduğu verilen ölçeklenebilirliği ve paralellik sağlar
Kristóf Szalay
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.