Azure Services Platform 開発コンテスト

2009/07/10 18:00:00

 今回は番外編ということで、「Azure Services Platform 開発コンテスト」に応募したサイトの宣伝をさせてもらいます。

 「Azure Services Platform 開発コンテスト」とは、マイクロソフトのクラウドサービスであるAzure上で動作するwebサイトを作成するプログラミングコンテストです。

 コンテストについては、こちらを参照してください。

 ペアプログラミングのためのwebサイトです。同じページを見ている人達とリアルタイムでペアプロが行えます。Google Waveと同じようなコラボレーションツールを作りたいと思い、作成しました。プログラミング以外にも、執筆活動とかのコラボレーションに使えるかもしれませんし、まったく使えないかも知れません。

 ※7月10日より、一般投票が始まりますので、もし面白いと思ったら、投票いただけますとうれしいです。

◇サイトイメージ

Photo

◇アーキテクチャ

 ASP.NETの非同期ハンドラとprototype.jsを使用し、Cometを実装し、リアルタイム通信を行っています。

 今回はデモのため、1サイトの仮想マシンしか使用しません。クライアントの接続も1サイトになるため、いちサイトで完結する単純なCometになっています。Webサーバが複数サイト存在する場合は、クライアントがどのサーバに接続するかわからないため、Webサーバ間での通知機能が必要となりますが、今回は実装していません。

 WorkerRoleとかキュー機能とか使えばできそうな気がしますけど、気のせいかも知れませんし、そこまでの才能と暇がありません……。

 JavaScriptのSyntaxHighlighterライブラリを使用して、ソースコードの色分け表示を行いたかったのですが、リアルタイムでviewを更新するのと相性が悪い? のか、簡単にできず見送りました……。(html上に残骸が残っています。)

◇制限事項

  • difff & Patch 機能を付けたかったなぁ……。
  • このURLで全てのデータが更新されてしまいます。権限などはありませんので、無条件に書き換えられます。
  • 完全に後勝です。ファイル名がかぶった場合、上書きされます。
  • ファイル名が違うデータを修正しているつもりでも、URLは共通ですので、viewエリアは、リアルタイムで更新されます。
  • コメント履歴は保存されません……。すいません。

◇雑感

 デモとはいえ、いいかげんに作り過ぎていてペアプロというより、邪魔のしあいのようなサイトになってしまいました。しかし、不特定多数とのリアルタイム更新を楽しんでもらえれば幸いです。

 Azureのプログラミングは、ストレージサービス以外は、普通のASP.NETと同じですね。わたしは、最近ASP.NETから離れていたので、微妙な感じの仕上がりですが、慣れている方はすんなりとAzureライフがおくれることと思います。

 ローカル環境からAzureプラットフォームへのデプロイは簡単ですね。GAE/Jには負けますが……。ローカル環境のテーブルを自動生成してくれているようなのですが、ここら辺がどのような仕組みでやっているのかよくわかっておらず、何だか気持ち悪いです。

 ローカル環境からでもAzure上のストレージサービスは使えますので、ネットに繋がる環境で開発するのであれば、Azureストレージを使った方がよい気がします。

◇参考

  1. 開発環境構
    ・無償開発環境で試すWindows Azureクラウド開発
    Azureの開発は、全て無料のツールで行えます。
    ※ただし、パソコンとWindows Vistaまたは、2008 Serverが必要です。
  2. ASP.NETの非同期ハンドラ
    ASP.NETでCometを利用したチャットを実装する

    Cometで通信するために非同期ハンドラを使用します。
    このページを参考にしました。というより、通信ライブラリは、”ほぼ”そのままです。
  3. ストレージサービス
    Windows Azureアプリケーションの実践(1)~環境構築とプロジェクト作成
    ストレージサービスを利用する場合に参考になります。

 

クラスタリングカタログ

2009/06/22 16:00:00

1.クラスタリングカタログ

 クラスタリングとは、複数台のサーバを使用して、負荷分散を行い、可用性や障害性を向上させることです。クライアントからは、1台のサーバに見えるようにすることからクラスタリングと呼ばれます。クラスタリングには大きく分けて4種類あり、以下の2つの項目の組み合わせで目的が決まります。

  • 共有ディスクの有無
    共有ディスクとは、クラスタリングを構成する各サーバで共有接続しデータを保持するディスクのことです。
  • Active型 or Stanby型
    「Active」とは、サーバがサービスを提供しているオンライン状態のことをいいます。「Stanby」とは、サーバがサービスを提供していないオフライン状態のことをいいます。サービスは提供していませんが、電源が入った状態でいつでもサービスを開始できる状態になっています。

2.共有ディスクなしのActive-Active型

0201

 Webサーバの負荷分散を行う場合によく使用される構成です。

 各ノードともActiveとなっており、上位のロードバランサー(※1)が、クライアントアプリケーションの要求を割り振ることにより、負荷分散されます。共有ディスクを使用しないため、ノード間のデータ共有を行う場合、データの同期を行う必要があります。そのため、Webサーバのようにデータを共有する必要がないサービスを負荷分散する場合によく使用されます。DBサーバのようにデータを保持するサービスをこの構成でクラスタリングする場合、データの保持方法と同期方法を見当する必要があります。

 ※1:ロードバランサー:クライアントアプリケーションの要求を各サーバに振り分けて負荷分散を行う専用のハードウェアです。ロードバランサーを配置するとクライアントアプリケーションからは、サーバが1台であるように扱えるようになります。

  • 長所
    ・ノードの台数を増やすことにより、簡単に負荷分散が可能

  • 短所
    ・データをノード間で同期させる必要がある場合、複雑な同期処理が必要
    ・ロードバランサが必要
    ・ロードバランサが壊れた場合、サービスが停止してしまうため、二重化の検討が必要

 このように、特定のハードウェアが壊れた場合にサービスが停止する箇所を「シングルポイント障害」と呼びます。

DB Replicationでの使用例

 DBを共有ディスクなしのActive-Active型でクラスタリングする場合は、下図のように各サーバの役割(マスタスレーブ)を決めて構成します。

0202

◇役割

  • マスタ
    更新可能なデータベースです。データが更新された場合、更新データをスレーブサーバに伝搬させます
    ※障害対策のためにマスタサーバを後述の「Active-Stanby構成」にする場合もあります
  • スレーブ
    読み取り専用のデータベースです。負荷に応じて台数を増やします。

 マスタとスレーブに役割を分けるのは、更新可能なサーバが複数存在すると、データの更新が競合しないようにするためのロックや同期処理が複雑となり、負荷分散の役割を果たさなくなるためです。

 ※詳細は、後述の「共有ディスクありのActive-Active型」を参照。

◇チューニングポイント

 読み取り専用のスレーブは、負荷に応じて台数を増やせますが、効果は以下のようなサービスの特徴に依存します。参照が多いサービスの場合は、参照負荷が高いため、スレーブを増やせばよいですが、更新が多いサービスの場合、スレーブを増やすとマスタからスレーブへの更新伝搬に負荷が掛かり過ぎ逆にパフォーマンスが低下する場合があります。

 マスタとスレーブの参照先の判断は、クライアントアプリケーションで行います。更新処理を行う場合にマスタサーバに接続する形となります。そのため、クライアントとサーバの間には、ロードバランサではなく、HUBを配置する形となります。スレーブの台数を増やす場合は、クライアントアプリケーションで接続するスレーブを決めるか、スレーブの上位にロードバランサーを配置します。

0203

◇安物買いの銭失い(銭で済めばいいけどね)

 間違っても、”うっかり”安いロードバランサを買ってはいけません。負荷がかかると不安定になる物や、リブートするとなぜか設定が消える(忘れる?)ものもあります(なぜだ? っていうか、負荷分散するためのロードバランサが負荷に弱いってどういうこと?)。

 また、高価なロードバランサが買えない貧乏人は、安いサーバにLinux等のフリー(無料!)なUNIXOSを入れて、リバースプロキシ機能があるソフトウェアをインストールし、ロードバランサにしたてあげる方法もあります。しかし、設定をミスったり、あまりにも安いハードウェアを使用すると痛い目を見ます!!このコースは、富豪コースなので、そんなお方はいらっしゃらないとは思いますが……。

3. 共有ディスクなしのActive-Stanby型

0301

 ノードAがActiveでサービスを行い、ノードBはStanbyとなり待機している構成です。ノードAに障害が発生した場合、ノードBにサービスを切り替えます。この切り替え作業のことをフェールオーバといいます。

 この構成は、障害対策のためによく使用されます。

 共有ディスクを使用しないため、ActiveのノードAでデータが更新された場合、更新データをノードBに同期させる必要があります。また、ノードAからノードBに切り替わった際にクライアントアプリケーションは、ノードBに接続する必要ありますが、仮装IPという仕組みを使い、Activeになっているサーバが仮装IPという代表IPアドレスで、クライアントアプリケーションからの接続を待ち受けます。この構成の場合、データの同期と仮装IPの仕組みを提供するためのクラスタリングソフトウェアを使用する必要があります。

  • 長所
    ・他の構成に比べて、ハードウェアが安価
    ・データの同期と障害発生時の切り替えは、クラスタソフトが自動的に行うため、運用管理が楽
  • 短所
    ・負荷分散の効果がない
    ・データ同期中に障害が発生するとデータが失われる可能性がある
    ・データの同期処理にサーバの負荷がかかる

◇使用例(スタンバイデータベース)

 この構成の使用例として、Oracle DataGurdを使用したスタンバイデータベースを説明します。

 スタンバイデータベースは、障害対策のために使用します。基本的には、Activeのサーバとは、別の場所でStanbyのサーバを動作させ、地震や火災などの物理的かつ根本的、致命的な障害に対応するために使用します。データベースの場合、更新ログ(REDOログ)をStanby状態のノードに送ることにより、データの同期を取ります。

0302


4. 共有ディスクありのActive-Stanby型

0401

 「共有ディスクなしのActive-Stanby型」を共有ディスクを有りにした形です。Activeになっているノードが、共有ディスクをマウント(※)します。Stanbyになっているノードは、共有ディスクを使用しません。ActiveとなっているノードAに障害が発生すると、共有ディスクを切り離し(アンマウント)、ノードBにフェールオーバします。そして、ノードBが共有ディスクをマウントします。ノードの障害を検知し、共有ディスクのアンマウントとマウントを管理するためにクラスタリングソフトを使用します。

 障害検知のためにお互いを監視することをハートビート(死活監視)といいます。フェールオーバした際に、サーバが切り替わるため、クライアントアプリケーションの接続先も切り替える必要がでてきます。しかし、フェールオーバが発生する度に、切り替えていると運用が大変ですので、仮想IPという仕組みを使い、クライアントアプリケーションからは、同じIPアドレス(仮想IP)で、サーバを参照できるようにします。仮想IPは、クラスタリングソフトによって管理され、Activeとなっているサーバに割り当てられます。

 ※マウント:共有ディスクをOSレベルで外付けハードディスクとして認識させること。複数ノードで同時に共有ディスクをマウントすることはできません。データの不整合が発生するためです。

  • 長所
    ・障害発生時に自動でフェールオーバするため運用管理が楽
    ・データの同期を行う必要がない
  • 短所
    ・負荷分散の効果がない
    ・共有ディスクが高価
    ・共有ディスクが単一障害点(※)となる

 ※単一障害点(Single Point of Failure)とは、その箇所に障害が発生すると、サービス全体が停止してしまう障害となる箇所を指します。

5. 共有ディスクありのActive-Active型

0501

 クラスタを構成するすべてのノードがActiveとなり、並列してサービスを行うため、負荷分散と障害対策の両方の効果が期待される構成です。しかし、データの更新が複数ノードで同時に発生する可能性があるため、ロックと同期処理を行いデータの競合を防ぐ必要があります。そのため、アプリケーションの特性を生かした物理配置を検討する必要があります。下手にチューニングをした場合、もしくはチューニングしない場合、1台のサーバよりも性能がでないことがあります。データのロックと同期のオーバーヘッドがかかるためです。

 共有ディスクありのActive-Active型の詳細は、

を参照してください。

  • 長所
    ・負荷分散が可能
    ・フェールオーバのオーバーヘッドが少ない
  • 短所
    ・管理が複雑
    ・効率的な負荷分散を行うためには、アプリケーションの特性を活かした物理設計が必要

空想ガレージクラウド~サーバ戦略カタログ~

2009/06/05 20:15:00

 もし、自分のガレージに、何万台規模のデータセンターがあったとしたら、どんなサーバ&ネットワークを構築するだろうか?

 Google、Amazon、Microsoftなどのクラウドベンダーに負けないようなデータセンターがガレージに……。

 どんだけ大きいガレージなんですか?

 いや、猫の額レベルです……電気も通っておりません!!

 そんなことを考えながら、クラスタを代表とするスケールアウト技術や、複数CPUを搭載した高価なマシンを使用するスケールアップ技術、金がない奴は汗をかけということで、キャッシュ機能などのテクニックを使い、いかに少ないサーバで構築するかを検討し、空想上のガレージクラウドを構築したいと思います。

 ということで、「富豪クラウドコース」と「貧乏クラウドコース」の2種類をご用意いたしました。

◇富豪クラウドコース

 金持ちの貴方だけのために、ご用意させていただきました。こちらのコースの特徴は、「複数のサーバをいかに使い倒すか?」と「複数CPU・HDDを搭載した高級コンピュータを奴隷のように酷使するか?」を説明させていただくコースです。生かさず殺さずということで、バックアップや障害発生時のリカバリについても触れさせていただいておりますので、ご安心ください。

 ○メニュー

  • クラスタ
  • サーバ分割
  • スケールアップ
  • パーティショニング&並列処理
  • MapReduce

◇貧乏クラウドコース

 処理性能をサーバ台数による力技で解決する「富豪コース」はエレガントではないと思う「清貧」の貴方にお進めするコースです。キャッシュ技術を駆使して、少ないサーバで高負荷をさばきましょう。しかし、「貧すれば鈍する」ともいいます。目先のことだけではなく、クラウドの将来について熱く語り、一緒に夢を見ましょう!!

 ○メニュー

  • キャッシュ
  • データストア
  • KeyStore型DB
  • クラウドDBの未来
  • データ統合の未来

 次回から「富豪クラウドコース」の「クラスタ」が始まります。 どうぞお楽しみに!!

―CAP定理のジレンマをOracle RACで理解する―(2/2)

2009/06/04 18:00:00

3. Oracle RACアーキテクチャ

 Oracle RACは、共有ディスク有りのActive-Active型クラスタリング構成となります。共有ディスク有りとは、複数のサーバで1つのディスクを共有しデータベースファイルを配置する構成です。Active-Activeは、Webサーバを複数台並べて、ロードバランサで負荷分散を行うのと同じ構成です。複数サーバを並べることにより「パフォーマンス」と「障害復旧性」の向上を図ります。

 Webサーバは基本的にステートレスで、状態(データ)を保持しないので、複数台並べやすいのですが、データベースの場合はそう簡単にはいきません。データを管理しますので、「データの同期化」を行う必要があります。

 この「データの同期化」が重要なポイントとなります。複雑なアーキテクチャとなりますが、データベース3大原則「パフォーマンス」「データの一貫性」「障害復旧性」を考えれば、理解の助けになるかと思います。

 まず、Oracle RACのアーキテクチャを図示します。

3

 AとBの2台のサーバに共有ディスクがつながる構成です。各サーバにインスタンスが存在し、メモリにデータバッファとログバッファが保持されます。共有ディスク上にデータファイルが配置され、REDOログファイルとUNDOデータは、サーバごとに別々のファイルとして配置されます。

 なぜ、REDOログファイルとUNDOデータは、サーバ毎に配置されるのでしょうか? データの検索と更新時の動作について、解説しながら説明したいと思います。

 以下のように4サーバでRACを構成した場合を例にとります。

3b

 まず、実際の動作の説明の前に、RACを構成するための3大原則を説明します。

3-1. パフォーマンス

 パフォーマンスのために、「データ分散」と「インスタンス間のデータ転送」を行います。

  • データ分散
    効率良く負荷分散を行うために、各サーバにデータを分散して割り当てます。インスタンス起動時にハッシュアルゴリズム(※1)により、該当データを管理するサーバを決定します。実際には、管理されるデータは、レコード単位ではなく、データブロック(※2)と呼ばれる固まりで管理されます。このデータを管理するサーバのことをリソースマスタと呼びます。
    (※リソースマスタといいますが、実際にやっていることはリソースの管理「データを保持するのではなく、データがどこにあるかを管理する。」ですので、リソースマネージャという方が適切かと思います……。)

    ※1:分散処理にかかせないのが、ハッシュアルゴリズムです。クラウドのアーキテクチャを説明する際に必ず出てくるキーワードです。データを分散させ、かつ分散させた場所が後で同じロジックを通せば、特定できるアルゴリズムです。
    ※2:データを管理するための物理的な最小単位です。
  • インスタンス間のデータ転送(キャッシュフュージョン)
    4台のサーバは、負荷分散されそれぞれがクライアントから要求を受け付けます。要求を受け付けたサーバが、必要とするデータをデータバッファに確保して、クライアントに返します。その際にデータのありかをリソースマスタに問い合わせます。クラスタ内のどのサーバのインスタンスにも存在しない(まだディスクから読み取られていない)場合、共有ディスクから取得します。あるサーバのインスタンスに存在する場合、データを転送します。
    このデータ転送のことをキャッシュフュージョンといいます。
  • 要求受付サーバへの キャッシュフュージョン
    要求を受け付けたサーバが大量のデータを必要とする場合、データの管理単位であるデータブロックで考えても大量のブロックが必要となります。ブロック毎にリソースマスタが決まりますので、大量のブロックを取得する場合、複数のサーバからキャッシュフュージョンでデータを集めます。

3-2. データの一貫性

 クラスタ構成で、データの一貫性を保証するため、「ロックと同期」「障害サーバの切り離し」「サーバをまたぐトランザクション管理」を行います。

  • ロックと同期
    データバッファは、遅延書き込みにより、データファイルに書き込まれますので、複数インスタンスが存在する場合、データの整合性が崩れてしまいます。これを回避するために、リソースマスタを使用して、データブロック単位でロックを行います。

    最新の更新データブロックは、1サーバのみに存在するようにします。但し、「読み取り一貫性」も保証する必要がありますので、トランザクションがCOMMITされる前のデータをUNDOとして保持する必要があります。このUNDOデータは、各サーバで保持されますが、キャッシュフュージョンのタイミングでディスクに書き出されます。サーバ障害によりサーバが切り離される可能性があるためです。

    ※リソースマスタ管理:「ロックモード(共有モード(参照)・排他モード(更新))」「ロック範囲(ローカル、グローバル)」「UNDOのありなし」で管理します。
  • サーバをまたぐトランザクション管理
    RACでは負荷分散が行われるため、クライアントの要求が、必ず同じサーバに行くとは限りません。サーバをまたいだトランザクション管理が必要となります。

    また、障害により、サーバが切り離された場合であっても、クライアントのトランザクションが継続できないと可用性が良いとはいえません。この仕組みについても、実際の動作にて説明します。

3-3. 障害復旧性

  • 障害サーバの切り離し
    各サーバと共有ディスクは、SAN(※ 1)等で接続され、各サーバ間はネットワークで接続されます。もし仮にあるサーバのネットワークアダプタのみに障害が発生した場合、データの同期がされていないデータベースバッファがデータファイルに書き込まれる可能性があります。これを回避するために、サーバ間で死活監視を行い、障害が発生したサーバを切り離します。
    サーバが切り離された場合でもデータの不整合が起きないようにするための仕組みが必要になります。これについては、実際の動作にて説明します。

    ※1: Storage Area Network:ストレージ専用の高速ネットワーク。SCSIの後継機的位置づけ。
  • リカバリ
    もし、RACを構成する全サーバに障害が発生した場合、Oracleはサーバ毎のUNDOデータとREDOログファイルを使用してリカバリを行います。

3-4. データ検索時の動作
 
 それでは、データ検索時にどういった動作になるか説明します。

34a

 クライアントからサーバCが、SELECT要求を受け取り、該当データはサーバDが管理するデータブロックであったとします。

  1. データ要求
    クライアントからSELECT要求を受け取ったサーバCは、ハッシュアルゴリズムにより該当データのリソースマスタであるサーバDを割り出し、サーバDにデータ参照要求を送ります。
  2. ディスク読み取り通知
    サーバDのデータバッファに該当データが存在する場合は、サーバCに参照権限でキャッシュフュージョンします。データバッファに存在しない場合、サーバCに共有ディスクから読み取るよう通知します。
  3. ディスク読み込み
    サーバDからディスク読取通知を受け取ったサーバCが共有ディスクからデータを読み込みます。
  4. バッファ確保
    読み込んだデータをサーバCのデータベースバッファに保持します。

    ※この場合、リソースマスタのサーバDのデータベースバッファにはデータは保持されません。

 該当データがサーバCのデータベースバッファに保持されている状態で、次にサーバBに同じデータのSELECT要求があった場合は以下のようになります。

34b

  1. データ要求
    クライアントからSELECT要求を受け取ったサーバBは、リソースマスタであるサーバDにデータ参照要求を送ります。
  2. サーバBの読取要求通知
    サーバDは、サーバCにサーバBからの参照要求を通知します。
  3. データ転送
    サーバBからの要求を受け取ったサーバCは、サーバBに参照権限でキャッシュフュージョンを行います。
  4. データ保持通知
    参照モードでデータを保持していることをリソースマスタに通知します。

    ※今後、同じデータブロックの参照要求が来た場合に備えるためです。

3-5. データ更新時の動作

 該当データがサーバCのデータベースバッファに保持されている状態で、サーバBが同じデータブロックの更新要求があった場合の動作は、以下のようになります。

35b

  1. データ要求
    クライアントから更新要求を受け取ったサーバAは、リソースマスタであるサーバDにデータ更新要求を送ります。
  2. サーバAの読取要求通知
    サーバDは、サーバBにサーバAからの更新要求を通知します。
  3. データ転送
    サーバAからの要求を受け取ったサーバBは、サーバAに更新権限でキャッシュフュージョンを行います。サーバBが保持していたデータブロックは、UNDO情報として保持します。
    ※サーバAで更新されるデータが最新版となるためです。

    また、キャッシュフュージョンのタイミングで、UNDO情報とREDOログバッファを共有ディスクに書き出します。
    ※障害発生時のサーバ切り離しに備えるためです。
  4. データ保持通知
    更新モードでデータを保持していることをリソースマスタに通知します。

3-6. Oracle RACのボトルネックとCAP定理について
 Oracle RACの検索、更新時の動作を説明しましたが、いかがだったでしょうか?

 検索に比べて、更新時の動作が複雑であったかと思います。幾分か説明を端折っている個所もありますので、実際にはより複雑な同期処理を行っています。ここで、CAP定理の話に戻りますと、Oracle RACは、CAPを満たしているといえるでしょうか?

 まず、P(サーバの台数)を増やした場合を考えてみます。RACを構成するサーバを1000台に増やすことは可能でしょうか? 残念ながら、現実的ではありませんし、わたしの知る限りでは事例は存在しません。せいぜい数十台レベルです。サーバの台数を増やした場合、それに比例してデータの分散率が増えます。その結果、データの同期処理が多くなりパフォーマンスが劣化します。

 Oracle RACでよく発生するボトルネックは、データ同期処理であるキャッシュフュージョンです。

 Pを満たし、C(データの一貫性)を確保しようとすると、同期処理やロック処理に時間がかかり、ユーザの要求に対して待ちが発生します。つまり、A(システムの可用性)を満たすことができなくなります。

 現実的には、CAPそれぞれのバランスを取りながら設計することになります。

 クラウドの場合も同じようにAとPを保証し、Cに関しては「Eventually Consistency」という考え方で対応する形となります。

4. 参考資料

     

―CAP定理のジレンマをOracle RACで理解する―(1/2)

2009/06/01 17:05:00

 2009年は、いよいよクラウド時代の幕明けですね。世の中的にも大不況ですから、導入・運用コストを下げることが期待されるクラウドはまさにうってつけではないでしょうか? しかし、インターネットのあちら側にあるシステムのことは、いまいちピンとこないことが多いですね。最近よく聞く「CAP定理」なんてのもそのひとつだと思います。この定理時代は、前からあったものですが、もっともらしいことを言って煙(いや雲か。)に巻かれている気がしませんか。そんな「CAP定理」をOracleの分散データベースである「Oracle RAC」を例に取り説明してみたいと思います。

1. CAP定理のジレンマ

 クラウドの特徴のひとつとして、CAP定理が挙げられます。

 CAP定理とは、以下の3つを同時には満たせないという定理です。

  • C:Consistency(データの一貫性)
    データの更新後、ほかからそのデータを参照した場合、必ず更新後のデータが参照できることを保証すること。
  • A:Availability (システムの可用性)
    どのような状態であっても、データの参照が可能であること。例えば、ロック待ちにならない。
  • P:Tolerance to network Partitions (ネットワーク分断への耐性)
    データが複数のサーバに分散されており、1つのサーバに障害が発生し、データが破損した場合でも、別サーバのレプリケーションにより、データが参照可能であること。

 例えば1台のサーバで動作するデータベースを考えると、上のCAPのうち、CAを満たしているが、Pは満たしておりません。APを満たしていて、Cを満たしていない例としてよく挙げられるのがDNSです。また、CPの例としては、ロックの塊である分散データベースがあげられます。

 例を挙げてみましたが、各項目の正確な定義が提示されていないため、いまいちピンとこない定理ですね。

 そこで、Oracleのクラスタリング技術である「RAC」のアーキテクチャを説明することにより、「データ一貫性」、「パフォーマンス」、「障害復旧性」の観点からCAP定理を理解したいと思います。

 いきなり、「Oracle RAC」に入る前に基盤技術となる「データベースアーキテクチャ」から説明したいと思います。

2. データベースアーキテクチャ

 この章では1台のサーバで動作するOracleデータベースのアーキテクチャを説明します。

※尚、あくまでCAP定理の説明が目的ですので、データベースのアーキテクチャとしては、実際より簡略化して説明しております。 Oracleアーキテクチャーの詳細が知りたい方は、後述の参考資料を参照ください。

 コンピュータの3大要素「中央演算処理装置(CPU)」「記憶装置(Memory)」「入出力装置(HDD)」と同じようにデータベースでも以下の「データベースの3大要素」が重要です。

  • プロセス (CPU)
  • 共有メモリ(Memory)
  • データファイル&ログファイル (HDD)

 以下にOracleアーキテクチャを図示します。

2_3

※1:Oracle インスタンス:プロセス(DBWR、LGWR)と共有メモリの集合体です。

※2:SGA(システムグローバルエリア):データやログ情報を保存するためのメモリ領域です。

※3:DBWR(データベースファイルライター):更新されたデータベースバッファの内容をデータファイルに書き込むプロセスです。

※4:LGWR(ログファイルライター):ログバッファをREDOログファイルに書き込むプロセスです。

 最初に、クライアントプログラムからデータを検索する場合の動作を説明します。

◇データ検索時の動作

  1. クライアントプログラムからSELECT文をサーバプロセスが受け取ります。
  2. サーバプロセスは、SELECT文を解析し、SGAのデータバッファに要求されたデータが存在するか検索します。
  3. データバッファに存在しない場合、データファイルからデータを読み込みデータバッファに保持し、クライアントプログラムに返します。

 次に、データを更新する場合の動作を説明します。

◇データ更新時の動作

  1. クライアントプログラムからUPDATE文をサーバプロセスが受け取ります。
  2. サーバプロセスは、UPDATE文を解析し、SGAのデータバッファに更新対象のデータが存在するか検索します。
  3. データバッファに存在しない場合、データファイルからデータを読み込みデータバッファに保持し、データバッファ上のデータを更新します。同時にデータバッファ上にUNDO情報(更新前のデータ)を保持し、更新後データをロブバッファに保持します。
    ※この時点では、メモリ上のデータ(データバッファとログバッファ)のみを更新し、ファイルには書き出しません。
  4. クライアントプログラムからCOMMIT命令をサーバプロセスが受け取ります。
  5. サーバプロセスは、COMMITのタイミングで、ロブバッファをREDOログファイルに書き込みます。
    ※この時点では、データバッファは、データファイルに書き出しません。データバッファに更新データを貯めて、まとめてデータファイルに書き出します。
  6. データがCOMMITされたことをクライアントプログラムに通知します。

 データ更新時の動作は、検索時の動作と比べて複雑です。なぜでしょうか?

 データベースに必須とされる3大原則を満たすためです。

◇「データベースの3大原則」

  • パフォーマンス
  • データの一貫性
  • 障害復旧性

2-1. パフォーマンス

 データベースは、パフォーマンスが命です。大量データの読み込み、書き込みを速くするためには、やはり、3つのポイントがあります。

◇「パフォーマンスの3大原理」

  1. メモリの活用
  2. まとめて処理
  3. 用途別のアクセス方法

◇メモリの活用

 HDDよりもメモリにアクセスする方が何百万倍も高速です。頻繁に使うデータをメモリ上に配置することをキュッシュするといいます。このキャッシュのアルゴリズムがパフォーマンスの鍵となり、またサイズ設定等が重要なチューニングポイントとなります。このため、クライアントプログラムから検索や更新の要求がきた場合、サーバプロセスは、データをメモリにキャッシュします。

◇まとめて処理

 コンピュータの仕組みとして、細かい処理を複数実行するよりも、まとめて実行した方が効率がよくなります。そのためデータを更新する場合、まずメモリ上のデータを更新し、HDD上のデータはまだ更新しません。ある程度の量がたまった段階でHDDに書き込みます。データ更新時にHDDに書き込むとI/O待ちでパフォーマンスが低下するためです。このことを遅延書き込みといいます。

◇用途別のアクセス方法

 SGA上にデータバッファとログバッファの2種類が存在しますが、それぞれ、データファイルとREDOログファイルに対応付けられます。そして、データファイルはランダムアクセスを行う必要がありますが、REDOログファイルはシーケンシャルアクセスで済むという特徴があります。

  • ランダムアクセス

      ファイル全体を不規則に読み込み、書き込みを行う操作のことを言います。データファイルの場合、該当データがデータファイルのいろいろな箇所に存在するため、不規則にファイルを読み込む必要があります。ファイルを保存するHDDは、円盤の磁気ディスクを物理的にアームが動いて読み取る必要があるため、不規則な読み込みを行うとアームを動かすための時間がかかります。

  • シーケンシャルアクセス

      ファイルの頭から最後尾に向かっての順次読み込みや、最後尾への順次書き込みの操作をいいます。この場合、アームは順次に動けば良いのでアクセスはランダムアクセスに比べて高速です。

 このランダムアクセスとシーケンシャルアクセスの特徴をふまえて、データファイルとREDOログファイルを別々のHDDに配置するのが、良い物理設計となります。また、データファイルは複数のHDDに配置し、I/Oを分散させることでパフォーマンスの向上を狙います。ハードウェア的には、データファイルを配置する箇所は「RAID 10構成※1」とし、ログファイルを配置する箇所は「RAID 1(ミラーリング)」とするのがよく行われます。

※1:RAID 10:RAID 1のミラーリングとRAID 0のストライピングを合わせた構成です。

2-2. データの一貫性

 いくらパフォーマンスが速かったとしても、データの一貫性が保証されいなければ、意味がありません。データベースはトランザクション管理を行うことにより、データの一貫性を保証します。トランザクション管理には、「ACID」と呼ばれる機能が必要となります。「ACID」とは、以下の4つの機能の頭文字を取ったものです。

  • Atomicity(原子性)
    トランザクションに含まれる処理が全て実行されるか、または全く実行されないことを保証する機能です。
  • Consistency(一貫性)
    トランザクション開始と終了時にあらかじめ与えられた一貫性を満たすことを保証する機能です。
  • Isolation(独立性)
    トランザクション中に行われる操作の過程が他の操作から隠蔽されることを保証する機能です。トランザクション途中のデータが他トランザクションから参照されないようにします。
  • Durability(データの永続化)
    トランザクション操作が完了したタイミングで、その操作が永続的となり、結果が失われないことを保証する機能です。

 クラウド環境では、今回説明するCAP定理により、システム全体としてACIDを完全に満たすことは難しいため、BASEという考え方でシステム設計を行います。またこの中で、Eventually Consistencyという考え方が提案されております。このACIDとBASEについては、別記事にて説明します。ここではACIDについて概略だけ述べます。簡単にいうと、トランザクション処理で、処理開始前と開始後でデータの一貫性が保証されており、トランザクション処理途中のデータは、ほかのトランザクションから参照できないようにすることです。Oracle では、COMMIT時にログバッファを必ず、REDOログファイルに同期させることと、データバッファ上のデータ更新時にUNDO情報を作成することにより実現しております。

◇トランザクション処理と読み取り一貫性

 以下に、トランザクション処理と読み取り一貫性を図示します。

22_5

2-3. 障害復旧性

 ACIDDurability(データの永続化)を満たすためには、COMMITされたデータは、例え直後に障害が発生したとしても、復旧できる仕組みが必要となります。Oracleでは、I/O負荷を下げるためにデータファイルの遅延書き込みを行いますが、メモリ上のデータバッファが、まだデータファイルに書かれていない時にサーバがダウンした場合、どうなるでしょうか?

 COMMIT時にREDOログファイルが書かれていることが保証されているため、REDOログファイルが破損しない限り、復旧可能となります。REDOログファイルは非常に重要なため、必ず二重化を行います。

@IT Special 注目企業
@IT Special ラーニング

エンジニアライフ 最新の投稿コラム

@IT自分戦略研究所 新着記事

エンジニアライフ スポンサー

コラムニスト プロフィール

森俊夫
日々、業務システムやオンラインWebサービスを企画・開発している現役エンジニアによる技術コラムです。

2011年3月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

バックナンバー

月間バックナンバー

カテゴリー

検索

Powered by TypePad
- PR -
@IT Special 注目企業
インデックス

@IT Special ラーニング