Veritabanı parçalama ve bölümleme


166

Son zamanlarda ölçeklenebilir mimariler hakkında okuyorum. Bu bağlamda, veri tabanları ile ilgili olarak ortaya çıkan iki kelime parçalanma ve bölüştürmedir . Açıklamalara baktım ama yine de kafam karıştı.

Stackoverflow'daki uzmanlar temel bilgileri doğru şekilde belirlememe yardımcı olabilir mi?

  • Sharding ve partitioning arasındaki fark nedir ?
  • O doğru mu 'tüm kanatlı bir veritabanları temelde (farklı düğümler üzerinden) bölümlenmiş değil ancak her bölümlenmiş veritabanlarının mutlaka kanatlı bir değil' ?

Yanıtlar:


130

Bölümleme, verileri tablolar veya veritabanları arasında bölmek için kullanılan genel bir terimdir. Parçalama, yatay bölümleme olarak adlandırılan bölümün belirli bir bölümleme türüdür.

Burada şemayı, veriyi hangi örneği veya sunucuyu arayacağını bilmek için bir tür mantık veya tanımlayıcı kullanarak (tipik olarak) birden çok örnek veya sunucuda çoğaltırsınız. Bu tür bir tanımlayıcıya genellikle "Parça Anahtarı" denir.

Yaygın, anahtarsız bir mantık, verileri bölmek için alfabeyi kullanmaktır. AD, örnek 1'dir, EG örnek 2'dir vb. Müşteri verileri buna çok uygundur, ancak bölümleme bazı harflerin diğerlerinden daha yaygın olduğunu dikkate almazsa, boyutlar arasında bir miktar yanlış temsil edilir.

Diğer bir yaygın teknik, örnekler arasında benzersiz anahtarlar sağlayan bir anahtar senkronizasyon sistemi veya mantığı kullanmaktır.

İnceleyebileceğiniz iyi bilinen bir örnek, Instagram'ın bölümlerini ilk günlerde nasıl çözdüğüdür (aşağıdaki bağlantıya bakın). Verileri hareket halindeyken bölmek için Postgres kullanarak çok az sayıda sunucuda bölümlere başladılar. Bu birkaç fiziksel parça üzerinde binlerce mantıksal parça olduğuna inanıyorum. 2012'deki harika yazılarını buradan okuyun: Instagram Mühendislik - Parçalama ve Kimlikler

Buraya da bakınız: http://www.quora.com/Whats-the-difference-between-sharding-and-partition


16
Parçalama bir tür HP'dir . HP değil.
NoChance

1
Yatay bölümleme düşünmeye haklı mıyım sadece bir tablodan satırları birkaç alt tabloya ayırmak anlamına gelir (muhtemelen aynı şema veya veritabanı örneği içinde). veya ayrı makinelerdeki ayrı veritabanı örneklerine dönüştürün. Ya da değil?
Jonathan Hartley

48

Bunun her iki sorunuzu da yanıtladığı anlaşılıyor:

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 tabloda bulunacağını tanımlamak için, önce dizini, örneğin klasik 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) ayrılabilmesidir.

Kaynak: Wiki-Shard .

Parçalama, veri kayıtlarının birden fazla makinede saklanması işlemidir ve MongoDB'nin veri büyüme taleplerini karşılama yaklaşımıdır. Verilerin boyutu arttıkça, tek bir makine verileri depolamak veya kabul edilebilir bir okuma ve yazma verimi sağlamak için yeterli olmayabilir. Parçalama, sorunu yatay ölçeklendirme ile çözer. Parçalama ile veri büyümesini ve okuma ve yazma işlemlerinin taleplerini desteklemek için daha fazla makine eklersiniz.

Kaynak: MongoDB .


41

Ben de buna dalmış durumdayım ve konu hakkında açık ara referans olmama rağmen, topladığım birkaç önemli gerçek var ve paylaşmak istediğim noktalar var:

Bir bölüm , bir mantıksal veri tabanında ya da farklı, bağımsız parçaya da kurucu elemanlarının bir bölümüdür. Veritabanı bölümleme normalde yük dengeleme gibi yönetilebilirlik, performans veya kullanılabilirlik nedenleriyle yapılır.

https://en.wikipedia.org/wiki/Partition_(database)

Kırma gibi bölümleme bir tür olan yatay bölme (HP)

Bir tabloyu daha küçük farklı parçalara böldüğünüz Dikey Bölümleme (VP) de vardır . Normalleştirme, sütunların tablolar arasında bölünmesini de içerir, ancak dikey bölümleme bunun ötesine geçer ve zaten normalleştirilmiş olsa bile sütunları bölümler.

https://en.wikipedia.org/wiki/Shard_(database_architecture)

Tony Baco'nun Quora'daki şemasını (sütunlar ve satırlar yerine) düşünmenizi sağladığı cevabını gerçekten çok seviyorum. O şunu belirtmektedir...

" Yatay bölümleme " veya parçalama, şemayı çoğaltır ve daha sonra verileri bir parça anahtarına göre böler.

" Dikey bölümleme " şemayı bölmeyi içerir (ve veriler sürüş için devam eder).

https://www.quora.com/Whats-the-difference-between-sharding-DB-tables-and-partitioning-them

Oracle'ın Veritabanı Bölümleme Kılavuzu'nda bazı güzel rakamlar vardır. Makaleden birkaç alıntı kopyaladım.

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

Bir Tablo Ne Zaman Bölümlendirilir?

Bir tabloyu ne zaman bölümleyeceğinize ilişkin bazı öneriler:

  • 2 GB'den büyük tablolar her zaman bölümleme adayı olarak kabul edilmelidir.
  • En yeni bölüme yeni verilerin eklendiği geçmiş verileri içeren tablolar. Tipik bir örnek, yalnızca geçerli ayın verilerinin güncellenebildiği ve diğer 11 ayın salt okunur olduğu geçmiş tablodur.
  • Bir tablonun içeriğinin farklı türdeki depolama aygıtlarına dağıtılması gerektiğinde.

Bölüm Budama

Bölüm budaması, bölümlemeyi kullanarak performansı arttırmanın en basit ve en önemli yoludur. Bölüm budaması, sorgu performansını birkaç büyüklük düzeyinde artırabilir. Örneğin, bir uygulamanın geçmiş sipariş geçmişini içeren bir Siparişler tablosu içerdiğini ve bu tablonun haftalara göre bölümlendiğini varsayalım. Tek bir hafta için sipariş isteyen bir sorgu Siparişler tablosunun yalnızca tek bir bölümüne erişir. Siparişler tablosunda 2 yıllık geçmiş verileri varsa, bu sorgu 104 bölüm yerine bir bölüme erişir. Bu sorgu, yalnızca bölüm budama nedeniyle 100 kat daha hızlı gerçekleştirilebilir.

Bölümleme Stratejileri

  • Aralık
  • esrar
  • Liste

Metinlerini okuyabilir ve her şeyi oldukça iyi açıklayan görüntülerini görselleştirebilirsiniz.

Son olarak, veritabanlarının son derece kaynak yoğun olduğunu anlamak önemlidir:

  • İşlemci
  • Disk
  • I / O
  • Hafıza

Birçok DBA, bölümlerin tüm kaynakları paylaşacağı ancak verileri ve / veya dizini bölerek disk ve G / Ç'de bir iyileştirme sağlayacağı aynı makinede bölümlenecektir.

Diğer stratejiler, parçaların% 100 CPU, disk, G / Ç ve belleğe sahip olan ayrı ve farklı bilgi işlem birimlerinde (düğümler) yer alacağı "paylaşılan hiçbir şey" mimarisini kullanacaktır. Kendi avantajları ve karmaşıklıklarını sağlamak.

https://en.wikipedia.org/wiki/Shared_nothing_architecture


"" Yatay bölümleme "veya parçalama, şemayı çoğaltıyor ve ardından verileri bir parça anahtarına göre bölüyor." - bu totolojiktir.
8bitjunkie

Yani bir ayna var ve parçalanmış, dolayısıyla etimoloji.
mckenzm

5

Veritabanında 1 Milyon satır ve 100 sütun içeren bir Tablo düşünün Bölümleme'de , tabloyu aşağıdaki gibi özelliklere sahip 2 veya daha fazla tabloya bölebilirsiniz:

  1. 0,4 Milyon sıra (tablo1), 0,6 milyon sıra (tablo2)

  2. 1 Milyon satır ve 60 sütun (tablo1) ve 1 Milyon satır ve 40 sütun (tablo2)

    Bunun gibi birden fazla durum olabilir

Bu genel bölümleme

Ancak Sharding, yalnızca verileri satırlara göre böldüğümüz 1. duruma karşılık gelir. Tabloyu birden çok tabloya bölüyorsak, şemaların benzer çoklu kopyalarını tutmalıyız, çünkü şu anda birden çok tablo var.


1

Bölümler birden çok veritabanı örneğine yayıldığında , özel bir yatay bölümleme durumunda kırma . Bir veritabanı parçalanırsa, tanımına göre bölümlenmiş demektir.


1

Bölümleme hakkında konuşurken lütfen çoğaltma veya çoğaltma terimini kullanmayın. Çoğaltma farklı bir kavramdır ve bu sayfanın kapsamı dışındadır. Bölümleme hakkında konuştuğumuzda daha iyi kelime bölünür ve parçalama hakkında konuştuğumuzda daha iyi kelime dağıtılır. Bölümde (normalde ve her zaman değil ortak anlayışta) büyük veri kümesi tablosu satırları iki veya daha fazla ayrık (herhangi bir satırı paylaşmayan) gruplara ayrılır. Her gruba bölüm diyebilirsiniz. Bu gruplar veya tüm bölümler bir kez RDMB örneğinin kontrolü altında kalır ve bunların tümü mantıklıdır. Her grubun temeli bir karma veya aralık vb. Olabilir. Bir tabloda on yıllık verileriniz varsa, yılın verilerini ayrı bir bölümde saklayabilirsiniz ve bu, bölüm sınırlarını bir boş olmayan sütun CREATE_DATE. Db'yi sorguladıktan sonra 01-01-1999 ve 31-12-2000 arasında bir oluşturma tarihi belirtirseniz, yalnızca iki bölüm vurulacak ve sıralı olacaktır. Ben milyar + kayıtları için DB benzer yaptım ve sql zaman 30 saniye indis vb kullanarak tüm 50 milis geldi. Parçalama, her bölümü farklı bir düğümde / makinede barındırmanızdır. Şimdi bölümlerin / kırıkların içinde arama yapmak paralel olarak gerçekleşebilir.


0

Başka bir veritabanı örneğine * taşındığında yatay bölüm bir veritabanı parçası haline gelir .

Veritabanı örneği aynı makinede veya başka bir makinede olabilir.

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.