InfoQ

News

BigTableの最大利用のための原則と指針

作者 Sadek Drobi , 翻訳者 編集部 投稿日 2008年6月8日 午前6時22分

コミュニティ
Architecture
トピック
パフォーマンス&スケーラビリティ,
データベース設計
タグ
データベース

Google App Engineに関して活発になっている会話に基づき、Todd Hoff氏はBig Tableのような分散ストレージシステムの使用を最適化する手段である、一連の原則(source)を概説した。

Todd氏は、BigTableを 使用することの定義から始めている。さまざまなトレードオフを引き起こすことを仮定すると、Big Tableは以下のようなアプリケーションをビルドする必要のあるときに、値を付加する。a)「膨大な数のユーザに拡張」する必要があるアプリケーション、b)読み取りに対する更新の割合が制限されているアプリケーション。またTodd氏は、「読み取り速度および拡張可能性の最適化」をするためには、 概念的アプローチがリレーショナルデータベースで使用されたものとは根本的に違っているべきであり、また最初にややカウンターを認識して、さらにリスキーであるとよい。

リレーショナルワールドはエラーの回避に基づいており、正規化が複写を除去したり、更新の以上を回避するためのツールとして使用される。データの拡張縮小は、正規化されるのではなく、複写されるべきである。このパスは、Flickrによって選択された。「別々のコメントの関連を作成するよりもコメンターお よびコメントされるユーザの両方でコメントを複製する」という決定がなされた背景がある。その理由は、「 拡張可能性のユニットがユーザ側である場合、別の関連空間がない」からである。それゆえ、非正規化がTodd Hoff氏が呼ぶところのリレーショナルデータに反するとしても、BigTableデータパラダイムにおいて不可欠の部分である。

そう仮定すると、Todd氏はBig Tableストレージシステムの最大利用のため、覚えておくべきその他の原則を概説している。

  • 高速な順次アクセスより、低速なランダムアクセスを想定する。

 

BigTableでは、データはどこにでも存在できるので[…]平均的な検索時間は比較的高い」。速度を拡張可能性に対して、交換する。

  • 並行読み取りのために、データをグループ化する。

 

並行読み取りを最大化するために、たとえば「エンティティを保管して、複数の読み取りを必要とするJoinを実行せずに、一度のアクセスで読み取りができる」ように、そして、「属性を複写して、使用される必要がある場所にそれらを保管するように、ソリューションがデモされることになっている。

  • ディスクおよびCPUはチープなので、心配せずに、拡張縮小する。

 

「[...] 単にさらに多くのマシン上で実行することにより、アプリケーションは、必要な限り拡張することができる。拡張可能性のすべての障害が取り除かれた」。

  • 使用方法に関する構造データ。

 

クエリーの速度を改善するために、データフォーマットは使用されることになるフォーマットにできる限り近づける。それゆえ、Hoff氏は「アプリケーショ ンベースのエンティティのSQLセット」の交換を主張した。しかしながら、「これはオブジェクト指向のデータベースと同様でない」ことを強調するのは重要である。振る舞いは、エンティティに拘束されないが、アプリケーションによって提供され、「複数のアプリケーションは同様のエンティティを読み取ることが できるが、まったく違う振る舞いを実装する」。

  • 書き込み時に、属性を計算する。

 

これによって、「読み出し時に必要な作業を軽減」し、「膨大なデータでアプリケーションが繰り返される」(効率が悪い)のを防ぐことができる。

  • オプションフィールドで、大規模なエンティティを作成する。

 

小規模なエンティティをたくさん正規化したり、作成したりする代わりに、「オプションパーツがある大規模なエンティティを作成すれば、一度の読み取りを実行できるし、それから実行時にあるものを決定することができる」。

  • モデルでスキーマを定義する。

 

非正規化のコンテキストにおいて複数のエンティティ全体でのデータの一貫性を保つには、スキーマが「コードで定義されている必要がある。それは、関係すべてを追跡でき、整合性を維持することができる唯一のコードであるからである」。

  • Ajaxで更新を非表示にする。

 

増分がほとんどないデータベースの更新を支援する。

  • Putsは重要。

 

「1つのクエリーで実行することができる更新の数がかなり制限されている」ことを考慮して、Todd氏は「外部CPUによって動かされる、より小さなバッチで更新を実行すること」を提案している。

  • 明確なコストモデルによる設計。

 

「クエリーの形式でOKをクリックすれば、データベース操作の支払いの準備が完了したことを示す」。

  • 最小数のエレメントのエンティティで 多対多の関係を確立する。

 

「長いリストを保持すると、比較的効率が悪い」ので、「できるだけ、リストの項目数は少なくする」ようにする。

  • 無限のクエリーを避ける。

 

Todd氏は、属性からの直近の限られた値のみを表示することを提案している。それは、「大きなクエリーは拡張縮小しない」からである。

  • データストアエンティティとの関連を避ける。

 

「カウントの経過を追い、要求ごとに更新や読み取られるようなエンティティ、といったグローバルカウンターは避ける」べきである。

  • 大規模なエンティティグループを回避する。

 

「エンティティグループへのすべての書き込みは順次的である」から、「規模の小さい、局在のグループ」を使用するほうがより好ましい。

Todd Hoff氏は、こうした原則の洞察についてさらに深く突き詰め(source)、GQL(source)スレッドからの例を使用しながら、それらを説明している。

原文はこちらです:     http://www.infoq.com/news/2008/05/principles-to-big-table

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
slashdot+
Hatena

特集コンテンツ一覧

Flex 4の新機能トップ10

今週(2009年6月1日)AdobeはFlex 4の正式な初ベータ版をリリースしました。Flex 4はGumbo(オクラ)というコードネームで開発されています。今回のリリースには大きな変更が多数含まれています。このRIAフレームワークの最新バージョンにおいて変更された事柄についての概要を以下のリストで見ていきましょう。

Domain Driven Design(ドメイン駆動設計) Quickly 日本語版

ビジネス領域の深い理解を反映したドメインモデルを設計するための、ヴィジョンとアプローチです。この本は、Eric Evans氏の「Domain Driven Design」の主要点を短く読みやすく要約しました。

JavaプログラマがFlexとBlazeDSを学んだ方がいい13の理由

この記事ではJavaプログラマがなぜFlexとBlazeDSを学ぶべきなのかについて13の理由を述べています。なぜ高度にインタラクティブなWeb サイトからJavaで開発されたバックエンドをもつエンタープライズ・アプリケーションまでを含む、リッチ・インターネット・アプリケーション(RIA)の開発にFlexとBlazeDSの組み合わせが最適な選択肢となるのかについて述べています。

仮想パネル: バックログは重要な成果物とプラクティスか、それとも無駄か?

Mary Poppendieck氏、Ron Jeffries氏、Jeff Patton氏、David West氏、Steve Freeman氏、Jason Yip氏が、バックログに関する彼らの意見とアジャイルチームを成功させるために必要な事を語った。

Perf4Jを使ったパフォーマンス解析とモニタリング

この記事ではAlex Devine氏が、Java開発者がPerf4Jをどのように利用できるかと、タイミングステートメントにコードを追加し、ロギング、結果の解析とモニタリングを行うオープンソースツールセットの説明をします。

複雑な外部DSLを開発する

本稿では、Vaughn Vernon氏が内部DSLと外部DSLの違いを説明し、複雑な外部DSLを開発する際のステップを示します。

J2EEアプリケーションにおけるAOPを使ったフェッチ戦略の実装

この記事では低レベルのサービス・レイヤやリポジトリ・レイヤを肥大化させることなく、フェッチング・ストラテジによってモジュール化された方法でバックエンドにあるシステムからデータを取得する処理を最適化する方法について説明します。

実証済みのアイデアの融合: S#arp Architectureの裏側

この記事では、Web開発における多数の成熟傾向と、クライアントに価値を提供することに対するそれらのメリット、およびS#arp Architecture(最善の手法と技術を活用しようとするASP.NET MVCをベースとしたフレームワーク)内でのそれらの使用について取り上げます。