# 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の設計
+玉城 将士,河野 真治
+琉球大学 情報工学科
+
+
+
+
+
+
本研究の概要
+
スケーラビリティのあるCMSを開発するため,分散データベースであるCassandraに注目した.
+
本研究の準備としてスケーラビリティの検証環境を構築するため,CassandraのPCクラスタ上での検証を行った.結果として,特徴やスケールする条件の検証,スケーラビリティの検証環境を構築することが出来た.
+
今回は検証環境と検証結果を用いて,スケーラビリティのあるCMSの設計・開発を行う.
+
+
+
+
Cassandraとは?
+
+- 分散KeyValue Storeデータベースのひとつ
+- DynamoとBigTableを合わせた特徴を持っている.
+- ConsistencyLevelというパラメータがあり,データの整合性とレイテンシを調整することができる.
+- Staged Event Driven Architectureという処理を段階分けしスレッドプールを複数用意して利用する形のマルチスレッドを採用している.
特徴として,並列に負荷をかけると性能を発揮する.
+
+
+
+
+
前回の研究結果
+
前回の研究では1台または複数台のCassandraと90台のPCクラスタを利用したスケーラビリティの検証を行った.
+
結果として,マルチコアサーバーでREAD/WRITEを並列に行い,かつ使用するデータ構造も単純ではなく工夫が必要であるということが分かった.
+
+
+
+
スケーラビリティを確保するために
+
スケーラビリティの確保するためには,どうすればよいか?
+
スケーラビリティのあるシステムには以下のような特徴が考えられる.
+
+ - 大きな負荷がかかっても性能が低下しない(しにくい).
+ - ノードの台数を増やすだけで性能を維持することが出来る.
+
+
この特徴を実現するためにはどうすれば良いか.
+
+
+
+
スケーラビリティを確保するために
+
スケーラビリティを確保するために,次の方法が挙げられる.
+
+ - データのコピーを複数用意する方法
データのコピーを複数用意することにより,データのアクセスが集中することを防く.
+ - データの更新通知を行わずポーリングを行う方法
全ての更新結果はコピー先が把握する必要はなく,コピー先が必要になったときのみ同期を行えば良い.
+
+
+
+
+
提案するシステムのアーキテクチャ
+
+
+
+
+
+ - Cassandraの上にAPIServerを設ける。
各ステージでスケーラビリティの検証を行う.
+ - [方法1]より各ステージにCacheを設ける。
+ - [方法2]よりCacheはEditorというデータ構造を管理する機能で同期を取る.
分散バージョン管理システムを参考にした方法.
+
+
+ |
+
+
+
+
+
+
+
スレッドセーフな木構造の開発
+
文章の構造を表す物として木構造が適切であり,スケールする必要がある.そのため,スレッドセーフな木構造である非破壊的木構造を実装する.
+
非破壊的木構造とは?
+
+ - 木構造を編集する際にルートノードから編集対象までのノードをコピーして編集された木構造とする.
+ - 木構造を走査中の処理を待たずに編集することが出来る.
+
+
+
+
+
スレッドセーフな木構造の開発
+
通常の破壊的な木構造は?
+
+
+
+
+
+
+
スレッドセーフな木構造の開発
+
破壊的な木構造の問題点
+
+ - 木が走査中の場合、走査が終わるのを待たなければならない.
+ - 木を直接書き換えるので木は保存されない.
+ - 待つ必要があるのでスケールしない.
+
+
+
+
+
スレッドセーフな木構造の開発
+
イメージとしてはこんな感じ
+
+
+
+
+
+
+
スレッドセーフな木構造の開発
+
非破壊的木構造の利点
+
+ - 木を走査中でも,編集することが出来る.
+ - コピーして新しい木をつくるため古い木は保存されている.
+ - ロックを必要としないことからスケールするのではないかと考えられる.
+
+
+
+
+
TreeCMSの実装
+
TreeCMSの開発にあたり使用した環境
+
+ - Java
+ - Eclipse
+ - Tomcat 7
+ - Cassandra 0.6.8
+ - Torqueで管理されたクラスタ環境
+
+
クラスタ環境を利用しスケーラビリティのチェックを行いながら改良を重ねていく
+
+
+
+
TreeCMSの実装
+
実装したシステムの概略図.
+
+
+
+
+
+
+
Tree Managerの実装
+
Tree Managerが提供するAPI
+
+
+ Node |
+ 子供とデータのテーブルを持つ. |
+
+
+ NodeID |
+ UUIDとバージョン番号から構成され検索・マージなどに使用する. |
+
+
+ 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のプロトタイプを作成できた.これによりいくつかの課題が見えてきた.
+
+ - CassandraはSEDAな為,並列にアクセスしたほうが性能を発揮できる.
+ - プロトタイプで使用したNode ColumFamilyでは問題がある.
+
+ - NodeIDでの検索を容易にするためにOrderPreservingPartitioner(OPP)を使用していた.
+ - 担当するキーのレンジが決まっているCassandraではOPPを利用するとキーが格納されるノードに偏りが出る.
+
+ - 定義したAPIを使用し使いづらい部分の改善
+
+
+
+
+
TreeCMSの改善
+
プロトタイプでの問題点を解決するため,次のような改良を行った.
+
+ - 並列クライアントの作成.
+ - NodeID ColumnFamilyを追加し,検索の問題を解決.
+ - OrderPerservingPertitionerの代わりにランダムにキーを配置するRandomPartitionerを採用.
+
+
+
+
+
並列クライアントの実装
+
CassandraはSEDAを採用しているため,並列にアクセスする必要がある.
+
+ - スレッドプールを使用
+ - Cassandra.Clientをラップした並列クライアントの開発.
+ - 1スレッドに1コネクションを割り当てる.
+ - Futureを用いて処理の結果を待たないことで、高い並列度で処理を行い、Cassandraの性能を出す.
+
+
+
+
+
並列クライアントの実装
+
イメージ
+
+
+
+
+
+
+
CassandraでのKeyspaceの定義
+
プロトタイプのKeyspaceではNodeの検索に問題がある.
+
+
+ - NodeIDをKeyとしてCassandraよりNodeを取得するが,あるUUIDの最新版を取得するには検索が必要になる.
+ - キーの担当ノードを決定するOrderPerservingPertitionerを利用し,UUIDごとに纏めることでキーレンジ検索を容易にした.
+ - しかしCassandraはノードで担当するレンジが決まっている.そのためNodeの配置が偏ってしまう.
+
+
+
+
+
+
+
+
+
CassandraでのKeyspaceの定義
+
+問題を解決するため次のような最新版のNodeを保持するNodeID ColumnFamilyを追加した.