データベースのシャーディングとパーティショニング


166

最近、スケーラブルなアーキテクチャについて読んでいます。その意味で、データベースに関して引き続き出現する2つの単語は、シャーディングパーティション化です。説明を調べましたが、それでも混乱しました。

Stackoverflowのエキスパートが基本を正しく理解するのに役立ちますか?

  • シャーディングパーティショニングの違いは何ですか?
  • それが事実である「すべてのシャードのデータベースは、本質的に(異なるノード上)分割されているが、すべてのパーティション・データベースは必ずしもシャードされていませんか」

digitalocean.com/community/tutorials/…これが役立つ場合があります。
mchawre

回答:


130

パーティション化は、テーブルまたはデータベース間でデータを分割するためのより一般的な用語です。シャーディングは、特定のタイプのパーティション分割であり、いわゆる水平パーティション分割の一部です。

ここでは、データを検索するインスタンスまたはサーバーを特定するために、ある種のロジックまたは識別子を使用して、スキーマを(通常は)複数のインスタンスまたはサーバーに複製します。この種類の識別子は、しばしば「シャードキー」と呼ばれます。

一般的な、キーのないロジックは、アルファベットを使用してデータを分割することです。ADはインスタンス1、EGはインスタンス2などです。顧客データはこれに適していますが、一部の文字が他の文字よりも一般的であることを考慮に入れて分割しない場合、インスタンス間でサイズが多少誤って表示されます。

別の一般的な手法は、インスタンス全体で一意のキーを保証するキー同期システムまたはロジックを使用することです。

よく知られている例は、Instagramがパーティション分割を初期にどのように解決したかです(以下のリンクを参照)。彼らは非常に少数のサーバーでパーティション分割し、Postgresを使用して最初からデータを分割し始めました。私はそれがそれらのいくつかの物理的な断片の数千の論理的な断片だったと信じています。2012年の素晴らしい記事をここでお読みください:Instagram Engineering-Sharding&IDs

こちらもご覧くださいhttp : //www.quora.com/Whats-the-difference-between-sharding-and-partition


16
シャーディングはHPの一種です。HPではありません。
NoChance 2013

1
水平分割とは、テーブルから行をいくつかのサブテーブル(おそらく同じスキーマまたはデータベースインスタンス内)に分割することを単に意味していると思いますか?シャーディングとは、水平分割することです。 、または別のマシン上の別のデータベースインスタンスに。か否か?
Jonathan Hartley

48

これはあなたの両方の質問に答えるように見えます:

水平分割では、通常、スキーマとデータベースサーバーの単一インスタンス内で、1つ以上のテーブルを行ごとに分割します。最初にインデックスを検索する必要なく、特定の行がどのテーブルで検出されるかを特定する明白で堅牢な暗黙の方法が存在する場合、インデックスサイズ(および検索の労力)を削減することで利点を提供できます。 'CustomersEast'テーブルと 'CustomersWest'テーブルの例。郵便番号はすでにそれらがどこにあるかを示しています。

シャーディングはこれだけではありません。問題のあるテーブルを同じ方法でパーティション分割しますが、スキーマの複数のインスタンスにまたがる可能性があります。明らかな利点は、大きなパーティションテーブルの検索負荷を、同じ論理サーバー上の複数のインデックスだけでなく、複数のサーバー(論理サーバーまたは物理サーバー)に分割できるようになることです。

出典:ウィキ-シャード

シャーディングは、複数のマシンにまたがってデータレコードを保存するプロセスであり、データの増大の要求を満たすためのMongoDBのアプローチです。データのサイズが大きくなると、1台のマシンではデータを保存したり、読み取りと書き込みのスループットを十分に提供したりできない場合があります。シャーディングは、水平スケーリングの問題を解決します。シャーディングでは、データの増加と読み取りおよび書き込み操作の要求をサポートするマシンをさらに追加します。

出典:MongoDBの


41

私もこれについて詳しく説明してきましたが、私はこの件については断然参考にしていますが、収集した重要な事実と共有したいポイントはほとんどありません。

パーティションは、別個の独立した部分に論理データベース又はその構成要素の一部門です。データベースのパーティション化は、通常、ロードバランシングと同様に、管理性、パフォーマンス、または可用性の理由から行われます。

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

シャーディングは、水平分割(HP)などの分割の一種です。

また、垂直分割(VP)があり、テーブルを小さな個別の部分に分割します。正規化にはテーブル間の列の分割も含まれますが、垂直分割はそれを超えており、すでに正規化されている場合でも列を分割します。

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

私は、QuoraでTony Bacoが(列や行ではなく)スキーマの観点から考えさせる答えを本当に気に入っています。彼はこう述べています...

水平分割」またはシャーディングとは、スキーマを複製[コピー]し、シャードキーに基づいてデータを分割することです。

垂直分割」はスキーマを分割することを含みます(そしてデータはライドに沿って行きます)。

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

Oracleのデータベースパーティショニングガイドには、いくつかのすばらしい数値があります。記事の抜粋をいくつかコピーしました。

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

いつテーブルを分割するか

次に、テーブルをパーティション分割するタイミングに関するいくつかの提案を示します。

  • 2 GBを超えるテーブルは、常にパーティション分割の候補と見なす必要があります。
  • 新しいデータが最新のパーティションに追加される履歴データを含むテーブル。典型的な例は、当月のデータのみが更新可能で、残りの11か月は読み取り専用である履歴テーブルです。
  • テーブルの内容をさまざまなタイプのストレージデバイスに分散する必要がある場合。

パーティションプルーニング

パーティション・プルーニングは、パーティショニングを使用してパフォーマンスを改善するための最も単純で最も重要な手段です。パーティションのプルーニングにより、クエリのパフォーマンスが数桁向上することがよくあります。たとえば、アプリケーションに注文の履歴レコードを含むOrdersテーブルがあり、このテーブルが週ごとに分割されているとします。1週間の注文を要求するクエリは、Ordersテーブルの1つのパーティションにのみアクセスします。Ordersテーブルに2年間の履歴データがある場合、このクエリは104パーティションではなく1パーティションにアクセスします。このクエリは、パーティションのプルーニングが原因で、100倍速く実行される可能性があります。

パーティショニング戦略

  • 範囲
  • ハッシュ
  • リスト

あなたは彼らのテキストを読み、すべてをかなりよく説明する彼らのイメージを視覚化することができます。

最後に、データベースは非常に多くのリソースを消費することを理解することが重要です。

  • CPU
  • ディスク
  • I / O
  • 記憶

多くのDBAは同じマシンでパーティションを作成し、パーティションはすべてのリソースを共有しますが、データやインデックスを分割することにより、ディスクとI / Oを改善します。

他の戦略では、CPU、ディスク、I / O、およびメモリを100%持つシャードが別々の異なるコンピューティングユニット(ノード)に存在する「シェアードナッシング」アーキテクチャを採用します。独自の利点と複雑さのセットを提供します。

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


「「水平分割」またはシャーディングとは、スキーマを複製[コピー]し、シャードキーに基づいてデータを分割することです。」-これはトートロジーです。
8bitjunkie 2018年

だから鏡があり、それは断片化されているので、語源です。
mckenzm

5

100万行、100列のデータベース内のテーブルについて考えてみましょう。パーティショニングでは、テーブルを次のようなプロパティを持つ2つ以上のテーブルに分割できます。

  1. 40万行(表1)、60万行(表2)

  2. 100万行&60列(表1)および100万行&40列(表2)

    そのような複数のケースがある可能性があります

これは一般的なパーティショニングです

ただし、シャーディングは、行に基づいてデータを分割している最初のケースのみを指します。テーブルを複数のテーブルに分割する場合、複数のテーブルがあるため、スキーマの類似したコピーを複数維持する必要があります。


1

パーティションが複数のデータベースインスタンスにまたがる場合の、水平パーティション分割の特殊なケースでのシャーディング。データベースがシャーディングされている場合、それは定義によりパーティション化されていることを意味します。


1

パーティショニングについて話すときは、レプリケートまたはレプリケーションという用語を使用しないでください。レプリケーションは別の概念であり、このページの範囲外です。パーティショニングについて話すときは、より良い言葉は除算であり、シャーディングについて話すときは、より良い言葉は分布です。パーティションでは(通常は常に理解されているわけではありませんが)、大きなデータセットテーブルの行が2つ以上の互いに素な(行を共有しない)グループに分割されます。各グループをパーティションと呼ぶことができます。これらのグループまたはすべてのパーティションは、一度RDMBインスタンスの制御下にあり、これはすべて論理的です。各グループのベースは、ハッシュまたは範囲などにすることができます。テーブルに10年分のデータがある場合は、各年のデータを別々のパーティションに格納できます。これは、 null以外の列CREATE_DATE。データベースをクエリした後、01-01-1999から31-12-2000までの作成日を指定すると、2つのパーティションのみがヒットし、連続します。私はDBで10億以上のレコードについて同様のことを行い、SQL時間はインデックスなどをすべて使用して30秒から50ミリ秒になりました。シャーディングとは、各パーティションを異なるノード/マシンでホストすることです。パーティション/シャード内の検索が並行して行われるようになりました。


0

別のデータベースインスタンスに移動すると、水平パーティションデータベースシャードになります

データベースインスタンスは、同じマシンまたは別のマシンに配置できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.