Parçalama nedir ve neden önemlidir?


196

Bence dilimlenmiş verilerinizi (kırıkları) bağlamda mantıklı olan bir araya gelmesi kolay bir parça haline getirmek için parçalanmayı anlıyorum. Bu doğru mu?

Güncelleme : Sanırım burada mücadele ediyorum. Bence uygulama katmanı, verilerin nerede saklanacağını belirleyen bir işe sahip olmamalıdır. En iyi ihtimalle bir çeşit kırıcı müşteri olmalı. Her iki cevap da neyin önemli olduğunu neyin değil neyin cevabını verdi. Açıkça görülen performans artışlarının dışında ne gibi etkileri var? Bu kazançlar MVC ihlalini telafi etmek için yeterli mi? Parçalama çoğunlukla çok büyük ölçekli uygulamalarda önemli mi yoksa daha küçük ölçekli uygulamalarda mı geçerlidir?


1
Bu web seminerlerinden biri yardımcı olur mu? vimeo.com/26742356 slideshare.net/rightscale/… vimeo.com/32541189

Yanıtlar:


193

Parçalama, bir veritabanının "yatay bölümlenmesi" için başka bir addır. Daha net olması için o terimi aramak isteyebilirsiniz.

Gönderen Vikipedi :

Yatay bölümleme, bir veritabanı tablosunun satırlarının sütunlara bölünmek yerine (normalleştirme için olduğu gibi) ayrı tutulduğu bir tasarım ilkesidir. Her bölüm, farklı bir veritabanı sunucusunda veya fiziksel bir konumda bulunabilecek bir kırığın bir parçasını oluşturur. Avantaj, her tablodaki satır sayısının azaltılmasıdır (bu, dizin boyutunu azaltır, böylece arama performansını artırır). Parçalama, verilerin gerçek dünyadaki bazı yönlerine dayanıyorsa (örn. Avrupalı ​​müşteriler ve Amerikalı müşteriler), uygun parça üyeliğini kolayca ve otomatik olarak çıkarmak ve yalnızca ilgili parçayı sorgulamak mümkün olabilir.

Parçalama hakkında daha fazla bilgi:

İlk olarak, her veritabanı sunucusu aynıdır ve aynı tablo yapısına sahiptir. İkinci olarak, veri kayıtları parçalanmış bir veritabanında mantıksal olarak bölünür. Bölümlenmiş veritabanından farklı olarak, her bir tam veri kaydı yalnızca bir kırıkta (yedekleme / yedeklilik için yansıtma yoksa), yalnızca bu veritabanında gerçekleştirilen tüm CRUD işlemleriyle birlikte bulunur. Kullanılan terminolojiden hoşlanmayabilirsiniz, ancak bu, mantıksal bir veritabanını daha küçük parçalara ayırmanın farklı bir yolunu temsil eder.

Güncelleme: MVC'yi kırmayacaksınız. Verilerin nerede depolanacağının doğru parçasını belirleme işi, veri erişim katmanınız tarafından şeffaf bir şekilde yapılır. Burada, veritabanınızı parçalamak için kullandığınız ölçütlere göre doğru kırığı belirlemeniz gerekir. (Veritabanını, uygulamanızın bazı somut yönlerine göre bazı farklı parçalar halinde el ile parçalamanız gerekir.) Ardından, doğru parçayı kullanmak için veriyi veritabanından / veritabanına yüklerken ve depolarken dikkatli olmalısınız.

Belki de Java kodlu bu örnek , onu gerçek dünya senaryosunda nasıl çalışacağını biraz daha açık hale getirir ( Hibernate Shards projesi hakkında).

" why sharding" Konusunu ele almak için : Esas olarak yalnızca çok fazla veri içeren çok büyük ölçekli uygulamalar içindir . İlk olarak, veritabanı sorguları için yanıt sürelerinin en aza indirilmesine yardımcı olur. İkinci olarak, verilerinizi barındırmak için artık yeterli olmayacak tek bir büyük sunucu yerine daha ucuz, "alt uç" makineler kullanabilirsiniz.


1
Beni affet ama veritabanı nerede veri depolayacağına karar vermemeli. Bu uygulama katmanındaki kodu etkiler mi?
ojblass

6
Uzun zamandır yatay bölümlemeden nasıl farklı olduğunu anlamaya çalışıyorum ve cevabınızdaki bağlantı biraz fark olmadığını kanıtlıyor. Birisinin Theo Schlossnagle'ın gönderisine yaptığı yorumlarda söylediği gibi, "... Geleneksel bir veritabanı kültüründen iseniz, yatay bölümleme yapıyorsanız, bir Web kültüründen iseniz,"
Parçalama

@andreister Okuduğum kadarıyla, büyük olasılıkla farklı mantıksal donanıma yerleştirilmiş çoklu mantıksal veya fiziksel düğümler (benim anlayışım (mySQL) çoklu veritabanlarımda) yatay ölçekleme ile tanımlandığı için, parçalama kavramsal olarak farklıdır. Yatay bölümleme, "Parçalama" nın bir alt küme olduğu daha az spesifik bir terimdir. Yine mySQL'i örnek olarak kullanarak, mySQL bölümü, uygulamaya% 100 şeffaf olan tek bir db örneği tarafından işlenir. Bir parçalama yaklaşımı, bir proxy'yi veya hangi örneği akıllıca seçen bir uygulamayı içerecektir.
NateDSaint

Vikipedi'ye göre "Her bir bölüme" kırık "veya" veritabanı "adı verilir." Hangi "Her bölüm bir kırık parçası oluşturur" cevabındaki metinden biraz farklı.
Kevin Wheeler

Başvurduğunuz wiki makalesi, bu iki terim arasında hafif bir ayrım yapar. Yatay bölümleme , genellikle bir şemanın ve veritabanı sunucusunun tek bir örneğinde bir veya daha fazla tabloyu satırlar halinde böler. / *** / Sharding bunun ötesine geçer: sorunlu tabloları aynı şekilde bölümler, ancak bunu şemanın potansiyel olarak birden çok örneğinde yapar. en.wikipedia.org/wiki/…
Peeter Kokk

38

Yerinin oldukça kısıtlı olduğu bir DBMS'ye ilişkin sorgularınız varsa (örneğin, kullanıcı yalnızca 'burada kullaniciadi = $ kullanıcı_adim' ile seçim yapar), AM ile başlayan tüm kullanıcı adlarını tek bir sunucuya ve NZ'ye koymak mantıklıdır Diğer yandan. Bu sayede bazı sorgular için doğrusal ölçeklemeye yaklaşırsınız.

Uzun lafın kısası : Parçalama temel olarak yükü her ikisine de eşit olarak dengelemek için tabloları farklı sunuculara dağıtma işlemidir.

Tabii ki, gerçekte çok daha karmaşık. :)


Bu nedenle parçalama, sakladığınız verilerin tasarımını etkiler ... eğer tam olarak anlamıyorsam özür dilerim.
ojblass

Bu yatay bir bölümleme değil mi?
harunurhan

18

Parçalama, normalleştirme olan dikey ( sütun bazında ) bölümlemenin aksine yatay ( satır bazında ) veritabanı bölümlemesidir . Çok büyük veritabanlarını veri parçaları adı verilen daha küçük, daha hızlı ve daha kolay yönetilen parçalara ayırır. Dağıtılmış sistemlere ulaşmak için bir mekanizmadır.

Neden dağıtılmış sistemlere ihtiyacımız var?

  • Artan kullanılabilirlik.
  • Daha kolay genişletme.
  • Ekonomi: Tek bir büyük bilgisayarın gücüyle daha küçük bilgisayarlardan oluşan bir ağ oluşturmak daha düşük maliyetlidir.

Daha fazlasını buradan okuyabilirsiniz: Dağıtılmış veritabanının avantajları

Parçalama, dağıtılmış sisteme nasıl yardımcı olur?

Bir arama dizinini N bölümlerine ayırabilir ve her dizini ayrı bir sunucuya yükleyebilirsiniz. Bir sunucuyu sorgularsanız, sonuçların 1 / N'sini alırsınız. Sonuç kümesinin tamamını elde etmek için, tipik bir dağıtılmış arama sistemi , her sunucudan sonuç biriktirecek ve bunları birleştirecek bir toplayıcı kullanır . Toplayıcı ayrıca her sunucuya sorgu dağıtır. Bu toplayıcı programa büyük veri terminolojisinde MapReduce adı verilir . Başka bir deyişle, Dağıtılmış Sistemler = Parçalama + MapReduce (Başka şeyler de olsa).

Aşağıda görsel bir sunum. Dağıtımlı sistem


7

Parçalama çoğunlukla çok büyük ölçekli uygulamalarda önemli mi yoksa daha küçük ölçekli uygulamalarda mı geçerlidir?

Parçalama, yalnızca ihtiyaçlarınız tek bir veritabanı sunucusu tarafından sunulabilecek şeylerin ötesine geçiyorsa endişe vericidir. Keskinleştirilebilir verileriniz varsa ve inanılmaz derecede yüksek ölçeklenebilirlik ve performans gereksinimleriniz varsa bir şişme aracıdır. 12 yıl boyunca yazılım uzmanı olduğumu tahmin edebilirim, parçalanmadan fayda sağlayabilecek bir durumla karşılaştım. Çok sınırlı uygulanabilirliğe sahip gelişmiş bir tekniktir.

Ayrıca, gelecek muhtemelen tüm potansiyel performans sınırlamalarını silen büyük bir nesne "bulut" gibi eğlenceli ve heyecan verici bir şey olacak, değil mi? :)


parçalanma ihtiyacınız olan durumu paylaşabilir misiniz
Gagan Burde

4

Parçalama başlangıçta google mühendisleri tarafından yapıldı ve Google App Engine'de uygulama yazarken oldukça yoğun bir şekilde kullanıldığını görebilirsiniz. Sorgularınızın kullanabileceği kaynak miktarında zor sınırlamalar olduğundan ve sorguların kendilerinin katı kısıtlamaları olduğundan, parçalama yalnızca teşvik edilmez, aynı zamanda mimari tarafından neredeyse uygulanır.

Kullanılabilecek başka bir yer parçalaması, veri varlıkları üzerindeki çekişmeyi azaltmaktır. Her zaman darboğaz oldukları için sık sık yazılan veri parçalarına dikkat etmek için ölçeklenebilir sistemler oluştururken özellikle önemlidir. İyi bir çözüm, söz konusu varlığı parçalamak ve çok sayıda kopyaya yazmak, sonra toplamı okumaktır. Bu "kırılmış sayaç wrt GAE'sine bir örnek: http://code.google.com/appengine/articles/sharding_counters.html


7
<< Parçalama aslında google mühendisleri tarafından icat edildi >> - doğru değil. Google 1998 yılında kurulmuştur. Scholar.google.com 1980'lerden "Çoğaltılmış bir veritabanı sisteminde eski bilgileri atmak" gibi makaleler bulur ... CCA'da geliştirilen Yüksek Kullanılabilir Çoğaltılmış Veri Sistemi (SHARD) ... İnsanları duyduğumu hatırlıyorum o zaman parçalanma hakkında konuşuyor.
Krazy Glew

3

Parçalama sadece yatay bölümlemeden daha fazlasını yapar. Göre wikipedia makalesinde ,

Yatay bölümleme, genellikle bir şemanın ve veritabanı sunucusunun tek bir örneğinde bir veya daha fazla tabloyu satırlar halinde böler. Belirli bir satırın hangi bölümde bulunacağını tanımlamak için, önce dizini, örneğin klasik dizini aramak zorunda kalmadan, belirgin, sağlam ve üstü kapalı bir yol olması koşuluyla dizin boyutunu (ve dolayısıyla arama çabasını) azaltarak bir avantaj sunabilir. posta kodlarının zaten nerede bulunacaklarını belirten 'MüşterilerDoğu' ve 'MüşterilerBatı' tablolarına örnek.

Parçalama bunun ötesine geçer: sorunlu tabloları aynı şekilde bölümler, ancak bunu şemanın potansiyel olarak birden çok örneğinde yapar. Bariz avantaj, büyük bölümlenmiş tablo için arama yükünün artık aynı mantıksal sunucudaki birden çok dizine değil, birden çok sunucuya (mantıksal veya fiziksel) bölünebilmesidir.

Ayrıca,

Kırıkları birden çok yalıtılmış örnek arasında bölmek, basit yatay bölümlemeden daha fazlasını gerektirir. Veritabanını sorgulamak her iki örneğin de basit bir boyut tablosu almak için sorgulanmasını gerektiriyorsa, verimlilikte ümit edilen kazançlar kaybolacaktır. Bölümlemenin ötesinde, parçalama böylece büyük bölümlenebilir tabloları sunucular arasında ayırırken, daha küçük tablolar tam birimler olarak çoğaltılır


1

Bence uygulama katmanı, verilerin nerede saklanacağını belirleyen bir işe sahip olmamalıdır

Bu iyi bir kuraldır, ancak çoğu şey gibi her zaman doğru değildir.

Mimarinizi yaptığınızda sorumluluklar ve işbirlikleriyle başlarsınız. Fonksiyonel mimarinizi belirledikten sonra, fonksiyonel olmayan kuvvetleri dengelemeniz gerekir.

Bu işlevsel olmayan güçlerden biri büyük ölçeklenebilirlikse, veri depolama soyutlamanızın artık uygulama katmanınıza sızdığı anlamına gelse bile, mimarinizi bu kuvvete göre uyarlamanız gerekir.


1
Uygulama katmanı yine de veri erişim mantığı ile iş kurallarının ayrılmasını sağlayabilir. Bu, "uygulama katmanı" katmanında ek kavramsal katmanlara sahip olduğunuz anlamına gelir.
Eric
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.