# HG changeset patch # User shoshi # Date 1302702982 -32400 # Node ID a78fbda28da40174557b6159f5c4ae7d919bb8e7 hg init diff -r 000000000000 -r a78fbda28da4 graffle/concurrent_client.graffle Binary file graffle/concurrent_client.graffle has changed diff -r 000000000000 -r a78fbda28da4 graffle/implemented_system.graffle Binary file graffle/implemented_system.graffle has changed diff -r 000000000000 -r a78fbda28da4 graffle/multistage_cache.graffle Binary file graffle/multistage_cache.graffle has changed diff -r 000000000000 -r a78fbda28da4 graffle/structure_image.graffle Binary file graffle/structure_image.graffle has changed diff -r 000000000000 -r a78fbda28da4 graffle/wrong_keyspace.graffle Binary file graffle/wrong_keyspace.graffle has changed diff -r 000000000000 -r a78fbda28da4 img/benchmark2.png Binary file img/benchmark2.png has changed diff -r 000000000000 -r a78fbda28da4 img/concurrent_client.png Binary file img/concurrent_client.png has changed diff -r 000000000000 -r a78fbda28da4 img/destruction_tree.png Binary file img/destruction_tree.png has changed diff -r 000000000000 -r a78fbda28da4 img/implemented_system.png Binary file img/implemented_system.png has changed diff -r 000000000000 -r a78fbda28da4 img/keyspace_definition.png Binary file img/keyspace_definition.png has changed diff -r 000000000000 -r a78fbda28da4 img/monotonic_tree.png Binary file img/monotonic_tree.png has changed diff -r 000000000000 -r a78fbda28da4 img/multistage_cache.png Binary file img/multistage_cache.png has changed diff -r 000000000000 -r a78fbda28da4 img/multistaged_cache.png Binary file img/multistaged_cache.png has changed diff -r 000000000000 -r a78fbda28da4 img/prototype_keyspace.png Binary file img/prototype_keyspace.png has changed diff -r 000000000000 -r a78fbda28da4 img/structure_image.png Binary file img/structure_image.png has changed diff -r 000000000000 -r a78fbda28da4 img/wrong_keyspace.png Binary file img/wrong_keyspace.png has changed diff -r 000000000000 -r a78fbda28da4 s5-blank.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s5-blank.html Wed Apr 13 22:56:22 2011 +0900 @@ -0,0 +1,323 @@ + + + + + +Cassandraを使ったスケーラビリティのあるCMSの設計 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

Cassandraを使ったスケーラビリティのあるCMSの設計

+

玉城 将士,河野 真治

+

琉球大学 情報工学科

+
+ + + +
+

本研究の概要

+

スケーラビリティのあるCMSを開発するため,分散データベースであるCassandraに注目した.

+

本研究の準備としてスケーラビリティの検証環境を構築するため,CassandraのPCクラスタ上での検証を行った.結果として,特徴やスケールする条件の検証,スケーラビリティの検証環境を構築することが出来た.

+

今回は検証環境と検証結果を用いて,スケーラビリティのあるCMSの設計・開発を行う.

+
+ +
+

Cassandraとは?

+ +
+ +
+

前回の研究結果

+

前回の研究では1台または複数台のCassandraと90台のPCクラスタを利用したスケーラビリティの検証を行った.

+

結果として,マルチコアサーバーでREAD/WRITEを並列に行い,かつ使用するデータ構造も単純ではなく工夫が必要であるということが分かった.

+
+ +
+

スケーラビリティを確保するために

+

スケーラビリティの確保するためには,どうすればよいか?

+

スケーラビリティのあるシステムには以下のような特徴が考えられる.

+
    +
  1. 大きな負荷がかかっても性能が低下しない(しにくい).
  2. +
  3. ノードの台数を増やすだけで性能を維持することが出来る.
  4. +
+

この特徴を実現するためにはどうすれば良いか.

+
+ +
+

スケーラビリティを確保するために

+

スケーラビリティを確保するために,次の方法が挙げられる.

+
    +
  1. データのコピーを複数用意する方法

    データのコピーを複数用意することにより,データのアクセスが集中することを防く.

  2. +
  3. データの更新通知を行わずポーリングを行う方法

    全ての更新結果はコピー先が把握する必要はなく,コピー先が必要になったときのみ同期を行えば良い.

  4. +
+
+ +
+

提案するシステムのアーキテクチャ

+ + + + +
+ +
    +
  • Cassandraの上にAPIServerを設ける。

    各ステージでスケーラビリティの検証を行う.

  • +
  • [方法1]より各ステージにCacheを設ける。
  • +
  • [方法2]よりCacheはEditorというデータ構造を管理する機能で同期を取る.

    分散バージョン管理システムを参考にした方法.

  • +
+
+
+ +
+ +
+

スレッドセーフな木構造の開発

+

文章の構造を表す物として木構造が適切であり,スケールする必要がある.そのため,スレッドセーフな木構造である非破壊的木構造を実装する.

+

非破壊的木構造とは?

+
    +
  1. 木構造を編集する際にルートノードから編集対象までのノードをコピーして編集された木構造とする.
  2. +
  3. 木構造を走査中の処理を待たずに編集することが出来る.
  4. +
+
+ +
+

スレッドセーフな木構造の開発

+

通常の破壊的な木構造は?

+
+ +
+
+ +
+

スレッドセーフな木構造の開発

+

破壊的な木構造の問題点

+ +
+ +
+

スレッドセーフな木構造の開発

+

イメージとしてはこんな感じ

+
+ +
+
+ +
+

スレッドセーフな木構造の開発

+

非破壊的木構造の利点

+ +
+ +
+

TreeCMSの実装

+

TreeCMSの開発にあたり使用した環境

+ +

クラスタ環境を利用しスケーラビリティのチェックを行いながら改良を重ねていく

+
+ +
+

TreeCMSの実装

+

実装したシステムの概略図.

+
+ +
+
+ +
+

Tree Managerの実装

+

Tree Managerが提供するAPI

+ + + + + + + + + + + + + + + + + + + + + +
Node子供とデータのテーブルを持つ.
NodeIDUUIDとバージョン番号から構成され検索・マージなどに使用する.
Forest木構造の集合でNodeをNodeIDまたはUUIDで問い合わせることが出来る.
Tree破壊的木構造
TreeEditor破壊的なTreeを非破壊的に編集する、分散レポジトリ管理の機能を応用しているため、編集した物をTreeにcommit/check/updateなどの操作を持つ
+
+ +
+

Tree Managerの実装

+
+ +
+ +
    +
  • メモリ上に非破壊的木構造を実装する.
  • +
  • それをメモリのキャッシュとして利用しながらCassandra上の非破壊的木構造の実装を行う.
  • +
+
+
+ +
+

Tree Managerの実装

+ +

CassandraへNodeの情報を格納するために,KeyspaceとColumnFamilyを定義する必要がある.

+

KeyspaceとはColumnFamilyの集合で,ColumnFamilyとは複数のColumnを持ち行のKeyで参照することが出来る.

+

Nodeを格納するためにNode ColumnFamilyを定義した.

+
+
+ +
+
+ +
+

フロントエンド(Tomcat 7)の実装

+

木構造をHTMLとして出力するためのRendering EngineやGUIなTreeEditorが必要となる.

+

Apache MyFacesを使用したTreeEditorの開発を行った.

+

Apache MyFacesはJSFというWebアプリケーションに置いてユーザーインターフェースを容易につくるためのフレームワークである.

+

GUI部分を容易に開発出来るため木構造編集ツールのフレームワークとして使用した.

+
+ +
+

プロトタイプCMSでの問題点

+

これによってCassandraと非破壊的木構造を利用したCMSのプロトタイプを作成できた.これによりいくつかの課題が見えてきた.

+ +
+ +
+

TreeCMSの改善

+

プロトタイプでの問題点を解決するため,次のような改良を行った.

+ +
+ +
+

並列クライアントの実装

+

CassandraはSEDAを採用しているため,並列にアクセスする必要がある.

+ +
+ +
+

並列クライアントの実装

+

イメージ

+
+ +
+
+ +
+

CassandraでのKeyspaceの定義

+

プロトタイプのKeyspaceではNodeの検索に問題がある.

+ +
    +
  • NodeIDをKeyとしてCassandraよりNodeを取得するが,あるUUIDの最新版を取得するには検索が必要になる.
  • +
  • キーの担当ノードを決定するOrderPerservingPertitionerを利用し,UUIDごとに纏めることでキーレンジ検索を容易にした.
  • +
  • しかしCassandraはノードで担当するレンジが決まっている.そのためNodeの配置が偏ってしまう.
  • +
+
+
+ +
+
+ +
+

CassandraでのKeyspaceの定義

+ +

問題を解決するため次のような最新版のNodeを保持するNodeID ColumnFamilyを追加した.