InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

分散アーキテクチャにおいて一貫性と交換でスケーラビリティを手に入れる

作者 Floyd Marinescu & Charles Humble , 翻訳者 編集部 投稿日 2008年3月11日

セクション
設計/アーキテクチャ
トピック
パフォーマンス&スケーラビリティ ,
Architecture
タグ
eBay ,
Amazon

システムアーキテクトの役割の重要な側面の1つに、相反する必要条件を比較評価の上、ソリューションを決定することが挙げられるが、1つの特徴のために別の特徴を犠牲にすることで、ソリューションを決定することもしばしばある。システムの規模と複雑性が増すにつれ、アプリケーション構築方法に関する従来の知識が疑われることが益々増えている。例えば、昨年3月にロンドンで開催されたQConカンファレンスにおいて、Dan Pritchard氏がeBayのアーキテクチャについて講演した。この講演の主な要目の1つで、後にあちこちで報道されたのが、eBayはトランザクションを使わず、システムの全体的なスケーラビリティとパフォーマンスをかなり向上させる見返りに、容易なデータ一貫性を手放しているという事実であった。

QConでの話の続きとして、InfoQはDan Pritchard氏にインタビューし、さらに情報を得た。

eBayはなぜトランザクションを使わないのでしょうか。また、アプリケーションレベルのトランザクションに反対する決定はどのように下されるのでしょうか。 

トランザクションを使わない、ということではないのです。複数の構成要素にまたがった依存性を作りだしてしまうため、複数の物理的リソースに及ぶトランザクションを使わないのです。クライアント側の1つの障害によって、データベースリソースがこちらの許容範囲を超える長さで停止する可能性があるため、こうした構成要素がアプリケーションサーバーやデータベース(例えば、クライアント側で管理するトランザクション)の可能性もあります。また、分散トランザクションも使いません。なぜなら、アプリケーションが多数のデータベースに依存することにより、クライアントの効果的な可用性が減少するからです。その代わりに、トランザクション欠如を目指して設計すること、また、データベースの可用性問題が発生した場合でさえも、クライアントがうまく動くように故障モードを組み込むことを選択するのです。

アプリケーションレベルのトランザクションは常に何らかの問題をはらんでいるでしょう。開発者に資源ライフサイクルを管理するように頼むとします。その管理がうまくいかなくなると、バグの発生に直面するでしょう。トランザクションはメモリと大して相違がなく、ライフサイクル問題が原因で、開発者をメモリ管理の責任から解放しようという傾向が言語に共通して見られます。Beanの裏にあるすべてのデータベースオペレーションが同等の重要性を持っていると仮定した場合、EJBに見られるような宣言的トランザクションは、トランザクション管理を単純化する強力なアプローチです。

トランザクションを使うべきか否かの決定は、実際のところ、スケーラビリティと可用性の目標に帰着します。アプリケーションが毎秒何百というトランザクションに手を出す必要があるなら、分散トランザクションではうまくいかないことに気付くでしょう。可用性の3つの9(99.9%)の後にもう1桁加えて4つの9にしたいなら、すべてのデータベースコミットがWebページのコンテキスト内で完了すべきとは決めてかかれないし、まったく完了しないケースもあるでしょう。残念ながら、アプリケーションレベルのトランザクションをいつ取り下げればよいかという、単純な定式はありません。その代わり、あなたはアーキテクトとして、システム上の制約1つを原因として、別の制約を緩和する時期を決めなければなりません。 

どのようにして「入札する(place bid)」のようなもの向けの、独自の原子性を構築したのでしょうか。

「入札する」は原子性よりも、オークションで非常に重要となる最後の数秒間に入札者の邪魔をしないことを目的としているので、「入札する」それ自体が興味深い問題です。入札時間ではなく、表示時間における高位の入札者と入札価格を計算すると決めれば、とても単純であることが分かります。付け値を別の子テーブルに挿入しますが、これは回線争奪性の低いオペレーションです。当該アイテムが示されるたびに、全付け値を取り出し、高位の入札者を決定するビジネスルールを適用します。

あなたの質問の裏にある真の質問は、私たちがどうやって一貫性を達成しているかではないでしょうか。大規模システムで一貫性を達成するためにはACIDを諦め、その代わりにBASEを使う必要があります。BASEは以下を意味します。基本的に:
利用可能
柔軟な状態
最終的な一貫性

クライアントが各要求の最後にデータに求める一貫性を緩和すれば、分散トランザクションを排除し、他のメカニズムを使って矛盾のない状態に到達できるチャンスを得たことになるのです。例えば、上の入札ケースでは、My eBayページのクイック表示で入札者ごとに整理した一覧表もアップデートしています。これには非同期イベントを1対にして使っています。入札してから、その入札がMy eBayに表示されるまでの待ち時間は非常に短い方が望ましいため、メモリ内キューに依存します。しかしながら、メモリ内キューは当てにならないため、入札オペレーションのサーバー側トランザクションを使って、入札イベントをデータ捕捉します。万一、メモリ内キューのオペレーションに支障が生じれば、この入札イベントがリカバリメカニズムとして処理されます。したがって、入札者一覧表は切り離されており、入札テーブルと常に一貫した状態にあるわけではありません。けれども、それは許容範囲であって、入札と入札一覧表の間のACID遵守を回避可能にしてくれるのです。

大規模システムに携わる他のアーキテクトに何かアドバイスはありませんか。

最も単純なアドバイスは、小さくスケールするように設計されたアーキテクチャに資源を追加しても、大きなスケーリングにはならないということです。ACIDや分散トランザクションのような、従来のパターンから脱しなければなりません。慣例に従えば緩和してはいけないような制約でも、緩和するチャンスを自発的に探すようにしましょう。

単純な原理を2つ。何事も分割を予定すること。ACIDではなく、BASEを念頭に置くこと。

Amazon最高技術責任者のWerner VogelsもQConで講演(参考プレゼン・英語)したが、Eric BrewerのCAP定理を引用して、トレードオフの背景をさらに提供した。この定理は、ACID対BASEについても取り上げた2000年のPODC会議(PDF書類)の講演(PDF・英語)で説明されたもので、共有データシステムの3つの特性である「データ一貫性」、「システム可用性」、「ネットワークのパーティショニング耐性」のうち、同時に起こり得るのは2つだけと述べている。つまり、ネットワークのパーティショニングに耐性のないシステムが、トランザクションのような一般のテクニックを使って、一貫性と可用性を達成することができる。しかし、AmazonやeBayのような大規模分散システムでは、ネットワークパーティショニングは当然である。その結果、超大規模な分散システムを扱うアーキテクトは、一貫性もしくは可用性の必要条件緩和を決断しなければならないということである。両選択肢とも開発者に何らかの負担を強いるものであり、開発者は自らが取り組んでいるアーキテクチャの特徴を理解している必要がある。例えば一貫性の緩和を決めたなら、システムへ書き込んでも、それに対応する読み込みが即座に反映されない状態にどのように対処すべきかを、開発者は決定する必要がある。Windows LiveプログラムマネージャーのDare Obasanjo氏は自身のブログ(source)に次のように書いている。

Windows Liveプラットフォームでも場合によっては、同様のことを実行しますが、トランザクションにタダでついてくるエラーリカバリがアプリケーション開発者の手に委ねられる事実について、開発者が不平を言うのを聞いてきました。最大の不満はいつも、複雑なバッチオペレーションをロールバックすることに関係しています。

興味深いのは、大規模Webサイトの多くが、独力で同じ結論に達したように思われることである。ノード数の少ないより小規模なシステムは、まだこうしたトレードオフを心配する必要はないが、増大を続ける利用者に対してスケールして拡大する企業システムでも、eBayやAmazonが対処しているような種類の問題が発生し始める可能性は高い。

原文はこちらです:http://www.infoq.com/news/2008/03/ebaybase

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。