1
|
1 % Sample file for the use of compsoft style file.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 %
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 \documentclass[T]{compsoft}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 % Preamble
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 %
|
1
|
7 % 「コンピュータソフトウェア」誌に掲載される論文の場合, 次で
|
|
8 % 巻数, 号数, 開始ページ, 終了ページを指定する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 %\volNoPp{16}{5}{78}{83}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10
|
1
|
11 % ワークショップによる推薦論文の場合, ワークショップ名を指定する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 % \suisen{ワークショップ名}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13
|
1
|
14 % 特集の場合, 特集のタイトルを与える.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 % \tokushu{特集のタイトル}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16
|
1
|
17 % 大会論文の場合, \taikai で開催年を指定する. ここで指定した年から
|
|
18 % 大会の回数は計算される.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 \taikai{2010}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20
|
1
|
21 %pdf ここに, 使用するパッケージを列挙する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 \usepackage{mediabb}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 \usepackage{graphicx}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 %\usepackage[dvips]{graphics}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25
|
1
|
26 % ユーザが定義したマクロなどはここに置く. ただし学会誌のスタイルの
|
|
27 % 再定義は原則として避けること.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 \begin{document}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 % 論文のタイトル
|
2
|
31 \title{Cassandraを使ったCMSのPCクラスタを使ったスケーラビリティの検証}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 % 著者
|
1
|
34 % 和文論文の場合, 姓と名の間には半角スペースを入れ,
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 % 複数の著者の間は全角スペースで区切る
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 %
|
1
|
37 \author{玉城 将士 \and 河野 真治
|
2
|
38 \shozoku{Shoshi TAMAKI, Shinji KONO}{琉球大学工学部情報工学学科}
|
|
39 {Dept. \ of Information Engineering, Ryukyu University}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 }
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|
2
|
42
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 %
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 % 和文アブストラクト
|
2
|
45 \Jabstract{
|
4
|
46 数ある分散Key-Valueストアの中でもCassandraが注目を集めている.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 CassandraはConsitency levelの変更が可能であり、スケーラビリテイを
|
1
|
48 高めるための使い方には工夫が必要である.
|
|
49 本研究では, Cassandra上で動作するCMSを実装し学科のクラスタ上で動作させ
|
|
50 る.
|
|
51 特に, CoreDuo などの安価だが非力なマシンの振舞を調べることを行なった.
|
|
52 そしてその環境上でスケーラビリティを確認する実験手法に関して考察する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 }
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 %
|
1
|
55 % 英文アブストラクト(大会論文には必要なし)
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 % \Eabstract{}
|
2
|
57
|
|
58 \maketitle
|
1
|
59
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 %
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 \section{はじめに}
|
4
|
63 インターネットやスマートフォンなどの普及に伴い,インターネット上のサービスを使用するユーザーが急速に増え続けている.サービスを利用するユーザーが増えると,いままでのシステムでは膨大なアクセスに対応できなくなり,サービスの品質を維持することができなくなる.
|
|
64 %品質を維持するためには,使用するサーバー性能の向上を測ればよい.しかし,性能の良いサーバーを揃えるには膨大なコストを必要とし,これをスケールアップと呼ぶ.
|
2
|
65 そこで,安価なサーバーを複数用意し,連携させることによって性能を向上させる方法があり,これをスケールアウトと呼ぶ.この方法では,従来使用してきたソフトウェアを複数のサーバーに移動するだけではうまく動作しない.
|
|
66 複数のサーバーを強調させるのは難しく,データの整合性や通信速度,負荷分散など様々な考慮をしなければならないためである.
|
|
67 Cassandraは複数のサーバーで動作を想定した分散データベースである.
|
4
|
68 本研究では,実際に分散させることによって高価なサーバーを超えることが出来る性能を出すことが出来るのか,また,どの様にCassandra上で動くソフトウェアを開発することによって性能を発揮することが出来るのかを,90台のPCクラスタ上でベンチマークを取り検証した,その結果,コア数の多いサーバー上で高い性能を得ることが出来た.
|
|
69 \section{先行研究}
|
|
70 \subsection{Yahoo! Cloud Serving Benchmark}
|
|
71 数のデータベース(Sherpa,BitTable,Azure)などがあるが, 実際にはどのデータベースを使用すればよいか確かではない. この研究では, 異なるデータベースの性能を比較する共通なフレームワークを開発する.\cite{YCSB}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 \section{分散データベース Cassandra}
|
6
|
73 Cassandraは, FaceBookが自社のために開発した分散Key-Valueストアデータベースであり,DynamoとBigTable\cite{BIGTABLE}を合わせた特徴を持っている. 2008年にオープンソースとして公開され, 2009年にApache Incubatorのプロジェクトとなった.
|
5
|
74 2010年にはApacheのトップレベルプロジェクトとなり, 現在でも頻繁にバージョンアップが行われている.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 \subsection{ConsictencyLevel}
|
1
|
76 Cassandraには, ConsistencyLevelが用意されている. これは, 整合性と応答速度どちらを取るか選ぶためのパラメータであり, リクエストごとに設定することが出来る.
|
|
77 また, ReadとWriteでConsistencyLevelの意味は異なる.
|
|
78 このConsistencyLevelを適用するノードの台数をReplicationFactorといい, Cassandraの設定ファイルで設定することが出来る.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 {\gt Read}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 \begin{enumerate}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 \item{ConsistencyLevel::ZERO}\\
|
1
|
82 サポートされていない.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 \item{ConsistencyLevel::ANY}\\
|
1
|
84 サポートされていない.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 \item{ConsistencyLevel::ONE}\\
|
1
|
86 一番最初に返答したノードの値を返すが値が最新のものであるかは保証できない. 整合性の調査は常に非同期で行われており, 再度読み出しを行うときに結果が変わっている可能性がある.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 \item{ConsistencyLevel::QUORUM}\\
|
1
|
88 すべてのノードにリクエストを送信し, 取得した値のタイムスタンプを比較し, 最も多数のノードが返した値のうちで最新のタイムスタンプを持つ値を返す.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 \item{ConsistencyLevel::ALL}\\
|
1
|
90 すべてのノードにリクエストを送信し, もっともタイムスタンプの新しいノードの値を返す.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 \end{enumerate}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 {\gt Write}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 \begin{enumerate}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 \item{ConsistencyLevel::ZERO}\\
|
1
|
95 何も保証しない, 書き込みは非同期的に行われる.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 \item{ConsistencyLevel::ANY}\\
|
1
|
97 別のどこか他のノードに書き込まれることを保証する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 \item{ConsistencyLevel::ONE}\\
|
1
|
99 最低1つのノードのログとメモリテーブルに書き込まれていることを保証する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 \item{ConsistencyLevel::QUORUM}\\
|
1
|
101 (ReplicationFactor/2) + 1のノードに書き込むことに書き込みを終えてからクライアントにレスポンスを返す.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 \item{ConsistencyLevel::ALL}\\
|
1
|
103 ReplicationFactorのノード数に書き込みを終えてからレスポンスを返す.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104 \end{enumerate}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 \subsection{コンシステント・ハッシュ}
|
4
|
106 Cassandraは複数のノードにデータを分散して格納する. その為に使用されているのがコンシステント・ハッシュである. 普通, n台で構成されたノードにデータを分散する場合, hash(key) mod nで分散させる. この場合だと, ノードが追加・削除された場合すべてのデータの位置を再計算する必要があり面倒である.
|
1
|
107
|
|
108 そこで, 図\ref{fig:chash}のようなものを考える. 図\ref{fig:chash}はハッシュ関数が取りうる値を範囲としたリングである. このリング上に構成するノードを配置していく. この図の場合, アルファベットがノードで数字がデータ, 矢印が担当するノードである.
|
|
109 次に, ハッシュ関数により計算された値をリングの上に配置する. このとき, リングを右回りに周り一番最初にあたったノードがデータを担当するノードとする.
|
|
110 こうすると, ノードが追加・削除された場合に, 全体を再計算する必要はなく, 担当するノードがいなくなったデータのみを再計算し, 次の担当するノードに移せばよい.
|
|
111 Cassandraでは, 右回りに回ったとき担当するノード数を複数にする場合, ReplicationFactorで調整することが出来る.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 \begin{center}
|
2
|
114 \includegraphics{./fig/ConsistentHash.pdf}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 \end{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 \caption{コンシステントハッシュ}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 \label{fig:chash}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 \subsection{SEDA}
|
6
|
120 SEDA(Staged Event-Driven Architecture)は, Cassandraで使用されているアーキテクチャである\cite{SEDA1}\cite{SEDA2}. 処理を複数のステージに分解しタスクキューとスレッドプールを用意し処理を行う. 処理の様子を図\ref{fig:seda}に示す.
|
1
|
121 タスクが各ステージのタスクキューに入ると, スレッドプールにどれかのスレッドがタスクキューの中からタスクを取り出し処理を行う. 処理が終わるとそのタスクを次のステージのタスクキューに入れる.
|
3
|
122 このアーキテクチャはマルチスレッドベースなためマルチコアなPCと多数のタスクがある状況で性能を発揮することができる. しかし, あまりにもスレッドプールやタスクが多すぎると, コンテキストに切り替えに時間がかかり性能は低下する.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 \begin{center}
|
2
|
125 \includegraphics{./fig/SEDA.pdf}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 \end{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 \caption{SEDA}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 \label{fig:seda}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 \subsection{Cassandra上でのステージの構成}
|
6
|
131 Cassandraは主に以下のステージにより構成されており, concurrent::StageManagerを参照すると見つけることが出来る.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 \begin{itemize}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 \item{READ STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 \item{MUTATION STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 \item{STREAM STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 \item{GOSSIP STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 \item{RESPONSE STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 \item{AE SERVICE STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 \item{LOADBALANCE STAGE}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 \item{MIGRATION STAGE}\\
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 \end{itemize}
|
1
|
142 実際にはもっと多数のステージが存在し, この他にもクライアントの接続を待つスレッドプールやMemTableのFlushを行うスレッドプールがあり, 全部で40個程度のスレッドが動作している.
|
2
|
143 \subsection{YukiWiki on Cassandra}
|
|
144 今回の検証のため, CMSのであるWikiクローンのYukiWikiをCassandra上で動作するように改造した.YukiWikiは文書の管理にTIEHASHを使用しており,Cassandra用のTIEHASHを作成することで簡単に実装することが出来る.\\
|
6
|
145 Cassandra上で動作するため,このWikiで複数のサーバー上でデータを共有することが出来るようになった.\\
|
|
146 ソースコードは以下のURLで参照することが出来る.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 \section{実験}
|
1
|
148 本研究では, Cassandraのスケーラビリティの検証の為にベンチマークテストを行う. 実験環境は以下のとおりである.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 \subsection{実験環境}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 \begin{enumerate}
|
1
|
151 \item{クラスタ(クライアント)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
152 \begin{itemize}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153 \item{CPU : Core Duo}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 \item{Mem : 1GB}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 \item{O S : CentOS 5}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 \end{itemize}
|
4
|
157 \item{MacMini}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 \begin{itemize}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 \item{CPU : Core2 Duo}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 \item{Mem : 4GB}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 \item{O S : OSX SnowLeopard}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 \end{itemize}
|
4
|
163 \item{Core i7}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 \begin{itemize}
|
2
|
165 \item{CPU : Core i7 950 @3.0GHz}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166 \item{Mem : 16GB}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
167 \item{O S : CentOS 5}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
168 \end{itemize}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169 \end{enumerate}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
170 \subsection{実験方法}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171 \begin{enumerate}
|
1
|
172 \item{クライアント}
|
|
173 クラスタ管理ツールのTorqueを使用し, 使用するノード数を指定してクラスタにジョブを投げてPHPスクリプトを実行させる. このPHPスクリプトはCassandraとMySQLに10000回リクエストを送信するスクリプトである.
|
|
174 \item{Cassandra}
|
2
|
175 Cassandra 0.6.3を使用した.
|
1
|
176 \item{MySQL}
|
2
|
177 MySQL 5.5を使用した. Cassandraと似たデータ構造を持たせるために表\ref{tab:mysql_tbl_def}のような構造でテーブルを作成した.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178 \begin{table}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 \caption{テーブルの定義}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
180 \label{tab:mysql_tbl_def}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
181 \begin{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
182 \begin{tabular}{|c|c|c|} \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 フィールド名 & データタイプ & 備考 \\ \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 NAME & VARCHAR(100) & UNIQUE \\ \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 VALUE & VARCHAR(100) & - \\ \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
186 TIMEUUID & LONG & - \\ \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 \end{tabular}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188 \end{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 \end{table}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
190 \end{enumerate}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 \newpage
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 \section{実験結果と考察}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 \subsection{単純なベンチマーク}
|
1
|
194 はじめに, 単純なベンチマークを行った. 単体のクライアントとサーバーを用意し, CassandraとMySQLの実行時間の比較を行った. 結果を表\ref{tab:bench1}に示す. この時のCassandraのConsistencyLevelはONEである.
|
|
195
|
|
196 結果を見てみると, MySQLよりCassandraのほうが高速に動作していることが分かる. MyySQLはC++で記述されているがCassandraはJavaであるため, 動作が遅い. よって, 単純な使用方法ではCassandraよりMySQLの方が優れていると言える, 普通の方法ではCassandraの性能を引き出すことは出来ない.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197 \begin{table}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198 \caption{単純なベンチマークの結果(Read)}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 \begin{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
200 \begin{tabular}{|c|c|c|} \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
201 & Cassandra & MySQL \\ \hline
|
4
|
202 MacMini& 13.72s & 5.94s \\ \hline
|
|
203 Core i7& 12.56s & 3.99s \\ \hline
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 \end{tabular}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 \end{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
206 \vspace{5mm}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 \caption{単純なベンチマークの結果(Write)}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 \begin{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209 \begin{tabular}{|c|c|c|} \hline
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 & Cassandra & MySQL \\ \hline
|
4
|
211 MacMini& 11.75s & 5.7s \\ \hline
|
|
212 Core i7& 9.62s & 5.3s \\ \hline
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 \end{tabular}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 \end{center}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 \end{table}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 \subsection{コア数の少ないサーバー上でのベンチマーク}
|
4
|
217 次に, クライアントを並列化しての実験を行う. ここでは, コア数の少ないMacMiniを用いる. クライアントの並列化はスクリプトを指定した時間に同時起動するようにして実装した.
|
1
|
218 実験結果を図\ref{fig:bench2-R}と図\ref{fig:bench2-W}に示す.
|
|
219
|
|
220 Readは両方とも, 同じような推移の仕方をしているが, Cassandraの方が遅い. しかし, WriteはCassandraの方が断然速く動作している. この実験では, Cassandraの動作を基準に考えたため書き込みのコマンドにREPLACEを使用した. REPLACEは置き換えるようなコマンドである. そのため, INSERTに比べて多少遅くなる. それがこのグラフに出ているのではないかと考えられる. SEDAは複数のスレッドで動作しているためコア数が少ないサーバーでは性能が出にくいことがわかる.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
221 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
222 \begin{center}
|
2
|
223 \scalebox{0.33}{\includegraphics{./fig/serv1_read.pdf}}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
224 \end{center}
|
4
|
225 \caption{MacMini上でのベンチマーク(Read)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
226 \label{fig:bench2-R}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
227 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
228 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
229 \begin{center}
|
2
|
230 \scalebox{0.33}{\includegraphics{./fig/serv1_write.pdf}}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231 \end{center}
|
4
|
232 \caption{MacMini上でのベンチマーク(Write)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
233 \label{fig:bench2-W}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
234 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
235 \subsection{コア数の多いサーバー上でのベンチマーク}
|
4
|
236 クライアントを並列化した状態で, コア数の多いCore i7を用いたベンチマークを行う. 実験結果を図\ref{fig:bench3-R}と図\ref{fig:bench3-W}に示す.
|
1
|
237
|
4
|
238 Read/Write共にMySQLの性能を超えることに成功した. Readにおいてはコア数が少ない場合に超えることが出来なかったが, 並列度が70度付近でMySQLを上回る正農がでている.
|
|
239 Cassandraの平均時間は並列度が増加しても, MySQLよりは平均時間の上昇は少ない. これは, SEDAの特徴である, 多くのタスクを並列に実行すると性能を発揮することを確認することが出来た.
|
|
240 また, SEDAはマルチスレッド前提であるため, コア数が少ないMacMiniでは性能が出ず, コア数の多いCore i7で性能が発揮できるということが分かる.
|
1
|
241
|
|
242 つまり, Cassandraは負荷が高いときにMySQLを超える性能を出すことが出来る. 負荷がかかっても性能の劣化が少ないことを考えると考えると遅延をあまり考慮しなくても済むのではないだろうか.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
243 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
244 \begin{center}
|
2
|
245 \scalebox{0.33}{\includegraphics{./fig/serv2_read.pdf}}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
246 \end{center}
|
4
|
247 \caption{Core i7上でのベンチマーク(Read)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
248 \label{fig:bench3-R}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
249 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
250 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
251 \begin{center}
|
2
|
252 \scalebox{0.33}{\includegraphics{./fig/serv2_write.pdf}}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
253 \end{center}
|
4
|
254 \caption{Core i7上でのベンチマーク(Write)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
255 \label{fig:bench3-W}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
256 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
257 \subsection{複数ノードで構成したCassadraのベンチマーク}
|
4
|
258 最後に分散しなかったCassandraと複数ノードで構成したCassandraの比較を行う. サーバーはMacMiniを5台使用して行った. 実験結果を図\ref{fig:bench4-R}と図\ref{fig:bench4-W}に示す.
|
|
259 Read/Writeともに, 今回の場合は分散を行わなかったほうが性能を引き出せてることが分る. これは, 実験に使用したデータがRead/Write共に1つだけで, 結局は同じノードにリクエストが転送されている. そのため, リクエストは1台のノードに集中する. よって, 性能が出ないのではないかと考えられる. Cassandraをただ増やすだけでは性能は得ることが出来ず, データも分散させて実験を行わなければならない.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
260 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
261 \begin{center}
|
2
|
262 \scalebox{0.33}{\includegraphics{./fig/cluster_read.pdf}}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
263 \end{center}
|
4
|
264 \caption{MacMiniを複数ノードにしたベンチマーク(Read)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
265 \label{fig:bench4-R}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
266 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
267 \begin{figure}[h]
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
268 \begin{center}
|
2
|
269 \scalebox{0.33}{\includegraphics{./fig/cluster_write.pdf}}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
270 \end{center}
|
4
|
271 \caption{MacMiniを複数ノードにしたベンチマーク(Write)}
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
272 \label{fig:bench4-W}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
273 \end{figure}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
274 \newpage
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
275 \section{まとめ}
|
4
|
276 Cassandraは従来の使用方法では性能を発揮することが出来ずコア数が多いサーバーでクライアントの並列度が高い場合に性能を発揮する.
|
5
|
277 これは,ベンチマークの結果を考察すると,コア数が少ない場合ReadはMySQLより遅いがほぼ同し推移の仕方をする.
|
|
278 Writeは,コア数が少なくてもクライアントの並列度を高く設定すればMySQLより性能が出る.
|
|
279 コア数が多い場合,Read・Write共に,初めはやはりMySQLの方が動作が早いが,グラフの傾きはMySQLの方が大きくCassandraは緩やかである.
|
|
280 特にCassandraのWhiteの性能は高く, MySQLを大きく上回っている.
|
2
|
281 また, 単純にCassandraのノード数を増やしても性能は高くならない. これは, データも綺麗に分散させてあげないとデータを読み込む際に一定のノードに集中してしまい,他のノードにアクセスを分散しても結局は保持しているノードに聞きに行かないといけないことになるからである.
|
4
|
282 データもある程度分散させなければならないため,汎用的なhash関数では性能が発揮できなく, そのアプリケーション専用の関数が必要だと思われる.
|
|
283 格納されるデータを決めるのにStrategyというものがあり, それを利用することで実装できると思われる.
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
284 \section{今後の課題}
|
4
|
285 今後は, Strategyを拡張し複数のデータをノードに分散させた環境下でベンチマークを行い, その結果をCassandra単体でのベンチマーク結果と比較したいと考えている.
|
1
|
286
|
3
|
287 % 本文で引用しない限り、参考文献には挙げないものなんだよ
|
|
288
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
289 \begin{adjustvboxheight} % needed only when Appendix follows
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
290 \begin{thebibliography}{99}
|
4
|
291 \bibitem{YCSB} Benchmarking Cloud Serving Systems with YCSB
|
|
292 \bibitem{SEDA1} The Staged Event-Driven Architecture for Highly-Concurrent Server Applications
|
|
293 \bibitem{SEDA2} SEDA : An Architecture for Well-Conditioned , Scalable Internet Services
|
|
294 \bibitem{BIGTABLE} Bigtable : A Distributed Storege System for Structured Data
|
0
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
295 \end{thebibliography}
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
296 \end{adjustvboxheight} % needed only when Appendix follows
|
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
297 \end{document}
|