view index.html @ 0:dacfe6e2d9e7 default tip

hg init
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Sun, 11 Jul 2010 23:08:46 +0900
parents
children
line wrap: on
line source

<?xml version="1.0" encoding="utf-8"?>
<!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" lang="ja" xml:lang="ja"> 
<head> 
  <title>分散Key-ValueストアCassandraの実用性の検証</title> 
  <meta name="copyright" 
   content="Copyright &#169; 2010 shoshi@cr.ie.u-ryukyu.ac.jp" /> 
  <link rel="stylesheet" type="text/css" media="screen, projection, print" href="./slidy.css" /> 
  <script src="./slidy.js" charset="utf-8" type="text/javascript"></script> 
  <style type="text/css"> 
	*{
		font-size : 1.1em;
    }
  </style> 
</head>
<body>
<div class="slide">
<h2>分散Key-ValueストアCassandraの実用性の検証</h2>
<br/>
<br/>
<p>琉球大学 情報工学科 4年次</p>
<p>並列信頼研究室</p>
<p>玉城 将士</p>
</div>
<div class="slide">
<h2>発表の流れ</h2>
<ul>
	<li>Cassandraの紹介</li>
	<li>研究の目的</li>
	<li>ConsistentHash</li>
	<li>ConsistencyLevel</li>
	<li>実験</li>
	<li>考察</li>
	<li>これからの作業</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(1)</h2>
<ul>
<li>Key-Valueストア(NoSQL)</li>
<li>高いスケーラビリティを持つ</li>
<li>シンプルなAPI(get,set,delete,count)</li>
<li>Javaで記述されている</li>
<li>FaceBookが作成.</li>
<li>2008年にオープンソースになった</li>
<li>Apacheのトップレベルプロジェクトの一つ</li>
<li>TwitterやDiggが興味を示している</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(2)</h2>
<p>FaceBookが自社のために使うデータベースとして開発し,2008年にオープンソースになる.<br/><br/>
2010年にはApacheのトップレベルプロジェクトに引き上げられた今とても熱いプロジェクト.<br/><br/>
現在のバージョンは0.6.2で盛んに開発が進んでおり,頻繁にバージョンアップがある.<br/><br/>
様々な会社のエンジニアが自由にプロジェクトに関わっていきている.</p>
<img src="cassandra_logo.png"/>
</div>
<div class="slide">
<h2>Cassandraの紹介(3)</h2>
<p>分散Key-Valueストアデータベース</p>
<ul>
<li>データベースに"Key"を問い合せると結びつけられた"Value"が返ってくる</li>
<li>分散データベース<br/>複数のノードで構成されているデータベース.
<li>ひとつのデータが複数のノードに保存される</li>
<li>ReplicationFactor 保存されるノードの個数
<li>ConsistencyLevel 整合性か速度の選択</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(5)</h2>
<p>MySQLより高速に動作する?(CassandraWikiより)</p>
<div align="center">
<table border="1">
<tr>
	<th></th>
	<th>Read</th>
	<th>Write</th>
</tr>
<tr>
	<td>MySQL</td>
	<td>350 ms</td>
	<td>300 ms</td>
</tr>
<tr>
	<td>Cassandra</td>
	<td>15 ms</td>
	<td>0.12 ms</td>
</tr>
</table>
</div>
<p>自分で実測した結果
<div align="center" class="incremental">
<table align="center" border="1">
<tr>
	<th></th>
	<th>Read</th>
	<th>Write</th>
</tr>
<tr>
	<td>MySQL 5.1.46</td>
	<td>9 seconds</td>
	<td>6 seconds</td>
</tr>
<tr>
	<td>Cassandra 0.6.2</td>
	<td>42 seconds</td>
	<td>411 seconds</td>
</tr>
</table>
</div>
<p class="incremental">遅いです
</div>
<div class="slide">
<h2>Cassandraの紹介(6)</h2>
<p>なぜ異なる結果となったのか
<ul>
	<li>実験環境の違い? データ量 : 4KB,使用言語 : Perl,繰り返し回数 : 10000</li>
	<li>Yahoo!によるベンチマークでは複数台で同時にアクセスしている
	<li>MySQL側にはnameとvalueの2つのレコードを持ったtableを作成</li>
	<li>テーブルの大きさ(KB-TB)
	<li>SEDAなのでマルチスレッドの性能を生かせないといけない
	<li>問題によっては mySQL で十分
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(6)</h2>
<p> より現実的なデータ量、Request数ではCassandraが良い結果を出すはず
<ul>
	<li>ひとつの処理の速度よりも複数の処理を同時に行うのに向いている
	<li>複数のCassandara ノードに平行に負荷を分散する
    <li>負荷をかけるクライアントを別なホストに複数置く
    <li>テーブルの大きさを大きくする
</ul>
<p> これらは、これから実験します。
</div>
<div class="slide">
<h2>Cassandraの紹介(7)</h2>
<h3>Twissandra</h3>
<p>Pythonで作成されたTwitterもどき,CassandraWikiの例題として掲載されている</p>
<ul>
	<li><a href="http://misaka001.cr.ie.u-ryukyu.ac.jp:8000/">http://misaka001.cr.ie.u-ryukyu.ac.jp:8000/</a></li>
	<li><a href="http://misaka002.cr.ie.u-ryukyu.ac.jp:8000/">http://misaka002.cr.ie.u-ryukyu.ac.jp:8000/</a></li>
	<li>TwitterのようなアプリケーションもCassandraで作成することができる.</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(8)</h2>
<h3>YukiWiki on Cassandra</h3>
<p>Perlで作成されたYukiWikiを,Cassandra上で動くようにしました</p>
<ul>
	<li><a href="http://misaka001.cr.ie.u-ryukyu.ac.jp/casawiki/wiki.cgi">http://misaka001.cr.ie.u-ryukyu.ac.jp/casawiki/wiki.cgi</a></li>
	<li><a href="http://misaka002.cr.ie.u-ryukyu.ac.jp/casawiki/wiki.cgi">http://misaka002.cr.ie.u-ryukyu.ac.jp/casawiki/wiki.cgi</a></li>
	<li>WikiのようなCMSもCassandraで作成することができる.</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(9)</h2>
<h3>YukiWiki on Cassandra</h3>
<p>YukiWikiのデータ構造</p>
<ul>
	<li>YukiWikiはPerlのTIEHASHをデータベースとして使っている</li>
	<li>3つのテーブルをデータベースとして使用している.</li>
	<li>Cassandraに実装しやすいデータ構造のため改造は容易.</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(10)</h2>
<h2>YukiWiki on Cassandra</h2>
<p>所要時間とコード数</p>
<ul>
	<li>ソースコードの解析に数時間</li>
	<li>Perlの連想配列と実装を結ぶTIEHASHの勉強に1週間</li>
	<li>実装とリファクタリングに1週間</li>
	<li>モジュールのコード数は150行</li>
</ul>
</div>
<div class="slide">
<h2>Cassandraの紹介(11)</h2>
<h2>WordPress</h2>
<ul>
<li>ソースコード中にSQL文が分散しているため実装が困難</li>
<li>分散しているSQL文の部分をすべてCassandra用にコードを書き換える必要がある
<li>あるいは,SQLインタプリタを実装しないといけないので難しい</li>
<li class="incremental">WordPress開発者の皆さん!データ管理部分はちゃんとまとめて書きましょう</li>
</ul>
</div>
<div class="slide">
<h2>研究の目的</h2>
<ul>
	<li>Key-Valueストアに習熟する</li>
	<li>Cassandraのパラメータを実験する</li>
	<li>THInKSのCassandra向きのデータ構造を考える</li>
	<li>実装を行う</li>
</ul>
</div>
<div class="slide">
<h2>ConsistentHash</h2>
<h3>ConsistentHash(1)</h3>
<ul>
	<li>分散データベースでは複数のノードにレコードを格納する</li>
	<li>ConsistentHashはレコードを格納する場所を決定するアルゴリズム</li>
	<li>ノードが故障や追加されたときに最小限のレコードの移動で済むように設計されている</li>
	<li>そのレコードを複数の場所に保存する数がReplicationFactor</li>
	<li>複数の読み込みと書き込みが生じるので一般的には遅くなる</li>
</ul>
</div>
<div class="slide">
<h2>ConsistentHash</h2>
<h3>ConsistentHash(2)</h3>
<ul>
	<li>データのランダムかつ一意なハッシュ値を計算し,リング上に入れたとき同じ色のノードが担当する.</li>
</ul>
<div align="center">
<img src="consistenthash.PNG"/>
</div>
</div>
<div class="slide">
<h2>ConsistentHash</h2>
<h3>ConsistentHash(3)</h3>
<ul>
	<li>ノードが抜けた場合は,担当するノードがずれて図のようになる.</li>
</ul>
<div align="center">
<img src="consistenthash_node_out.PNG"/>
</div>
</div>
<div class="slide">
<h2>ConsistentHash</h2>
<h3>ConsistentHash(4)</h3>
<ul>
	<li>ノードが追加された場合も同様に,担当するノードがずれていく.</li>
</ul>
<div align="center">
<img src="consistenthash_node_add.PNG"/>
</div>
</div>
<div class="slide">
<h2>ConsistentHash</h2>
<h3>ReplicationFactor</h3>
<ul>
	<li>レプリケーションが適用されるノードの台数を示す</li>
	<li>ReplicationFactor = 2だとデータの担当は以下のようになる</li>
</ul>
<div align="center">
<img src="replicationfactor_ring.PNG"/>
</div>
</div>
<div class="slide">
<h2>ConsistencyLevel</h2>
<h3>ConsistencyLevel</h3>
<ul>
	<li>整合性と速度どちらを重要視するか調整するためのパラメータ</li>
	<li>リクエストごとに設定する</li>
	<li>これにより信頼性の高い低速な読み書きと,信頼性は低いが高速な読み書きを選択できる</li>
	<li>ReadとWriteでConsistencyLevelを設定した時の挙動が少し異なる</li>
</ul>
</div>
<div class="slide">
<h2>ConsistencyLevel</h2>
<h3>ConsistencyLevel - Read</h3>
<ul>
	<li>ZERO - サポートされない</li>
	<li>ANY - サポートされない</li>
	<li>ONE - 一番最初に返答したノードの値を返しますが,最新とは限りらない.</li>
	<li>QUORUM - すべてのノードに聞きに行きその内,多数決で一番タイムスタンプが新しい値を返す.</li>
	<li>ALL - まだ実装されていない.</li>
</ul>
</div>
<div class="slide">
<h2>ConsistencyLevel</h2>
<h3>ConsistencyLevel - Write</h3>
<ul>
	<li>ZERO - 書き込みはバックグラウンドで非同期的に行われる</li>
	<li>ANY - どこか1つのノードに書き込まれる</li>
	<li>ONE - 最低1つのノードのコミットログとメモリテーブルに書き込む</li>
	<li>QUORUM - ReplicationFactor / 2 + 1の数だけノードに書き込む</li>
	<li>ALL - ReplicationFactorの数だけノード全てに書き込む</li>
</ul>
</div>
<div class="slide">
<h2>実験</h2>
<h3>実験環境の構築</h3>
<p>Torque + maui</p>
<ul>
	<li>TorqueとはたくさんのPCに対して処理を実行させるためのソフトウェア</li>
	<li>mauiはすべてのクラスタに存在する処理を行う専用のユーザー</li>
	<li>Torqueを使用して90台のPCクラスタにCassandraをインストールし起動するスクリプトを作成</li>
	<li>現在77台で連携してCassandraが動作しています</li>
</ul>
</div>
<div class="slide">
<h2>実験</h2>
<h3>ConsistencyLevel::ONE vs ConsistencyLevel::QUORUM</h3>
<ul>
	<li>ハードウェア : CoreDuo 2.0G , Memory 1GB
	<li>データ量 : 24B</li>
	<li>ReplicationFactor : 15</li>
	<li>繰り返し回数 : 10000</li>
	<li>全体のノード数 : 77</li>
</ul>
<div align="center">
<table border="1">
<tr>
	<td></td>
	<td>Read</td>
	<td>Write</td>
</tr>
<tr>
	<td>ONE</td>
	<td>36 seconds</td>
	<td>17 seconds</td>
</tr>
<tr>
	<td>QUORUM</td>
	<td>47 seconds</td>
	<td>25 seconds</td>
</tr>
</table>
</div>
</div>
<div class="slide">
<h2>実験</h2>
<h3>ConsistencyLevel::ONE vs ConsistencyLevel::QUORUM</h3>
<ul>
	<li>ハードウェア : CoreDuo 2.0G , Memory 1GB
	<li>データ量 : 4KB</li>
	<li>ReplicationFactor : 15</li>
	<li>繰り返し回数 : 10000</li>
	<li>全体のノード数 : 77</li>
</ul>
<div align="center">
<table border="1">
<tr>
	<td></td>
	<td>Read</td>
	<td>Write</td>
</tr>
<tr>
	<td>ONE</td>
	<td>41 seconds</td>
	<td>429 seconds</td>
</tr>
<tr>
	<td>QUORUM</td>
	<td>45 seconds</td>
	<td>433 seconds</td>
</tr>
</table>
</div>
</div>
<div class="slide">
<h2>実験の考察</h2>
<h3>ConsistencyLevel::ONE vs ConsistencyLevel::QUORUM</h3>
<ul>
	<li>確かにQUORUMのほうが遅いが大した差はない.</li>
	<li>なぜたいしたことがないのか検証する必要があります
	<li>設定が間違っている可能性もある.</li>
	<li>CassandraはSEDAで動いているのでクライアント1台でバッチ処理はあまり美味しくない</li>
	<br/>
	<li>なぜかデータ量を多くするとReadとWriteの速度が逆転する(調査中)</li>
</ul>
</div>
<div class="まとめ">
<ul>
	<li>Cassandraを使用してTwitterやWikiのようなアプリケーションも作成した</li>
	<li>Cassandraを評価する環境を琉大のPCクラスタ上に作成した</li>
	<li>単純な評価ではmySQLよりもCassandraの方が遅いことを確認した</li>
</ul>
</div>
<div class="slide">
<h2>これからのこと</h2>
<ul>
	<li>クライアントを複数のbotにして一斉に負荷をかけるテストを行う</li>
	<li>YukiWiki on Cassandraで負荷テストを行う</li>
	<li>THInKSのデータベース設計</li>
	<li>MacMini上のベンチマーク</li>
	<li>信頼性の検証</li>
</ul>
<br/>
<p>ご清聴ありがとうございました!</p>
</div>
</body>
</html>