Mongodb, CAP teoreminde nerede duruyor?


121

Baktığım her yerde MongoDB'nin CP olduğunu görüyorum. Ama kazdığımda sonunda tutarlı olduğunu görüyorum. Safe = true kullandığınızda CP mi? Eğer öyleyse, bu, safe = true ile yazdığımda, sonucu almadan önce tüm kopyaların güncelleneceği anlamına mı geliyor?

Yanıtlar:


104

MongoDB varsayılan olarak güçlü bir şekilde tutarlıdır - eğer bir yazma yapıp sonra bir okuma yaparsanız, yazmanın başarılı olduğunu varsayarsak, az önce okuduğunuz yazının sonucunu her zaman okuyabilirsiniz. Bunun nedeni, MongoDB'nin tek ana sistem olması ve tüm okumaların varsayılan olarak birinciye gitmesidir. İsteğe bağlı olarak ikincil programlardan okumayı etkinleştirirseniz, MongoDB, güncel olmayan sonuçların okunmasının mümkün olduğu durumlarda sonunda tutarlı hale gelir.

MongoDB ayrıca replika kümelerinde otomatik yük devretme yoluyla yüksek kullanılabilirlik elde eder: http://www.mongodb.org/display/DOCS/Replica+Sets


13
Aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads'e göre , çoğaltma kümesindeki birincil düğümden okuyor olsanız bile, eski veya kirli veriler alabilirsiniz. Yani MongoDB güçlü tutarlı mı?
Mike Argyriou

3
Kyle'dan harika deneyler. Gerçekten mongoyu avlıyor. Örneğin, ödeme işlemleri yapan MongoDB'yi kullanan üretim sistemleri olup olmadığını merak ediyorum. Yalnızca kişisel bir web sitesiyse, tutarlılığı kimin umursadığı.
xin

5
Sadece rekor için, MongoDB v3.4 Kyle tarafından tasarlanan testi geçti, bu yüzden evet, MongoDB, ReplicaSet ve Sharding ile bile oldukça tutarlı: mongodb.com/mongodb-3.4-passes-jepsen-test
Maxime Beugnet

2
MongoDB konfigürasyona bağlı olarak zaman zaman kullanılabilirlikten ödün verebildiğinden, bu cevap biraz fazla basit olabilir. JoCa, CA / CP / AP gibi davrandığı durumları daha iyi açıklıyor
PaoloC

37

Luccas gönderisine katılıyorum. MongoDB'nin CP / AP / CA olduğunu söyleyemezsiniz, çünkü hem veritabanı / sürücü yapılandırmasına hem de felaket türüne bağlı olarak aslında C, A ve P arasında bir değiş tokuştur : işte görsel bir özet ve aşağıda daha ayrıntılı açıklama.

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

Tutarlılık:

MongoDB, tek bir bağlantı veya doğru Yazma / Okuma Kaygı Seviyesi kullandığınızda son derece tutarlıdır ( Bu size yürütme hızına mal olur ). Bu koşulları karşılamadığınız anda (özellikle ikincil bir kopyadan okurken) MongoDB Sonunda Tutarlı hale gelir.

Kullanılabilirlik:

MongoDB, Replica-Setler aracılığıyla yüksek kullanılabilirlik elde ediyor . Birincil aşağı iner inmez veya başka bir yerde kullanılamaz hale gelir gelmez, ikinciller yeniden kullanılabilir olacak yeni bir birincil belirleyecektir. Bunun bir dezavantajı var: Eski birincil tarafından gerçekleştirilen, ancak ikincil dosyalara senkronize edilmeyen her yazma , kümeye yeniden bağlanır bağlanmaz geri alınacak ve bir geri alma dosyasına kaydedilecektir (eski birincil ikincildir. şimdi). Dolayısıyla bu durumda, kullanılabilirlik uğruna bir miktar tutarlılık feda edilir.

Bölme Toleransı:

Söz konusu Replica-Setlerin kullanımı yoluyla MongoDB, bölüm toleransına da ulaşır: Bir Replica-Set'in sunucularının yarısından fazlası birbirine bağlı olduğu sürece, yeni bir birincil seçilebilir . Neden? İki ayrılmış ağın her ikisi de yeni bir birincil seçememesini sağlamak için. Birbirlerine yeterince sekonder bağlı olmadığında, onlardan okuyabilirsiniz (ancak tutarlılık sağlanamaz), ancak yazamazsınız. Set, tutarlılık adına pratik olarak kullanılamaz.


Dolayısıyla, doğru yazma / okuma endişe düzeyini kullanıyorsam, bu, tüm yazım ve okumaların birincil seviyeye gittiği anlamına gelir (eğer doğru anladıysam), öyleyse ikinciller tam olarak ne yapar? Primerin düşme ihtimaline karşı orada beklemede otur.
tomer.z

@ tomer.z kılavuzun bu bölümünü okumak isteyebilirsiniz : Okumak için sekonderleri kullanabilirsiniz. "Çoğunluk" Okuma Seviyesini kullanıyorsanız, okuma, üyelerin çoğunluğu okunduğunu kabul eder etmez geçerli olacaktır. Aynı şey "çoğunluk" Yazma Düzeyi için de geçerlidir. Her ikisi için de "Çoğunluk" Kaygı Düzeyini kullanıyorsanız, tutarlı bir veritabanınız olur. Kılavuzda bununla ilgili daha fazla bilgi edinmek isteyebilirsiniz .
JoCa

18

Bir itibariyle parlak yeni makale ve ayrıca bazı geldi Kyle tarafından müthiş deneyler bu alanda C veya A gibi MongoDB ve diğer veritabanları, etiketleme yaparken, dikkatli olmalı

Elbette CAP, veritabanında neyin hakim olduğunu çok fazla kelime olmadan takip etmeye yardımcı olur, ancak insanlar genellikle CAP'de C'nin atomik tutarlılık (doğrusallaştırılabilirlik) anlamına geldiğini unuturlar. Ve bu, sınıflandırmaya çalışırken anlamam için çok fazla acıya neden oldu. Yani, MongoDB'nin güçlü bir tutarlılık vermesinin yanı sıra, bu C olduğu anlamına gelmez. Bu şekilde, eğer bu sınıflandırmalar yapılırsa, şüphe bırakmamak için gerçekte nasıl çalıştığı konusunda daha fazla derinlik vermenizi öneririm.


10

Evet, kullanırken CP'dir safe=true. Bu basitçe, verilerin ana diskte yapıldığı anlamına gelir. Bir kopyaya da ulaştığından emin olmak istiyorsanız, 'w = N' parametresine bakın; burada N, verilerin kaydedilmesi gereken kopya sayısıdır.

daha fazla bilgi için buna ve buna bakın .


3

Mongo için P'den emin değilim. Durumu hayal edin:

  • Kopyanız iki bölüme ayrılır.
  • Yeni ustalar seçilirken her iki tarafa da yazılar devam ediyor
  • Bölüm çözüldü - tüm sunucular şimdi yeniden bağlandı
  • Olan şey şu ki, yeni yönetici seçilir - en yüksek oplog'a sahip olan, ancak diğer ana bilgisayardan gelen veriler bölümlemeden önce ortak duruma geri döndürülür ve manuel kurtarma için bir dosyaya dökülür.
  • tüm yardımcılar yeni ustayı yakalar

Buradaki sorun, döküm dosyası boyutunun sınırlı olmasıdır ve uzun süre bir bölümünüz varsa verilerinizi sonsuza kadar kaybedebilirsiniz.

Olma ihtimalinin düşük olduğunu söyleyebilirsiniz - evet, birinin düşündüğünden daha yaygın olduğu bulutta olmadığı sürece.

Bu örnek, herhangi bir veri tabanına herhangi bir mektup atamadan önce çok dikkatli olmamın nedenidir. Çok fazla senaryo var ve uygulama mükemmel değil.

Mongo'nun sonraki sürümlerinde bu senaryonun ele alınıp alınmadığını bilen biri varsa lütfen yorum yapın! (Bir süredir olan her şeyi takip etmiyorum ..)


2
MongoDB'nin seçim protokolü (en fazla) tek bir birincil olacak şekilde tasarlanmıştır. Bir birincil, yalnızca yapılandırılmış kopya seti oylama üyelerinin (n / 2 +1) katı çoğunluğu tarafından seçilebilir (ve sürdürülebilir). Bir ağ bölümü olması durumunda, yalnızca bir bölüm (oy veren üyelerin çoğunluğuyla) bir birincil seçebilir; azınlık bölümünde bir önceki ilköğretim geri çekilecek ve ikincil hale gelecektir. Kopya kümelerinin her zaman çalışma şekli budur. Eski bir birincil, çoğaltılmayan yazmaları kabul etmişse, bu üye çoğaltma kümesine yeniden katıldığında geri alınacaktır (diske kaydedilecektir).
Stennie

2

Mongodb asla ikincil olarak yazmaya izin vermez. İkincilden isteğe bağlı okumalara izin verir, ancak yazma işlemlerine izin vermez. Yani birincil seviyeniz düşerse, ikincil olana kadar yazamazsınız. CAP teoreminde Yüksek Erişilebilirliği bu şekilde feda edersiniz. Okumalarınızı yalnızca birincilden tutarak güçlü bir tutarlılığa sahip olabilirsiniz.


2

MongoDB, bir Bölüm olduğunda, Kullanılabilirlik yerine Tutarlılığı seçer. Bunun anlamı, bir bölüm (P) olduğunda, Kullanılabilirlik (A) yerine Tutarlılığı (C) seçmesidir.

Bunu anlamak için MongoDB'nin replika setinin nasıl çalıştığını anlayalım. Bir Çoğaltma Kümesinin tek bir Birincil düğümü vardır. Verileri teslim etmenin tek "güvenli" yolu, bu düğüme yazmak ve ardından bu verilerin kümedeki düğümlerin çoğuna işlenmesini beklemektir. (yazma gönderirken w = çoğunluk için bu bayrağı göreceksiniz)

Bölümleme, aşağıdaki gibi iki senaryoda gerçekleşebilir:

  • Birincil düğüm düştüğünde: yeni bir birincil seçilene kadar sistem kullanılamaz hale gelir.
  • Birincil düğüm çok fazla İkincil düğümden bağlantıyı kaybettiğinde: sistem kullanılamaz hale gelir. Diğer yardımcılar yeni bir İlköğretim seçmeye çalışacak ve mevcut birincil görevden çekilecektir.

Temel olarak, bir bölüm olduğunda ve MongoDB'nin ne yapacağına karar vermesi gerektiğinde, Erişilebilirlik yerine Tutarlılığı seçecektir. Bu yazıları güvenli bir şekilde tamamlayabileceğine inanıncaya kadar sisteme yazımları kabul etmeyi bırakacaktır.


"Bu olacak durdurmak kabul yazıyor o güvenle bu yazıyor tamamlayabilirsiniz inanmaktadır kadar sisteme. " Ne yaklaşık okur ? Bu süre boyunca okunabilir durumda kalır mı?
Josh

1

Mongodb, tutarlılık ve bölüm toleransı sağlar .

Dağıtılmış (NoSQL) veritabanları bağlamında bu, tutarlılık ve kullanılabilirlik arasında her zaman bir değiş tokuş olacağı anlamına gelir. Bunun nedeni, dağıtılmış sistemlerin her zaman zorunlu olarak bölümlere toleranslı olmalarıdır (yani, bölümlere toleranslı olmasaydı, dağıtılmış bir veritabanı olmazdı.)

Tutarlılık - Sistem sonunda tutarlı hale gelecektir. Veriler er ya da geç olması gereken her yere yayılacaktır, ancak sistem girdi almaya devam edecek ve bir sonrakine geçmeden önce her işlemin tutarlılığını kontrol etmeyecektir.

Kullanılabilirlik - Varsayılan olarak, Mongo DB İstemcisi (MongoDB sürücüsü), tüm okuma / yazma isteklerini lider / birincil düğüme gönderir. Bu, sistemi tutarlı kılar, ancak şu nedenlerle kullanılamaz hale getirir: - Bir lider kümeden ayrılırsa, yeni bir lider seçmesi birkaç saniye sürer. Yani, bu süre içindeki yazma ve okumalar için kullanılamaz hale getirilir.

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.