mongodb shard chunk göç 500GB 13 gün sürer - Bu yavaş veya normal mi?


9

Mongodb parça kümesi var, parça anahtarı karma. 2 adet kırık çoğaltma seti vardır. Her çoğaltma setinde 2 makine vardır.

Başka bir 2 kırık kopya kümesi ekleyerek bir deney yaptım ve yeniden dengelenmeye başlıyor.

Ancak, bir süre sonra yığın göçünün yavaş olması gerektiğini öğrendim. 1,4 GB veri taşımak 1 saat sürer.

Beni endişelendiriyor, bu da 500 GB yığın taşımayı tamamlamak için 13 gün beklemem gerektiği anlamına geliyor!

Ben bu konuda yeniyim ve yavaş, hızlı ya da normal olup olmadığını bir tanrım yok. Ama yine de, bu sayı beni ikna etmiyor.

Deneme ile ilgili ek notlar: - m3 orta aws makineleri kullanma - başka işlem yok, sadece yığın taşıma - başka yapılandırma olmadan varsayılan mongodb parçalama kurulumu - shardkey nesne kimliğinde karma (_id) kullanıyor - maksimum yığın boyutu 64MB

Yanıtlar:


10

Güncelleme: Nisan 2018

Bu cevap soru sırasında doğruydu, ancak o zamandan beri işler devam ediyor. 3.4 sürümünden beri paralellik tanıtıldı ve başlangıçta referans verdiğim bilet kapatıldı. Daha fazla bilgi için bu daha yeni cevaptaki bazı ayrıntıları ele alacağım . Cevabın geri kalanını olduğu gibi bırakacağım çünkü genel konular / kısıtlamalar için iyi bir referans olmaya devam ediyor ve eski bir sürümdeki herkes için geçerli.

Orijinal Yanıt

Eğer ilgilenirseniz M202 Advanced kursunda yığın göçü ile ilgili neler olduğunu tam olarak açıklarım . Genel olarak, göçlerin aktif bir sistemde çalıştığından emin olmak için yapılan temizlikler nedeniyle, boş parçalar için bile göçlerin çok hızlı olmadığını söyleyelim (dengeleme dışında hiçbir şey olmasa bile bunlar hala gerçekleşir).

Ayrıca, tüm kümede aynı anda yalnızca bir göç gerçekleşir - paralellik yoktur. Yani, iki "dolu" düğümünüz ve iki "boş" düğümünüz olmasına rağmen, herhangi bir zamanda en fazla bir göç gerçekleşir (en çok parça olan kırık ile en az olan parça arasında). Bu nedenle, 2 parça eklediğinizde, dengeleme hızı açısından hiçbir şey kazanmazsınız ve sadece taşınması gereken parça sayısını artırır.

Taşımaların kendileri için, parçalar muhtemelen ~ 30MiB boyutundadır (verileri nasıl doldurduğunuza bağlıdır, ancak genellikle bu, varsayılan maksimum yığın boyutuyla ortalamanız olacaktır). Bu db.collection.getShardDistribution()bilgilerin bir kısmına başvurabilir ve parçalarınız hakkında daha fazla bilgi edinmenin yolları için cevabımı burada görebilirsiniz .

Devam eden başka bir etkinlik olmadığından, geçişin gerçekleşmesi için hedef parça (yeni eklenen parçalardan biri) kaynak parçalarından (orijinal 2'den biri) ~ 30MiB veri okumalı ve yapılandırma sunucularını yapıldıktan sonra yeni yığın konumunu yansıtır. 30MiB veri taşımak, yüksüz normal bir sistem için bir darboğaz olmamalıdır.

Yavaşsa, durumun böyle olmasının birkaç nedeni olabilir, ancak meşgul olmayan bir sistem için en yaygın olanları şunlardır:

  • Kaynak Disk G / Ç - veriler okunduğunda etkin bellekte değilse, diskten disk belleği içine yerleştirilmelidir
  • Şebeke - gecikme, hız sınırlaması, paket kaybı vb. Varsa, okuma işlemi biraz zaman alabilir
  • Hedef Disk G / Ç - veriler ve dizinler diske yazılmalıdır, birçok dizin bunu daha da kötüleştirebilir, ancak genellikle bu hafif yüklü bir sistemde sorun değildir
  • Durdurma ve başarısız taşıma işlemlerine neden olan taşıma işlemleriyle ilgili sorunlar (yapılandırma sunucularıyla ilgili sorunlar, ilkelerdeki silme işlemleriyle ilgili sorunlar)
  • Çoğaltma gecikmesi - çoğaltma kümelerine geçişler için, endişe yazın w:2veya w:majorityvarsayılan olarak kullanılır ve bunu karşılamak için güncel ikincil öğeler gerektirir.

Eğer sistem meşgulse bellek çekişmeseydi, kilit çekişmesi burada da şüpheli olurdu.

Taşıma işlemlerinin ne kadar sürdüğü, başarısız olmaları vb. Hakkında daha fazla bilgi edinmek için, aşağıdakilerdeki girişlere göz atın config.changelog:

// connect to mongos
use config
db.changelog.find()

Gördüğünüz gibi ve genellikle eğitim / öğretim yaptığımda insanlara söylediğim gibi, 4 parçaya ihtiyacınız olacağını biliyorsanız, genellikle rampa yerine 4 ile başlamak daha iyidir. Bunu yaparsanız, bir parça eklemenin uzun zaman alabileceğini ve başlangıçta kazançtan ziyade kaynaklar üzerinde net bir negatif olduğunu bilmeniz gerekir ( bunun daha ayrıntılı bir tartışması için parçalanan tuzaklar serimin II. Bölümüne bakın ).

Son olarak, yığın göçlerin paralelliğini artırmak için özellik talebini izlemek / yükseltmek / yorum yapmak için SERVER-4355'e bakın


Teşekkürler, bu yığın göç mekanizmasını mongodb belgelerinden çok daha fazla açıklıyor.
rendybjunior

Elbette kursuna katılacağım. :) Daha önce bahsettiğim hız hakkında ne düşünüyorsun? Normal mi yoksa yavaş mı? Bu sorunun birçok yönden göreceli olduğunu biliyorum. Ama kendi fikrini istiyorum
rendybjunior

Açıklamanıza göre biraz yavaş görünüyor, ancak emin olmak için orta örnekleri karşılaştırmam gerekir. Şu anki oranınız yapabildikleri tek şey olabilir veya yanıtta bahsettiğim sorunlardan birine sahip olabilirsiniz. Deneyebileceğiniz bir kontrol manuel bir yığın hareketidir - dengeleyiciyi kapatın ve herhangi bir sorun olup olmadığını ve hareketin kaynak / hedef sistemler üzerinde ne gibi etkileri olduğunu görmek için kendiniz yapın. MoveChunk ile ilgili ayrıntıları burada bulabilirsiniz: docs.mongodb.org/manual/reference/method/sh.moveChunk
Adam C

Sadece yığın yığınının mongoDB'de ve hatta Yüksek Performanslı Sistemlerde düşük önceliğe sahip olduğunu eklemek, meşgul olduklarında biraz zaman alabilir.
Antonios

@Antonis - öncelikli olarak ne demek istediğinizden emin değilsiniz, yığın geçişi kaynak parçasından bir okuma (diğer herhangi bir okuma ile aynı) ve hedef parçaya bir yazma (yukarıda belirtilen yazma endişesi ile), bu işlemlere öncelik verilmez diğerlerine karşı. Meşgul sistemlerde yavaş olacaklar, ancak doğal öncelik farkı nedeniyle değil.
Adam C
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.