view index.html @ 0:fdc457266e2d default tip

hg init
author shoshi tamaki
date Fri, 14 Jan 2011 02:02:46 +0900
parents
children
line wrap: on
line source

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Cassandraを利用したサービスのPCクラスタを利用したスケーラビリティの検証</title>
<!-- metadata -->
<meta name="generator" content="S5" />
<meta name="version" content="S5 1.1" />
<meta name="presdate" content="20100807" />
<meta name="author" content="ShoshiTAMAKI" />
<meta name="company" content="University of Ryukyus" />
<meta http-equiv="ContentType : text/html; charset=UTF-8"/>
<!-- configuration parameters -->
<meta name="defaultView" content="slideshow" />
<meta name="controlVis" content="hidden" />
<!-- style sheet links -->
<link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projection" id="slideProj" />
<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" />
<link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" />
<link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" />
<!-- embedded styles -->
<style type="text/css" media="all">
.imgcon {width: 525px; margin: 0 auto; padding: 0; text-align: center;}
#anim {width: 270px; height: 320px; position: relative; margin-top: 0.5em;}
#anim img {position: absolute; top: 42px; left: 24px;}
img#me01 {top: 0; left: 0;}
img#me02 {left: 23px;}
img#me04 {top: 44px;}
img#me05 {top: 43px;left: 36px;}
</style>
<!-- S5 JS -->
<script src="ui/default/slides.js" type="text/javascript"></script>
</head>
<body>

<div class="layout">
<div id="controls"><!-- DO NOT EDIT --></div>
<div id="currentSlide"><!-- DO NOT EDIT --></div>
<div id="header"></div>
<div id="footer">
<h1>Cassandraを利用したサービスのPCクラスタを用いたスケーラビリティの検証</h1>
<h2>shizuku.cr.ie.u-ryukyu.ac.jp</h2>
</div>

</div>
<div class="presentation">

<div class="slide">
<h1>Cassandraを利用したサービスのPCクラスタを用いたスケーラビリティの検証</h1>
<h3>Shoshi TAMAKI , Shinji KONO</h3>
<h4><a href="http://www.cr.ie.u-ryukyu.ac.jp/">University of Ryukyus</a></h4>
</div>

<div class="slide">
<h1>研究の目的</h1>
<p>インターネット上のサービスで重要なのはスケーラビリティ、つまり、ユーザのアクセスの増大に対して一定のサービス品質を提供することである。
<p>
スケーラブルなサービスを提供するために分散Key-Value store Cassandra が注目されている。 RDBの個々のテーブルも、Key-Value store と見ることができる。
<p>
本研究では,特に汎用性のある木構造を扱うインターネットサービスに着目する。Cassandra 上に木構造を取り扱うサービスをスケーラブルに提供するフレームワークを設計し実装する。
</div>

<div class="slide">
<h1>研究のスケジュール</h1>
<small>
<ul>
	<li>第1クォーター:Cassandraの検証</li>
	<li>第2クォーター:スケーラビリティの高いサービスの設計</li>
	<li>第3クォーター:<span style="color:red;">スケーラビリティの高いサービスの実装</span></li>
	<li>第4クォーター:実装したサービスの検証</li>
</ul>
<p>1Qでは、Cassandra のPCクラスタを用いたスケーラビリティを実験する環境を構築した。</p>
<p>しかし、1対1の環境ではmySQLの方が性能が良かった。</p>
<p>今回はCassandraが実際にスケールすることを確認した。</p>
<p>その結果を元に、木構造をスケーラブルに取り扱うシステムの設計を行なった。</p>
</small>
<div>

<div class="slide">
<h1>1Qまでのあらすじ</h1>
<p>前回の発表では以下のことについて発表を行った.</p>
<ul>
	<li>Cassandraの紹介と基本的な使用方法</li>
	<li>Cassandraを利用したアプリケーション</li>
	<li>コンシステント・ハッシュ</li>
	<li>1台のクライアントとサーバーを用いた簡単なベンチマーク</li>
</ul>
<p>シンプルなベンチマークではMySQLにCassandraでは超えられられなかった</p>
<p>課題として,Cassandraがスケールする条件の検証が残った.</p>
</div>

<div class="slide">
<h1>2Qまでのあらすじ</h1>
<ul>
	<li>スケーラビリティの検証環境をTorqueを使って構築した</li>
	<li>Cassandraが実際にスケールすることを実験で確認した</li>
	<li>スケーラビリティの高い木構造を対象としたサービスの設計を行った</li>
</ul>
<small>
<p>3Qの課題としてCassandraのノード数を増やした場合、コア数の多いサーバの場合の検証が必要なこともわかった。</p>
<p>プロタイプ実装でも実験によってスケーラビリティを確認しながら設計/実装を深めていく必要がある。</p>
</small>
</div>

<div class="slide">
<h1>前回の実験概要</h1>
<div align="center">
	<img width="400px" src="./pics/benchmark.png"/>
</div>
<small>
<ul>
<li>Torqueを利用して,任意台数のクラスタ(クライアント)に同時にスクリプトを実行させる</li>
<li>スクリプトは,ある時間になると一斉に目的のサーバーに1万回のアクセスを開始する</li>
<li>クラスタの台数を変動させCassandraとMySQLサーバーに負荷をかける.</li>
<li>複数台のクラスタが処理に要した時間の平均をグラフ化し比較する.</li>
</ul>
</small>
</div>

<div class="slide">
<h1>前回の実験方法</h1>
<div align="center">
	<img width="60%" src="./pics/how_to_benchmark.png"/>
</div>
</div>

<div class="slide">
<h1>実験環境</h1>
<p>ベンチマークを取るために構築した環境</p>
<table align="center" border="1">
<tr>
	<th></th>
	<th>クラスタ</th>
	<th>MacMini</th>
	<th>Core i7</th>
</tr>
<tr>
	<th></th>
	<td>クライアント</td>
	<td>サーバ</td>
	<td>サーバ</td>
</tr>
<tr>
	<th>CPU</th>
	<td>Core Duo 2G (<span style="color: red;">1</span>)</td>
	<td>Core 2 Duo 2.53G (<span style="color: red;">2</span>)</td>
	<td>Core i7 3.0G (<span style="color: red;">4</span>)</td>
</tr>
<tr>
	<th>Memory</th>
	<td>1GB</td>
	<td>4GB</td>
	<td>14GB</td>
</tr>
<tr>
	<th>OS</th>
	<td>CentOS 5</td>
	<td>OSX 10.6</td>
	<td>CentOS 5</td>
</tr>
</table>
<small>
<p>このうちクラスタは80台用意されている.</p>
<p>()内はコア数で,Core i7のみ4コア8スレッドである.</p>
</small>
</div>

<div class="slide">
<h1>前回のベンチマークのまとめ</h1>
<small>
<ul>
<li>クライアントが複数いるときにCassndraが性能を発揮する.</li>
<li>コア数の少ないサーバーでは,性能が落ちる</li>
<li>コア数の多いサーバーでは,MySQLより平均時間の増加度が少ない.</li>
<li>サーバーの台数を増やすだけでは1台の性能を超えることはできない.</li>
<li>Cassandraの性能を活かすことのできる,条件はコア数の多いサーバーでかつ読み書きが頻繁に行われるアプリケーションであるということが分かった.</li>
<li>MacMini の性能はここまでか? サーバを増やせば良くなる可能性もある?</li>
</ul>
</small>
<p>Cassandraの特徴・性能を検証できた,ではどのようにシステムを開発すればスケールするのか?</p>
</div>

<div class="slide">
<h1>スケーラビリティのあるサービスの開発</h1>
<p>クラスタを用いたベンチマークにより, Cassandraの性能とスケーラビリティの検証方法を確認することができた.
<br/>これを踏まえた上でCassandraを利用したスケーラビリティのあるサービスを開発する.</p>
<p>スケーラビリティがあるということは?</p>
<ul>
	<li>負荷がかかっても遅くならない</li>
	<li>サーバーの台数を増やすだけで性能を維持できる</li>
</ul>
</div>

<div class="slide">
<h1>スケーラビリティを高めるためには</h1>
<small>
<p>[方法1]データの複製を多く用意する</p>
<ul>
	<li>一つのデータにアクセスが集中するとネットワークが遅くなるが,分散させることで避けることができる</li>
</ul>
</small>
<div align="center">
	<img width="670px" src="./pics/share_or_copy.png"/>
</div>
</div>

<div class="slide">
<h1>スケーラビリティを高めるためには</h1>
<small>
<p>[方法2]データの伝搬にはポーリングを利用する</p>
<ul>
	<li>データに更新があったとき,すべてのコピーデータに通知すると通信量が膨大になる.</li>
	<li>実際には必要なときに更新すればよいため,通知するのではなく見に行く(ポーリング)を行えばよい.(頻度が低く範囲が小さいと期待される)</li>
</ul>
</small>
<div align="center">
	<img width="650px" src="./pics/notify_or_polling.png"/>
</div>
</div>

<div class="slide">
<h1>提案するシステムのアーキテクチャ</h1>
<p>CassandraとWebサーバーが直接通信するのではなく, 間にサービスのAPIを提供するサーバーを挟む</p>
<table align="center">
<tr>
	<td><img width="400px" src="./pics/arch.png"/></td>
	<td><p>テストをサービスAPIの段階で行える</p>
	<p>PHP, Grails, Servlet 等にも対応可能</p>
</td>
</tr>
</table>
</div>

<div class="slide">
<h1>システムのアーキテクチャ</h1>
<ul>
	<li>開発言語はJavaを利用</li>
	<li>APIを提供するためにCassandraも利用しているRPCである,Thriftを使用する</li>
	<!-- スケールするシステムの上に、スケールしないシステムを作るべきではない? -->
	<li>SEDAを採用するか,しないかは未定 (採用すると、性能は出るが複雑になる) </li>
	<li>スケーラビリティは検証してみないと確認できない</li>
	<li>そのため,プロトタイプを作成してその性能を検証しながら開発をすすめる</li>
</ul>
</div>

<div class="slide">
<h1>データ構造</h1>
<p>スケールするサービスを開発するためにはスケールするデータ構造を考える必要がある</p>
<p>サービスのデータ構造として木構造を利用したい,しかし,これがスケールする必要がある</p>
<ul>
	<li>通常の木構造(破壊的木構造)</li>
	<ul>
		<li>データを書き換えて木を編集する</li>
	</ul>
	<li>非破壊的木構造</li>
	<ul>
		<li>データを書き換えず,コピーして編集する</li>
	</ul>
</ul>
<p>今回は非破壊的木構造を使用して開発を行う</p>
</div>

<div class="slide">
<h1>非破壊的木構造</h1>
<p>編集する木構造の内容を変更せずに, 変更するノードのコピーと変更がないノードで新しく木構造を作る</p>
<div align="center">
<table>
	<tr>
		<td><img width="350px" src="./pics/hakai_tree.png"/></td>
		<td><img width="400px" src="./pics/hihakai_tree.png"/></td>
	</tr>
</table>
</div>
</div>

<div class="slide">
<h1>コピーの場合の比較(破壊的木構造)</h1>
<small>
<p>[方法1]に則ってスケールするためには,複製を作成しやすいデータ構造である必要がある.<br/>
破壊の場合は変更を複製全部に通知する必要がある</p>
</small>
<div align="center">
	<img width="650px" src="./pics/dest_tree_copy.png"/>
</div>
</div>

<div class="slide">
<h1>コピーの場合の比較(非破壊的木構造)</h1>
<p>非破壊の場合は自由に複製を作って良い</p>
<div align="center">
	<img width="650px" src="./pics/mono_tree_copy.png"/>
</div>
</div>

<div class="slide">
<h1>ポーリングの場合の比較</h1>
<p>[方法2]に則って変更の通知をポーリングでやりやすいデータ構造を選択する必要がある.</p>
<p>破壊的変更の場合はポーリングでは木全体を見る必要がある.なので通知の方が現実的</p>
<p>非破壊の場合は木の先頭を見れば更新されているかどうかがわかる(ポーリングのアクセスの集中を防ぐ工夫は必要)</p>
</div>

<div class="slide">
<h1>非破壊的木構造</h1>
<ul>
	<li>利点</li>
	<ul>
		<li>ロックを必要としない</li>
		<li>複製を自由に作成することができる(変更を伝搬する必要はなく,複製先が監視すればよい)</li>
	</ul>
	<li>欠点</li>
	<ul>
		<li>次々に複製を作成するため,メモリ使用量が多い</li>
		<li>編集するための計算量が多い(編集対象のノードまでのパスの長さまで複製するため)</li>
	</ul>
</ul>
<p>ロックを必要としない・複製を自由に作成できるという利点からスケールするのではないかと考えられる</p>
</div>

<div class="slide">
<h1>非破壊木構造Editorの実装</h1>
<ul>
<li>イメージとしては分散リポジトリ(Git,Mercurial)</li>
<li>APIとしてcommit,push,pull,update,discard,mergeがある。</li>
<li>木構造をコピーし、ローカルへ保存して編集しリモートへ更新する。(非破壊的)</li>
<li>更新は変更をコミットする際に検出する。(ポーリングの利用)</li>
</ul>
</div>

<div class="slide">
<h1>非破壊木構造Editorの実装</h1>
<div align="center">
<img width="60%" src="pics/editor01.png"/>
</div>
</div>

<div class="slide">
<h1>非破壊木構造Editorの実装</h1>
<ul>
<li>このEditorを各ステージ(ブラウザ上、APIサーバー上、Cassandra)において実装する。</li>
<li>こうすることで非破壊構造を分散して構築することが出来る。</li>
</ul>
</div>

<div class="slide">
<div align="center">
<img width="70%" src="pics/multistage_copy.png"/>
</div>
</div>

<div class="slide">
<h1>OnMemory上の非破壊木構造の実装</h1>
<p>これは書くの必要ですか?</p>
</div>

<div class="slide">
<h1>Cassandra上での非破壊構造の実装</h1>
<p>これは書くの必要ですか?</p>
</div>

<div class="slide">
<h1>リンクの実装</h1>
<small>
<ul>
<li>非破壊木構造の特性上、ルートノードに負荷がかかる。</li>
<li>そのため、リンクを導入しある部分で親ノードに更新が伝搬しないようにする。</li>
<li>リンクされた先をルートノードとし編集することでリンクの親ノードへ更新は伝搬されない。</li>
</ul>
</small>
<div align="center">
<img width="75%" src="pics/link.png"/>
</div>
</div>

<div class="slide">
<h1>まとめ</h1>
<ul>
	<li>非破壊木構造Editorは分散リポジトリを参考にした構造。</li>
	<li>ローカルにコピーし、それを非破壊的に変更していく。</li>
	<li>複数ステージにおいてツリーをコピーし、それぞれの段階で非破壊的に編集する。</li>
	<li>ルートノードの負荷分散のためにリンクを導入する。</li>
</ul>
</div>

<div class="slide">
<h1>今後の課題</h1>
<ul>
	<li>実装したEditorを使ったベンチマークテスト</li>
	<li>引き続きEditorの実装</li>
	<li>レンダリングエンジンの実装</li>
</ul>
</div>

<div class="slide">
<h2>ご清聴ありがとうございました</h2>
</div>

</body>
</html>