Veri modeli “NoSQL” veritabanındaki ölçeklenebilirliği ve performansı ne kadar etkiler?


13

CAP teoremini (Tutarlılık, Kullanılabilirlik, Bölüm: iki tane seç) getirmeden "NoSQL" veritabanı hakkında bir konuşma yapamazsınız. Eğer MongoDB (Bölüm, Tutarlılık) ve CouchDB (Kullanılabilirlik, Bölüm) arasında demeniz gerekiyorsa, ilk olarak "Doğru verilere ihtiyacım var mı yoksa her zaman erişime ihtiyacım var mı?"

Bunlar yeni veritabanı edildi yapılmış bölümlenmiş olması. Ama ya ben yapmazsam ? Bir Anahtar / Değer, Sütun, Belge, ilişkisel bir veritabanı yerine herhangi bir veritabanına sahip olmak ve sadece bir sunucu örneği oluşturmak ve bunu hiç kırmamak için oldukça havalı olduğunu düşünürsem ne olur? Bu durumda, hem kullanılabilirliğe hem de tutarlılığa sahip olmaz mıydım? MongoDB'nin hiçbir şeyi kopyalaması gerekmez, bu yüzden kullanılabilir. Ve CouchDB'nin tek bir veri kaynağı olacaktır, bu yüzden oldukça tutarlı olacaktır.

Yani, bu durumda, MongoDB ve CouchDB'nin kullanım durumu açısından çok az farkı olacaktır? Tabii ki, performans, API ve diğerleri hariç, ancak bu PostgreSQL ve MySQL arasında seçim yapmak gibi temel olarak farklı iki gereksinim setine sahip olmaktan daha iyi olurdu.

Tam burada mıyım? Birden fazla örnek oluşturmadan AP veya CP veritabanını AC veritabanıyla değiştirebilir miyim? Yoksa özlediğim bir şey var mı?

Soruyu tersine soralım. İlişkisel bir veritabanı alırsam, MySQL diyelim ve bir master / slaves yapılandırmasına koyarsam ne olur? ACID işlemlerini kullanmıyorum Herhangi bir yazma işleminin slave ile hemen senkronize edilmesini istersem, bu onu bir CP veritabanı yapmaz mı? Peki, önceden tanımlanmış bazı aralıklarla senkronize edersem ve bir istemcinin eski verileri eski bir veriyi okuması önemli değildir. Bu onu bir AP veritabanı yapmaz mı? ACID uyumluluğundan vazgeçersem, ilişkisel modeli yine de bir bölümlenmiş veritabanı için kullanabileceğim anlamına gelmez mi?

Özünde: CAP teoreminde vazgeçmeye hazır olduğunuz şeyle ilgili ölçeklenebilirlik, temeldeki veri modelinden daha mı fazladır? İlişkisel bir model üzerinde ölçeklenebilirliği artıran her ne olursa olsun Sütun, Belge, Anahtar Değere sahip olmak? Bölme toleransı için sıfırdan tasarlanmış ilişkisel bir veritabanı tasarlayabilir miyiz? (Belki zaten var). NoSQL veritabanı ACID'sini uyumlu hale getirebilir miyiz?

Üzgünüz, çok soru var, ama son zamanlarda NoSQL veritabanı hakkında çok şey okudum ve bana bunları kullanmanın en büyük yararı, sadece bölüm, CAP yerine verilerinizin "şekline" daha iyi uymalarıdır. ve ASİT uyumluluğundan vazgeçmek. Sonuçta, herkesin onu bölümlendirmek için çok fazla veri yok. Verilerimi bölümlere ayırmayı düşünmeden önce ilişkisel modeli kullanmamanın bir performans / ölçeklenebilirlik yararı var mı ?

Yanıtlar:


8

NoSQL veritabanı kullanmak, veri parçalamasanız bile ölçeklenebilirliği artırır mı? Peki ölçeklenebilirliği tanımlayalım. Veritabanı / arka uç sistemleri söz konusu olduğunda ölçeklenebilirlikten bahsediyorsanız, yatay ölçeklemenin verileri parçaladığı dikey ve yatay ölçeklendirmeye sahip olmanız, o zaman bu önemsiz bir soru haline gelir, çünkü o zaman cevap kesinlikle hayır olacaktır, çünkü kalan tek seçenek dikey ölçeklendirmedir (yani daha iyi donanım elde etmek). Ancak daha geniş anlamda ölçeklenebilirlik hakkında konuşuyorsanız, uygulamanın esnekliği, veri değeri vb. Bahsettiğiniz gibi, genellikle verilerle ne yaptığınıza ve nasıl saklanması gerektiğine inecektir. Burada çoğu şeyi bir RDBMS kullanmanız gerektiği ve NoSQL'in niş doldurması gerektiği ifadesiyle her şeyi önceden yazayım. Aşağıda, belirli gereksinimler göz önüne alındığında NoSQL veritabanının daha faydalı olacağı ve yatay ölçeklendirmeyi göz ardı edebileceğimiz belirli bir örneğin açıklaması yer almaktadır.

Örneğin, google sürücü, dropbox veya kutuya benzer bir bulut dosya depolama sistemi oluşturduğunuz fikrini alın, ancak gerçek bir dosya sistemi kullanmak yerine dosya sistemini sanallaştırmanın sizin için daha yararlı olacağına karar verirsiniz. Artık bir probleminiz var çünkü veri modeliniz aniden bir RDBMS'de korkunç bir şekilde verimsiz olacak olan ağaç yapısı (her şeyin nasıl endekslendiği gerçeğine rağmen). Çünkü şimdi Name, User ve Parent içeren 3 sütunlu bir tablonuz var. Kullanıcı, kullanıcı tablosunun bir yabancı anahtarıdır ve Üst, kendinden referans veren boş bir yabancı anahtardır (kök dizinin bir üst öğesi bulunamadığından geçersizdir). Peki birincil anahtar nedir? Bu örnekte, tüm sütunlarda birleşik bir anahtar ... Aniden Ebeveyn'i en büyük düşmanımız yapar.

Şimdi bunun yerine bir çeşit belge deposuna nasıl koyacağınızı düşünün. Verilerle savaşmak yerine, onunla çalışabilir ve ağaç yapısı olarak saklayabilirsiniz, bu da geliştirme sürenizi azaltır ve bakım maliyetlerini azaltır. Maliyetleri düşürüyorsanız, bu farklı bir ölçeklenebilirliğe izin vermez mi? Ayrıca bu durumda sistemi baştan sona doğru yaratıyorsunuz, bu da uygulamanın kendisine daha fazla esneklik sağlıyor. Şu anda MongoDB kullanarak tek bir sunucuda çalıştırıyorum, açıkladığınız gibi bana MySQL veya Postgres farkına bakmaktan çok farklı olmayan Mevcut, Tutarlı bir model veriyor.

MongoDB ile en azından bir sorgunun başarılı olması için iletişim kurmanız gereken kaç sunucu tanımlayabilirsiniz, böylece tüm sorguların tüm sunucu örnekleriyle iletişim kurmasını söylerseniz, bunu Tutarlı, Kullanılabilir bir modele dönüştürebilirsiniz.

Bu yüzden verinin nasıl saklandığına dair büyük bir faydası olması hakkına sahip olduğunuzu düşünüyorum. Diğer modellere iyi uyan bir ilişkisel modele uymayan şeyler vardır (başka bir kısa örnek olarak, Amazon, ürünler için öneri motoru için bir tür Grafik Veritabanı kullanır).

Sorunuzu doğru anladım mı?

Düzenleme: Daha fazla veri işleri yavaşlatacak mı? Evet. İşleri ne kadar yavaşlatacak? Dürüst olmak gerekirse, yeterli bir cevap vermek için yeterli deneyime sahip değilim. Anahtar / Değer: Esasen, arama anahtarıyla ilişkili büyük miktarda veri içeren bir arama tablosu. Bu gerçekten çok hızlı olacak çünkü sadece anahtarla şeylere bakabilirsiniz. Sütun / Aile: Temelde çok daha yapılandırılmış bir Anahtar / Değer deposu. Yalnızca Sütuna dayalı sorgulama yapabilirsiniz, bu yüzden bu da gerçekten hızlı olmalıdır. Belge: Toplama stili şeması. Burada benzer verileri bir araya getirmek isteyeceksiniz. Denormalizasyon tamam ve bu tür bir veritabanı için bekleniyor. Çok sayıda yazma veya okuma yapmanıza bağlı olarak, verilerinizi, yazıları veya okumaları dağıtmak için birden çok parçaya dağıtılacak şekilde düzenleyebilirsiniz (her ikisi için de iyi olan karma bir yaklaşım oluşturabileceğinizi unutmayın) biri veya diğeri için optimizasyon seçmesi gerekir) Grafik: Bunun gücü, ilişkileri gerçekten hızlı bir şekilde oluşturabilmesi ve parçalayabilmesidir. Veriler arasında geçiş yapmanız gereken bazı verileriniz varsa (bir tür öneri motoru düşünün), bunu kullanmalısınız.

Verileri bu veritabanlarından herhangi birinde nasıl depoladığınız performansı etkileyecektir (bazı RDBMS'de verileri yanlış depolarsanız performansı etkileyecektir). Umarım bunu daha açık hale getirmek için: Hangi veritabanı sistemini kullanmanız gerektiğini ve bu veritabanı sisteminde nasıl veri depolayacağınızı bilmeniz gerekir.


Evet bu beklediğim bir cevaptı. Hassasiyet olarak, bir sistemin boğulmadan artan sayıda görevi yerine getirme kapasitesi olarak ölçeklenebilirliği kastetmiştim, daha ziyade saf bir donanım ölçeklenebilirlik sorunundan (belki de doğru terim değildi). Örnek olarak, Nginx olay tabanlı mimarisi nedeniyle Apache'den daha fazla eşzamanlı istekleri işleyebilir. Ve böylece soru "Sabit donanıma sahip bir makinede ilişkisel olmayan bir veritabanı kullanmak, sınıra girmeden önce daha fazla kullanıcıya hizmet vermeme izin veriyor mu?"
Laurent Bourgault-Roy

Bu durumda, kullandığınız veritabanı sistemine bağlı olacaktır. Yukarıdaki bulut dosya sistemi örneğim için, dosyaları gerçekten saklamak için Redis kullanıyorum ve saniyede 100.000 sorguyu işleyebiliyorlar (çünkü bellek anahtarı / değer deposu olarak inşa edildi). Şimdi gerçekte neler işleyebileceğini görmek için uygulamamı test etmedim ancak Redis web sitesi bunu söylüyor. Bu, sahne arkasında, kullandığınız farklı veritabanı sistemine bağlı olarak verilerin farklı şekillerde temsil edildiğini unutmayın. Nişleri uygun db ile doldurun.
harageth

1
Yanıtımı düzenledim çünkü daha fazla yorum eklemekten daha kolaydı.
harageth

2
+1 bu P.SE'de harika bir başlangıç, bir süre daha yapışıp bu gibi kaliteli içerik eklemeye devam edeceğinizi umuyoruz!
Jimmy Hoffa

1
Mükemmel, düzenleme ile bana çok fikir veriyor. Teşekkür ederim!
Laurent Bourgault-Roy
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.