2009-06-14 16 views
148

私は、あなたのスライスアップされたデータ(シャード)を、文脈で意味をなさない集約に対処しやすくすることを理解していると思います。これは正しいです?シャーディングとは何ですか、なぜ重要なのですか?

更新:私はここで苦労していると思います。私の意見では、アプリケーション層は、データをどこに格納すべきかを決めることはできません。せいぜい、何らかの種類のシャードクライアントであるべきです。両方の回答は、それが重要な側面である理由ではなく、何に答えましたか。明らかなパフォーマンス向上の外にどのような影響がありますか?これらの利益は、MVC違反を相殺するのに十分ですか?シャーディングは、非常に大規模なアプリケーションでは大部分重要ですか、それとも小規模アプリケーションに適用されますか?

+1

だろう1は役に立ち http://vimeo.com/26742356 http://www.slideshare.net/rightscale/rightscale-webinar-scaling? -your-database-in-the-cloud http://vimeo.com/32541189 –

答えて

140

シャーディングは、データベースの「水平パーティショニング」の別名です。あなたはそれをより明確にするためにその用語を検索したいかもしれません。 Wikipediaから

水平パーティショニングは、データベーステーブルの行が(正規化のような)のカラムではなく分裂よりも、別々に保持される設計原理です。各パーティションはシャードの一部を形成し、別のデータベースサーバーまたは物理的な場所に配置されます。利点は、各テーブルの行数を減らすことです(インデックスサイズが縮小され、検索パフォーマンスが向上します)。シャーディングがデータの実際の側面(例えば、ヨーロッパの顧客とアメリカの顧客)に基づいている場合、適切なシャードメンバーシップを容易かつ自動的に推論し、関連するシャードのみを照会することが可能である。

シャーディングに関するいくつかの詳細:

はまず、各データベースサーバは同じテーブル構造を有する、同一です。第2に、データレコードは論理的に分割されたデータベースに分割されます。パーティション化されたデータベースとは異なり、完全な各データレコードは、そのデータベースでのみ実行されるすべてのCRUD操作を使用して、1つのシャードにのみ存在します(バックアップ/冗長性のミラーリングがない限り)。使用する用語が気に入らないかもしれませんが、これは論理データベースを小さな部分に編成する別の方法を表しています。

更新: MVCを壊すことはありません。データを格納する正しいシャードを決定する作業は、データアクセスレイヤーによって透過的に行われます。そこでは、あなたのデータベースを断片化するために使用した基準に基づいて正しい断片を判断する必要があります。 (あなたのアプリケーションのいくつかの具体的な側面に基づいて、いくつかの異なる断片にデータベースを手動で分割する必要があるため)正しい断片を使用するためにデータベースからデータをロードして格納する際には注意が必要です。

Javaコードのthis exampleは、現実世界のシナリオではどのように機能するのかが幾分明確になります(Hibernate Shardsプロジェクトについて)。

why sharding」に対処するには、主に非常に大規模なアプリケーションの場合にのみ、ロットのを使用します。まず、データベースクエリの応答時間を最小限に抑えるのに役立ちます。第2に、より安価な「ローエンド」マシンを使用して、1台の大きなサーバーではなく、より多くのデータをホストすることができます。

+1

私が許しても、データベースがどこにデータを保存するかの決定をするべきではありません。これはアプリケーション層のコードに影響しますか? – ojblass

+4

私はずっと水平パーティション分割と違う点を理解しようとしてきました。答えの中のリンクは違いがないことを証明しています。誰かがTheo Schlossnagleの投稿にコメントしているように、「もしあなたが従来のデータベース文化から水平分割をしているのなら、それはWeb culturの人ならば「Sharding」... " – andreister

+0

@andreister私からシャーディングは、複数の論理的または物理的なノード(mySQL(mySQL)の複数のデータベース、おそらく異なる論理ハードウェアに格納されている場合)の横方向のスケーリングによって定義されている点で概念的に異なります。水平分割はあまり具体的ではないが、そのうち「シャーディング」はサブセットである。ここでも例としてmySQLを使用すると、mySQLパーティションはアプリケーションに対して100%透過的な単一のdbインスタンスによって処理されます。シャーディングのアプローチは、プロキシまたはインテリジェントにどのインスタンスを選択したアプリケーションかに関係します。 – NateDSaint

26

ローカリティが非常に制限されている(たとえば、ユーザーが 'where username = $ my_username'を使用して選択を実行する)DBMSへのクエリがある場合、ANで始まるすべてのユーザー名を1つのサーバーもう一方はMZのすべてです。これにより、いくつかのクエリで線形スケーリングに近づきます。

短いストーリー:シャーディングは、基本的に負荷を両方のサーバーに均等に分散するために、異なるサーバーにテーブルを分散するプロセスです。

もちろん、実際にははるかに複雑です。 :)

+0

シャーディングは保存しているデータのデザインに影響します...ご存じない方はごめんなさい – ojblass

+1

私は別の文を – bayer

+0

これは水平分割ではありませんか? – harunurhan

2

非常に 大規模なアプリケーションでは、ほとんどの重要なシャーディングされるか、それは小規模なものには適用され のでしょうか?

シャーディングは、ニーズが単一のデータベースサーバーによって処理できるものを超えている場合にのみ問題になります。断片化可能なデータがあり、スケーラビリティとパフォーマンス要件が非常に高い場合は、膨大なツールです。私は12年間、私はソフトウェア専門家であり、シャーディングの恩恵を受ける可能性のある状況に遭遇したと思います。適用範囲が非常に限られている高度な技術です。

さらに、今後の可能性は、すべての潜在的なパフォーマンス上の制限を消去する大規模なオブジェクト「クラウド」のような、楽しくエキサイティングなものになるでしょう。 :)

1

私の意見では、アプリケーション層 は、データがこれは良いルールですが、常に正しくないほとんどの事のように

を格納する必要があり を決定する一切の事業を持っていないはずです。

アーキテクチャを実行するときは、責任とコラボレーションから始めます。機能アーキテクチャを決定したら、機能していない力のバランスをとる必要があります。

これらの非機能的な力のひとつが膨大なスケーラビリティである場合、データストレージの抽象化がアプリケーション層にリークすることを意味していても、アーキテクチャを適応させる必要があります。

+1

アプリケーション層は、依然としてデータアクセスロジックとビジネスルールの分離を作成できます。これは、「アプリケーション層」レイヤー内に追加の概念レイヤーがあることを意味します。 – Eric

4

ShardingはもともとGoogleのエンジニアによって作成されたもので、Google App Engineでアプリケーションを作成するときにかなり使用されていました。クエリで使用できるリソースの量には厳しい制限があり、クエリ自体には厳しい制限があるため、シャーディングは奨励されるだけでなく、アーキテクチャによってほとんど強制されます。

もう1つの場所シャーディングは、データエンティティの競合を減らすために使用できます。スケーラブルなシステムを構築して、常にボトルネックになっているために頻繁に書かれたデータを監視することは、特に重要です。良い解決策は、その特定のエンティティを破棄し、マルチコピーに書き込んだ後、合計を読み取ることです。この「シャードカウンターWRTのGAEの例:これらのウェビナーのhttp://code.google.com/appengine/articles/sharding_counters.html

+2

<< ShardingはもともとGoogleのエンジニアが作り出したものです。>> - そうではありません。 Googleは1998年に設立されました。scholar.google.comは、1980年代から「複製データベースシステムで時代遅れの情報を破棄する」などの論文を検索しています... CCAで開発された高可用性複製データシステム(SHARD)...私は、当時のシャーディングについて話していた。 –

関連する問題