Mercurial > hg > Papers > 2014 > nobuyasu-master
view paper/chapter3.tex @ 31:9eb676914f1d
Writed description of jungle edit
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 27 Jan 2014 19:53:12 +0900 |
parents | 67880a2ca650 |
children | 04af243ddd7c |
line wrap: on
line source
\chapter{Jungleの分散実装} \section{TreeOperationLogを用いての分散データベースの実装} Jungle でデータ扱うと TreeOperationLog として残ることは述べた. この TreeOperationLog を他のサーバへと送り, Jungle の編集を行って 貰うことでデータの分散を行うことができる. ここで問題になることはネットワークトポロジーの形成方法であった. % なぜツリー型なのか説明をしたほうがいい? % マージの利用のためツリー型? Jungle で使用するネットワークトポロジーはツリー型を考えている. しかし, リング型といった他のネットワークトポロジーによる実装に関しても試す余地はある. 自由にネットワークトポロジーの形成を行うことができる必要があった. そこで当研究室で開発を行っている並列分散フレームワークである Alice を使用する. Alice により提供されるネットワークトポロジー形成を用いて TreeOperationLog を各サーバノードへ 配ることで並列分散フレームワークの実装を行う. % トポロジー形成の説明をする. 重要さなども。 % トポロジーの形成は容易ではない. % Alice が必要な機能を提供してくれることを述べる % Alice はトポロジー形成の機能を提供している % トポロジー間でのデータの受け渡す機能も提供している \begin{figure}[htpb] \begin{minipage}{0.5\hsize} \begin{center} \includegraphics[scale=0.7]{figures/network_topology_ring.pdf} \caption{リング型のNetwork Topology} \label{fig:topology_ring} \end{center} \end{minipage} \begin{minipage}{0.5\hsize} \begin{center} \includegraphics[scale=0.7]{figures/network_topology_tree.pdf} \caption{ツリー型のNetwork Topology} \label{fig:topology_tree} \end{center} \end{minipage} \end{figure} \section{並列分散フレームワークAlice} Alice は当研究室で開発している並列分散フレームワークである. Alice はデータを DataSegment, コードを CodeSegment という単位で扱うプログラミングを提供している. DataSegment として扱われるデータは % DataSegment, CodeSegment はなしにしたほうがいいかもしれない. Alice が論文の主題じゃないから % それとこの2つの説明をするとしたら結構な量になる \section{Alice のトポロジーマネージャーの利用} Alice はサーバノード同士によるネットワークトポロジー形成の機能を持つ. トポロジーマネージャーの起動は\ref{src:alice_dot}の様にポート番号の指定と dot ファイルを引数として渡すことで行う. (\ref{src:alice_ntm_run}). \begin{lstlisting}[frame=lrbt,label=src:alice_ntm_run,caption=Alice によるネットワークトポロジーマネージャーの起動,numbers=left] % java -cp Alice.jar alice.topology.manager.TopologyManager -p 10000 -conf ./topology/tree5.dot \end{lstlisting} ポート番号は Alice により記述された並列分散プログラムの起動時に渡す必要がある. dot ファイルには, トポロジーをどのように形成するかが書かれている. 以下に, サーバノード数5で, 2分木ツリー構造を形成する dot ファイルの例を示す(\ref{src:alice_dot}). \begin{lstlisting}[frame=lrbt,label=src:alice_dot,caption=ネットワークトポロジー設定用 dot ファイル,numbers=left] % cat tree5.dot digraph test { node0 -> node1 [label="child1"] node0 -> node2 [label="child2"] node1 -> node0 [label="parent"] node1 -> node3 [label="child1"] node1 -> node4 [label="child2"] node2 -> node0 [label="parent"] node3 -> node1 [label="parent"] node4 -> node1 [label="parent"] } \end{lstlisting} node0 や node1 はサーバノードの名前を示す. サーバノードの間にはラベルがあり, Alice 上ではこのラベル に指定される文字列(キー)を使うことで他のサーバノードのデータへアクセスすることができる. node0 -> node1 はサーバノード同士の繋がりを示している. 次に続く label="child1" は, node0 が node1 のデータに"child1"という文字列を使うことでアクセス できることを示す. dot ファイルを読み込んだ Alice のトポロジーマネージャーに対して, サーバノードは 誰に接続を行えばよいかを訪ねる. トポロジーマネージャーは訪ねてきたサーバノードに対してノード番号を割り振り, dot ファイル に記述している通りにサーバノード同士が接続を行うよう指示をだす. トポロジーマネージャーは接続要求先を聞いてくるサーバノードに対して名前を割り振り, 接続相手を伝える. dot ファイル\ref{src:alice_dot}により形成されるトポロジーを図\ref{fig:tree_topology}に示す. \newpage \begin{figure}[htpb] \begin{center} \includegraphics[scale=0.70]{figures/tree_topology.pdf} \caption{Alice によるネットワークトポロジー形成} \label{fig:tree_topology} \end{center} \end{figure} 矢印に書かれている文字列は, 相手のデータにアクセスするキーを示す. "child1", "child2", "parent" というキーを使うことで別のサーバノードにあるデータを取得することができる. %子共となるノードは "parent" キーにより親の DSM (Remote DSM) にアクセスすることができる. %また, 親も子供となるノードの DSM に対して "child1" や "child2" キーによりアクセスすることが可能となる. トポロジーマネージャーに最初に接続要求を行う並列分散プログラム側は, 次のように記述する(\ref{src:alice_start}) \begin{lstlisting}[frame=lrbt,label=src:alice_start,caption=Alice を使用してのトポロジー形成,numbers=left] public static void main( String[] args ) throws Exception { RemoteConfig conf = new RemoteConfig(args); new TopologyNode(conf, new StartBBSCodeSegment(args, conf.bbsPort)); } \end{lstlisting} そして, プログラムの起動時にはトポロジーマネージャーが動いているサーバのドメインとポート番号を 渡すことでトポロジーの形成が行われれプログラムの処理がはしる. 例えば, mass00.cs.ie.u-ryukyu.ac.jp というサーバ上でポート番号10000を指定してトポロジーマネージャーを 起動した場合は次のようになる(\ref{src:run_program}). \begin{lstlisting}[frame=lrbt,label=src:run_program,caption=トポロジーマネージャーの利用,numbers=left] % java Program -host mass00.cs.ie.u-ryukyu.ac.jp -port 10000 \end{lstlisting} % MessagePackの説明もここに簡単に入れたほうがいいかも. \section{Aliceを用いての分散実装} 形成されたトポロジー上でのデータの送受信を行う部分について述べる. \section{ログのシリアライズ} ここでログのシリアライズについて述べる. シリアライズとは, データをネットワーク上に流しても良い形式に変換することである. \section{掲示板プログラムにおけるマージの実装} Jungle に分散実装を行った後の問題としてデータ衝突がある. 他のサーバノードから送られてくるデータが既に手元で変更を加えた木構造を対象とした 場合に発生する問題である. Jungle ではこれをアプリケーション毎にマージを実装することで解決させる. 今回分散実装を行い, 例題として掲示板プログラムを用意した. 掲示板プログラムに実装を行ったマージについて述べる. まず Jungle を用いた掲示板プログラムのデータ保持方法を図\ref{fig:merge2}に示す. \begin{figure}[htpb] \begin{center} \includegraphics[scale=0.70]{figures/merge2.pdf} \caption{Jungle による掲示板プログラムのデータ保持方法} \label{fig:merge2} \end{center} \end{figure} 掲示板プログラムでは各掲示板毎に1つの木構造が作成される. 掲示板への1つの書き込みは子ノードを1つ追加することに相当する. また, 各子ノードは attributes として書き込みの内容である message と書き込まれた時間を表す timestamp を保持している. 先に追加された順で子ノードには若い番号が割り振られる. 他サーバノードからの書き込みをそのまま子ノードの後ろに追加してしまうと, データの整合性が崩れてしまう. この時の状態を表しているのが図\ref{fig:merge_imp1}と\ref{fig:merge_imp2}になる. \begin{figure}[htpb] \begin{center} \includegraphics[scale=0.70]{figures/merge_imp1.pdf} \caption{他サーバノードの編集データ反映による整合性の崩れ1} \label{fig:merge_imp1} \end{center} \end{figure} \begin{figure}[htpb] \begin{center} \includegraphics[scale=0.70]{figures/merge_imp2.pdf} \caption{他サーバノードの編集データ反映による整合性の崩れ2} \label{fig:merge_imp2} \end{center} \end{figure} \newpage 図\ref{fig:merge_imp2}の server node0 の木の状態にするのが理想である. 掲示板のへの書き込みの表示は, 書き込みされた時間が早い順に表示されるようにしたい. これを timestamp を利用することで行う. 他サーバノードから来たデータに関しては, timestamp を参照し, 次に自分の保持している 木の子ノードの timestamp と比べていくことでデータの追加する場所を決める. これが今回実装を行った掲示板システムにおけるマージになる. %単一サーバで動いている時の Jungle はただ子ノードとして後ろに追加するだけだが, 分散 %環境下においては timestamp に従い子ノードを追加する位置を決めるようにする.