comparison paper/chapter2.tex @ 61:c5c761588168

Modified chapter3
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 01 Feb 2014 10:23:28 +0900
parents faa708c2958b
children 4f31182c8244
comparison
equal deleted inserted replaced
60:fd226352f17c 61:c5c761588168
1 \chapter{木構造データベースJungle} 1 \chapter{木構造データベースJungle}
2 Jungle はスケーラビリティのある CMS の開発を目指して当研究室で開発されている非破壊的木構造データベースである. 2 Jungle はスケーラビリティのあるCMSの開発を目指して当研究室で開発されている非破壊的木構造データベースである.
3 一般的なコンテンツマネジメントシステムではブログツールや Wiki・SNS が多く, これらの 3 一般的なコンテンツマネジメントシステムではブログツールやWiki・SNSが多く, これらの
4 ウェブサイトの構造は大体が木構造であるため, データ構造として木構造を採用している. 4 ウェブサイトの構造は大体が木構造であるため, データ構造として木構造を採用している.
5 現在 Java と Haskell によりそれぞれ言語で開発されており本研究で扱うのは Java 版である. 5 現在JavaとHaskellによりそれぞれ言語で開発されており本研究で扱うのはJava版である.
6 6
7 本章ではまず破壊的木構造と, 非破壊的木構造の説明をし, Jungle におけるデータ分散の設計について述べる. 7 本章ではまず破壊的木構造と, 非破壊的木構造の説明をし, Jungleにおけるデータ分散の設計について述べる.
8 \subsection{破壊的木構造} 8 \subsection{破壊的木構造}
9 破壊的木構造の編集は, 木構造で保持しているデータを直接書き換えることで行う. 9 破壊的木構造の編集は, 木構造で保持しているデータを直接書き換えることで行う.
10 図\ref{fig:destractive}は破壊的木構造の編集を表している. 10 図\ref{fig:destractive}は破壊的木構造のにおけるデータ編集を表している.
11 11
12 \begin{figure}[htpb] 12 \begin{figure}[htpb]
13 \begin{center} 13 \begin{center}
14 \includegraphics[scale=0.7]{figures/destructive_tree.pdf} 14 \includegraphics[scale=0.7]{figures/destructive_tree.pdf}
15 \caption{破壊的木構造の編集} 15 \caption{破壊的木構造の編集}
77 \end{center} 77 \end{center}
78 \end{figure} 78 \end{figure}
79 79
80 \newpage 80 \newpage
81 81
82 非破壊的木構造においてデータのロックが必要となる部分は, 木のコピーを作終えた後に 82 非破壊的木構造においてデータのロックが必要となる部分は, 木のコピーを作終りえた後に
83 ルートノードを更新するときだけである. 83 ルートノードを更新するときだけである.
84 データ編集を行っている間ロックが必要な破壊的木構造に比べ, 編集中においてもデータの読み込みが 84 データ編集を行っている間ロックが必要な破壊的木構造に比べ, 編集中においてもデータの読み込みが
85 可能である(図\ref{fig:nondestractive_merit}). 85 可能である(図\ref{fig:nondestractive_merit}).
86 そのため, 破壊的木構造に比べスケールがしやすくなっている. 86 そのため, 破壊的木構造に比べスケールがしやすくなっている.
87 87
91 \caption{非破壊的木構造による利点} 91 \caption{非破壊的木構造による利点}
92 \label{fig:nondestractive_merit} 92 \label{fig:nondestractive_merit}
93 \end{center} 93 \end{center}
94 \end{figure} 94 \end{figure}
95 95
96 \newpage
96 97
97 \section{Jungle におけるデータへのアクセス} 98 \section{Jungle におけるデータへのアクセス}
98 Jungle ではデータをそれぞれの Node が attribute として保持する. 99 Jungleにおいてのデータアクセス手段について述べる.
99 attribute は String 型の Key と ByteBuffer の value のペアにより表される. 100 Jungleではデータをそれぞれの Node が attribute として保持する.
100 Jungle でデータへのアクセスは, この Node へのアクセスをさす. 101 attributeはKey-Valueによりデータを保持する.
102 KeyはString型でValueはByteBufferを使用している.
103 Jungleでデータへのアクセスは, このNodeへのアクセスをさす.
101 Node へのアクセスは, 木の名前と Node を指すパスにより行える. 104 Node へのアクセスは, 木の名前と Node を指すパスにより行える.
102 このパスは NodePath と呼ばれる(図\ref{fig:nodepath}). 105 このパスは NodePath と呼ばれる(図\ref{fig:nodepath}).
103 106
104 \begin{figure}[htpb] 107 \begin{figure}[htpb]
105 \begin{center} 108 \begin{center}
116 \subsection{NodeOperation} 119 \subsection{NodeOperation}
117 Jungle による最小のデータ編集は Node の編集を指す. 120 Jungle による最小のデータ編集は Node の編集を指す.
118 Node 編集のために API が用意されており, この API は NodeOperation と呼ばれる. 121 Node 編集のために API が用意されており, この API は NodeOperation と呼ばれる.
119 NodeOperation には次の4つの API が用意されている. 122 NodeOperation には次の4つの API が用意されている.
120 \begin{itemize} 123 \begin{itemize}
121 \item \verb|addNewChild(NodePath _path, int _pos)| 124 \item \verb|addNewChild(NodePath _path, int _pos)|\\
122 NodePath で指定された Node に子供となる Node を追加する API である. 125 NodePath で指定された Node に子供となる Node を追加する API である.
123 pos で指定された番号に子供として追加を行う. 126 pos で指定された番号に子供として追加を行う.
124 \item \verb|deleteChildAt(NodePath _path, int _pos)| 127 \item \verb|deleteChildAt(NodePath _path, int _pos)|\\
125 NodePath と pos により指定される Node を削除する API である. 128 NodePath と pos により指定される Node を削除する API である.
126 \item \verb|putAttribute(NodePath _path, String _key, ByteBuffer _value)| 129 \item \verb|putAttribute(NodePath _path, String _key, ByteBuffer _value)|\\
127 Node に attribute を追加する API である. 130 Node に attribute を追加する API である.
128 NodePath は attribute を追加する Node を指す. 131 NodePath は attribute を追加する Node を指す.
129 \item \verb|deleteAttribute(NodePath _path, String _key)| 132 \item \verb|deleteAttribute(NodePath _path, String _key)|\\
130 \verb|_key| が示す attribute の削除を行う API である. 133 \verb|_key| が示す attribute の削除を行う API である.
131 NodePath は Node を示す. 134 NodePath は Node を示す.
132 \end{itemize} 135 \end{itemize}
133 136
134 NodeOperationはNodePathとセットで扱わなければならず, このセットを 137 NodeOperationはNodePathとセットで扱わなければならず, このセットを
149 public TreeOperationLog append(TreeOperationLog _log); 152 public TreeOperationLog append(TreeOperationLog _log);
150 public int length(); 153 public int length();
151 } 154 }
152 \end{lstlisting} 155 \end{lstlisting}
153 \verb|Iterable<TreeOperation>|を継承しているためIteratorによりTreeOperationを取り出せるようになっている. 156 \verb|Iterable<TreeOperation>|を継承しているためIteratorによりTreeOperationを取り出せるようになっている.
154 addやappendメソッドを使ってTreeOperationを積み上げていくことができる 157 addやappendメソッドを使ってTreeOperationを積み上げていくことができる.
155 158
156 次にデータ編集により発生するTreeOperationLogの具体的な例を示す(\ref{src:treelog}). 159 次にデータ編集により発生するTreeOperationLogの具体的な例を示す(\ref{src:treelog}).
157 \begin{lstlisting}[frame=lrbt,label=src:treelog,caption=トポロジーマネージャーの利用,numbers=left] 160 \begin{lstlisting}[frame=lrbt,label=src:treelog,caption=トポロジーマネージャーの利用,numbers=left]
158 [APPEND_CHILD:<-1>:pos:0] 161 [APPEND_CHILD:<-1>:pos:0]
159 [PUT_ATTRIBUTE:<-1,0>:key:author,value:oshiro] 162 [PUT_ATTRIBUTE:<-1,0>:key:author,value:oshiro]
172 \label{fig:treeoperationlog} 175 \label{fig:treeoperationlog}
173 \end{center} 176 \end{center}
174 \end{figure} 177 \end{figure}
175 178
176 図\ref{fig:treeoperationlog}の説明を行う. 179 図\ref{fig:treeoperationlog}の説明を行う.
177 まず, \verb|APPEND_CHILD| により Root Node の 0 番目の子供となる Node の追加を行う. 180 まず, \verb|APPEND_CHILD:<-1>:pos:0|によりRoot Nodeの0番目の子供となるNodeの追加を行う.
178 次に, 追加を行った Node に対して \verb|PUT_ATTRIBUTE| により attribute の情報を持たせていく. 181 次に, 追加を行ったNodeに対して\verb|PUT_ATTRIBUTE<-1,0>| により attribute の情報を持たせていく.
179 attribute の内容に作者の情報を表す auther, メッセージの内容を表す mes, そしてタイムスタンプ 182 attributeの内容に作者の情報を表すauther, メッセージの内容を表すmes, そしてタイムスタンプ
180 を timestamp とそれぞれキーにすることで追加される. 183 をtimestampとそれぞれキーにすることで追加される.
181 184
182 以上が掲示板プログラムにおける1つの書き込みで発生する TreeOperationLog である. 185 以上が掲示板プログラムにおける1つの書き込みで発生する TreeOperationLog である.
183 186
184 \section{分散バージョン管理システムによるデータの分散} 187 \newpage
185 Jungle は Git や Mercurial といった分散バージョン管理システムの機能を参考に作られている.
186 分散バージョン管理システムとは, 多人数によるソフトウェア開発において変更履歴を管理するシステムである.
187 % 反対の意味の言葉として集中型バージョン管理システムがある.
188 分散管理システムでは開発者それぞれがローカルにリポジトリのクローンを持ち, 開発はこのリポジトリを通すことで進められる(図\ref{fig:distributed_repo}).
189 ローカルのリポジトリは独立に損刺し, サーバ上にあるリポジトリや他人のリポジトリで行われた変更履歴を取り込みアップデートにかけることができる.
190 また逆に, ローカルのリポジトリに開発者自身がかけたアップデートを他のリポジトリへと反映させることもできる.
191 分散管理システムでは, どれかリポジトリが壊れたとしても, 別のリポジトリからクローンを行うことができる.
192 ネットワークに障害が発生しても, ローカルにある編集履歴をネットワーク復旧後に伝えることができる.
193 そのため, 可用性と分断耐性が高いと言える.
194 % 分散管理システムは結果整合性をとることを述べる.
195 % 結果整合性の話を先にどっかでしたほうがいいかも
196 \begin{figure}[htpb]
197 \begin{center}
198 \includegraphics[scale=0.7]{figures/distributed_repository.pdf}
199 \caption{分散バージョン管理システム}
200 \label{fig:distributed_repo}
201 \end{center}
202 \end{figure}
203
204
205 \subsection{マージによるデータ変更衝突の解決}
206 分散管理システムでは, データの更新時において衝突が発生する時がある.
207 それは, 分散管理システムを参考にしている Jungle においても起こる問題である.
208 データの変更を行うときには, 元のデータに編集が加えられている状態かもしれない.
209 Jungle はリクエストがきた場合, 現在もっているデータを返す.
210 そのためデータは最新のものであるかは保証されない.
211 この場合, 古いデータに編集が加えられ, それを更に最新のデータへ伝搬させなければならない.
212 このように他のリポジトリにより先にデータ編集が行われており, データの伝搬が素直にできない状態を
213 衝突という.
214 この衝突を解決する手段が必要である.
215 分散管理システムでは衝突に対してマージと呼ばれる作業で解決をはかる.
216 マージは, 相手のリポジトリのデータ編集履歴を受け取り, ローカルにあるリポジトリの編集と合わせる作業である.
217 データ衝突に対して Jungle はアプリケーションレベルでのマージを実装して貰うことで解決をはかる.
218
219 以下にマージが必要な場合とそうでない場合のデータ編集についての図を示す(図\ref{fig:tree_conflict1},\ref{fig:tree_conflict2},\ref{fig:tree_conflict3}).
220
221 \begin{figure}[htpb]
222 \begin{center}
223 \includegraphics[scale=0.48]{figures/tree_conflict.pdf}
224 \caption{衝突の発生しないデータ編集}
225 \label{fig:tree_conflict1}
226 \end{center}
227 \end{figure}
228
229 \begin{figure}[htpb]
230 \begin{center}
231 \includegraphics[scale=0.48]{figures/tree_conflict3.pdf}
232 \caption{自然に衝突を解決できるデータ編集}
233 \label{fig:tree_conflict2}
234 \end{center}
235 \end{figure}
236
237 \begin{figure}[htpb]
238 \begin{center}
239 \includegraphics[scale=0.48]{figures/tree_conflict2.pdf}
240 \caption{衝突が発生するデータ編集}
241 \label{fig:tree_conflict3}
242 \end{center}
243 \end{figure}
244
245
246 \section{ネットワークトポロジーの形成}
247 分散管理システムを参考に Jungle でもそれぞれのデータベースが独立に
248 動くようにしたい.
249 そのために必要なことはトポロジーの形成と, サーバノード間でのデータアクセス機構である.
250 また, データ分散のために形成したトポロジー上で扱うデータを決めなければならない.
251
252
253 \subsection{ツリートポロジーの形成}
254 分散データーベス Jungle で形成されるネットワークトポロジーはツリー構造を想定している.
255 ツリー構造ならば, データの整合性をとる場合, 一度トップまでデータを伝搬させることで行える.
256 トップもしくはトップまでの間にあるサーバノードでデータ伝搬中に衝突が発生したらマージを行い, マージの結果を改めて伝搬すれば
257 よいからである.
258 また, リング型, スター型, メッシュ側ではデータ編集の結果を他サーバノードに流すとき
259 流したデータが自分自身にくることにより発生するループに気をつける必要がある.
260 ツリー構造の場合は, サーバノード同士の繋がりで閉路が無い.
261 そのため, 自分自身が行ったデータ編集の履歴を繋がっているノードに送信するだけですむ.
262 このルーティングの方式はスプリットホライズンと呼ばれるものである.
263
264 \begin{figure}[htpb]
265 \begin{center}
266 \includegraphics[scale=0.70]{figures/network_topology_tree.pdf}
267 \caption{ツリー型のNetwork Topology}
268 \label{fig:topology_tree}
269 \end{center}
270 \end{figure}
271
272
273 \subsection{トポロジーの形成手段}
274 Jungle で使用するネットワークトポロジーはツリー型を考えているが, リング型やメッシュ型といった
275 他のネットワークトポロジーによる実装に関しても試す余地はある.
276 そのため, ツリーだけでなく, 自由にネットワークトポロジーの形成を行えるようにしたい.
277
278 \begin{figure}[htpb]
279 \begin{minipage}{0.5\hsize}
280 \begin{center}
281 \includegraphics[scale=0.7]{figures/network_topology_ring.pdf}
282 \caption{リング型のトポロジー}
283 \label{fig:topology_ring}
284 \end{center}
285 \end{minipage}
286 \begin{minipage}{0.5\hsize}
287 \begin{center}
288 \includegraphics[scale=0.7]{figures/topology_mesh.pdf}
289 \caption{メッシュ型のトポロジー}
290 \label{fig:topology_mesh}
291 \end{center}
292 \end{minipage}
293 \end{figure}
294
295
296 そこで当研究室で開発を行っている並列分散フレームワークである Alice を使用する.
297 Alice はユーザが望んだマシンへの接続や必要なデータへのアクセスを行う機構と, 接続トポロジー
298 形成機能を提供している.
299
300 % トポロジー形成の説明をする. 重要さなども。
301 % トポロジーの形成は容易ではない.
302 % Alice が必要な機能を提供してくれることを述べる
303 % Alice はトポロジー形成の機能を提供している
304 % トポロジー間でのデータの受け渡す機能も提供している
305
306
307 \section{並列分散フレームワークAlice}
308 Alice は当研究室で開発している並列分散フレームワークである.
309 Alice はデータを DataSegment, タスクを CodeSegment という単位で扱うプログラミングを提供している.
310 コードの部分となる CodeSegment は, 計算に必要なデータである DataSegment が揃い次第実行が行われる(図\ref{fig:cs_ds}).
311 CodeSegment の結果により出力される新たなデータでは, 別の CodeSegment が実行されるための DataSegment となる.
312 DataSegment と CodeSegment の組み合わせにより並列・分散プログラミングの依存関係が表される.
313
314 \begin{figure}[htpb]
315 \begin{center}
316 \includegraphics[scale=0.70]{figures/cs_ds.pdf}
317 \caption{DataSegment と CodeSegment によるプログラムの流れ}
318 \label{fig:cs_ds}
319 \end{center}
320 \end{figure}
321
322 \subsection{MessagePack によるシリアライズ}
323 Alice では DataSegment のデータ表現に MessagePack(http://msgpack.org) を利用している.
324 MessagePack はオブジェクトをバイナリへと変換させるシリアライズライブラリである.
325 Alice によりネットワークを介してデータにアクセスするときは, そのデータが MessagePack でシリアライズが
326 行えることが条件である.
327
328
329
330 \section{Jungle のデータ分散}
331 Alice によりトポロジーの形成とデータアクセスの機構が提供された.
332 後はデータ分散の為にどのデータをネットワークに流すのか決めなければならない.
333 そこで選ばれたのが TreeOperationLog である.
334 TreeOperationLog はデータ編集の履歴になる.
335 どの Node にどのような操作をしたのかという情報が入っている.
336 この TreeOperationLog を Alice を使って他サーバノードに送り, データの編集をしてもらうことで
337 同じデータを持つことが可能となる.
338 Alice を用いるため, この TreeOperationLog は MessagePack によりシリアライズ可能な形にすることが
339 必要である.
340
341
342 \subsection{CAP 定理と Jungle}
343 ここまでの Jungle の設計を踏まえて, CAP 定理における Jungle の立ち位置を考える.
344 分散管理バージョンのように独立したリポジトリもち, それぞれが独自の変更を加えることが
345 行えることで一貫性はゆるい.
346 だが, ネットワークから切断されてもローカルで行ったデータの変更をネットワーク復旧後で伝搬できる
347 ことと, リクエストに対し持っているデータをすぐに返すことができる.
348 つまり Jungle は可用性と分断耐性に優れたデータベースを目指している.
349 第2章で紹介した既存のデータベースと Jungle との CAP 定理の関係を図\ref{fig:cap_theorem}に示す.
350
351 \begin{figure}[htpb]
352 \begin{center}
353 \includegraphics[scale=0.7]{figures/cap_theorem.pdf}
354 \caption{CAP 定理における各データベースの立ち位置}
355 \label{fig:cap_theorem}
356 \end{center}
357 \end{figure}
358
359
360
361
362 \section{ログによるデータの永続性}
363 % TreeOperationLog(ログ)をシリアライズ可能な形にしてデータをおくること
364 % シリアライズできる形にしたものをそのままHDに書き出すだけでログの永続性は行える
365 Jungle は非破壊でさらにオンメモリにデータを保持するため, 使用するメモリの容量が大きくなる.
366 そのため, ハードディスクに書き出し, 一定の区切りで保持している過去のデータをメモリ上から掃除しなければならない.
367 そこで, ログによるデータの永続性の実装を行う.
368 ここでログをどのようなデータ表現でハードディスクへと書きだすかという問題が発生するが, これは Alice を使うことで
369 解決している.
370 Alice を用いるため MessagePack によりシリアライズ可能な TreeOperationLog ができる.
371 このシリアライズ可能な TreeOperationLog をそのままハードディスクへ書き込むこととでログの永続性ができる.
372
373
374
375