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+,
Hatena

No comments

返信

ジャンル別一覧

"YUKATA"から始まるコミュニケーション(Agile2008 ライトニングトークより)

私は「浴衣」を着てパーティーに参加したことで、たくさん声を掛けていただけました。 そこで感じたことは、このカンファレンスが人との繋がりを生み出し、また言葉の壁を越えて積極的に交流する場所であることです。民族衣装はそれらを助けてくれるものでした。きっとこの交流が、新たなムーブメントをアジア圏の仲間たちにも与えてくれると確信しています。

ソフトウェアのリーン思考入門

これは、InfoQ Chinaのアジャイル編集者、Jacky Li氏によるリーン思考とリーン思考をどのようにソフトウェア開発に適用するかについての入門です。

Java 6のスレッド最適化は実際に動作しているのか?

2つのパートからなるこの記事では、シングルスレッドベンチマークの助けを借りて、Java 6のスレッドのパフォーマンスに関する疑問に答える試みをしようと思います。

平鍋氏のGordon Pask Award受賞スピーチ

Agile2008において、Gordon Pask Awardの授与式が行われ、その一人として、チェンジビジョンの平鍋氏が受賞しました。本賞は、毎年、アジャイルコミュニティで定評のあるリーダーだけではなく、新たなリーダーになる可能性のある者に贈られるものです。InfoQでは、授与式のスピーチを動画にてお送りします。

Linda Rising氏による「誰を信頼しますか?」

Agile2008の3日目、8/6(水)午前中の、Linda Risingによるセッションです。セッションの冒頭、Linda Risingはとてもゆったりとしたきれいな、わかりやすい英語で話し始めました。

Jean Tabaka氏による「Collaboration Explained--真のアジャイルチームのためのファシリテーションツール」

Jean Tabaka氏の書いた書籍では、会議などのチーム活動において、ファシリテーションの手法とツールについて具体的かつ実践的に説明しています。8/8(金)、Agile2008の最終日の朝のセッションでは、Jean Tabaka氏自身が本の内容をベースとしたセッションを行いました。

Hubert Smits氏による「ゲーム・デザイン・ワークショップ」

Agile2008の4日目となる8/6(木)の8:30から、Hubert Smits氏による「ゲーム・デザイン・ワークショップ」がおこなわれました。ゲームと言っても単なる遊びではなく、「フレームゲーム」と呼ばれる、グループでの情報収集や意志決定、また教育やトレーニングの教材として使えるいろいろなゲームです。

スケーラビリティに関するベストプラクティス:eBayからの教訓

eBayが日々挑んでいる主要なアーキテクチャの勢力は、スケーラビリティです。これはアーキテクチャや設計に関するあらゆる意思決定を特徴づけたり、駆り立てたりします。