Mercurial > hg > Papers > 2014 > nobuyasu-master
annotate paper/chapter4.tex @ 62:2cb5ac9282b0
writed description of ods.put
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 01 Feb 2014 11:44:34 +0900 |
parents | c5c761588168 |
children | d770a2b534b3 |
rev | line source |
---|---|
50 | 1 \chapter{木構造データベースJungleの分散実装} |
2 前章では Jungle のアーキテクチャと分散設計について説明した. | |
3 トポロジーの形成と他サーバノードのデータのアクセス方法には Alice を使用する. | |
4 また, Jungle ではデータ編集のログとして TreeOperationLog がある. | |
5 この TreeOperationLog を Alice により他サーバノードへ送ることでデータの分散を行う. | |
6 | |
61
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
7 本章では Jungle に行った分散実装について述べる. |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
8 まず, Aliceによるトポロジー形成の仕方を述べ, Aliceを利用したプログラミングの方法に |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
9 ついて説明を行う. |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
10 Aliceの提供する分散プログラミングにおけるデータアクセス機構について述べ, それらを使用する |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
11 上での注意点を述べる. |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
12 次に, それらをふまえてJungleの分散実装を行っていく. |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
13 データ分散に必要なクラスを用意することで他サーバノードとの通信を行う. |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
14 最後に, データ更新時の衝突において具体的なMergeの例として掲示板プログラムにおけるMergeについて述べる. |
c5c761588168
Modified chapter3
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
50
diff
changeset
|
15 |
50 | 16 \section{Alice のトポロジーマネージャーの利用} |
17 | |
18 \subsection{トポロジーマネージャーの起動} | |
19 Alice を用いてサーバノードでトポロジーの形成を行う方法を述べる. | |
20 Alice のトポロジーマネージャーの起動は\ref{src:alice_dot}の様に行う. | |
21 (\ref{src:alice_ntm_run}). | |
22 \begin{lstlisting}[frame=lrbt,label=src:alice_ntm_run,caption=Alice によるネットワークトポロジーマネージャーの起動,numbers=left] | |
23 % java -cp Alice.jar alice.topology.manager.TopologyManager -p 10000 -conf ./topology/tree5.dot | |
24 \end{lstlisting} | |
25 -p オプションはトポロジーマネージャーが開くポートの番号, -conf オプションには dot ファイルのパスを渡す. | |
26 | |
27 ポート番号は Alice により記述された並列分散プログラムの起動時に渡す必要がある. | |
28 dot ファイルには, トポロジーをどのように形成するかが書かれている. | |
29 以下に, サーバノード数5で, 2分木ツリー構造を形成する dot ファイルの例を示す(\ref{src:alice_dot}). | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
30 \newpage |
50 | 31 \begin{lstlisting}[frame=lrbt,label=src:alice_dot,caption=ネットワークトポロジー設定用 dot ファイル,numbers=left] |
32 % cat tree5.dot | |
33 digraph test { | |
34 node0 -> node1 [label="child1"] | |
35 node0 -> node2 [label="child2"] | |
36 node1 -> node0 [label="parent"] | |
37 node1 -> node3 [label="child1"] | |
38 node1 -> node4 [label="child2"] | |
39 node2 -> node0 [label="parent"] | |
40 node3 -> node1 [label="parent"] | |
41 node4 -> node1 [label="parent"] | |
42 } | |
43 \end{lstlisting} | |
44 | |
45 node0 や node1 はサーバノードの名前を示す. | |
46 サーバノードの間にはラベルがあり, Alice 上ではこのラベル | |
47 に指定される文字列(キー)を使うことで他のサーバノードのデータへアクセスすることができる. | |
48 node0 -> node1 はサーバノード同士の繋がりを示している. | |
49 次に続く label="child1" は, node0 が node1 のデータに"child1"という文字列を使うことでアクセス | |
50 できることを示す. | |
51 | |
52 dot ファイルを読み込んだ Alice のトポロジーマネージャーに対して, サーバノードは | |
53 誰に接続を行えばよいかを訪ねる. | |
54 トポロジーマネージャーは訪ねてきたサーバノードに対してノード番号を割り振り, dot ファイル | |
55 に記述している通りにサーバノード同士が接続を行うよう指示をだす. | |
56 | |
57 トポロジーマネージャーは接続要求先を聞いてくるサーバノードに対して名前を割り振り, 接続相手を伝える. | |
58 dot ファイル\ref{src:alice_dot}により形成されるトポロジーを図\ref{fig:tree_topology}に示す. | |
59 | |
60 | |
61 \begin{figure}[htpb] | |
62 \begin{center} | |
63 \includegraphics[scale=0.70]{figures/tree_topology.pdf} | |
64 \caption{Alice によるネットワークトポロジー形成} | |
65 \label{fig:tree_topology} | |
66 \end{center} | |
67 \end{figure} | |
68 | |
69 矢印に書かれている文字列は, 相手のデータにアクセスするキーを示す. | |
70 "child1", "child2", "parent" というキーを使うことで別のサーバノードにあるデータを取得することができる. | |
71 %子共となるノードは "parent" キーにより親の DSM (Remote DSM) にアクセスすることができる. | |
72 %また, 親も子供となるノードの DSM に対して "child1" や "child2" キーによりアクセスすることが可能となる. | |
73 これでトポロジーマネージャーが起動される. | |
24
5316b4791570
Added master_paper.pdf
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
4
diff
changeset
|
74 |
50 | 75 \subsection{アプリケーション側の記述} |
76 次は Jungle 側のプログラムが最初に Alice のトポロジーノードと通信を行うようにする. | |
77 そのためには Alice の TopologyNode クラスに必要な情報を渡してインスタンスを生成する(\ref{src:app_start}). | |
78 \begin{lstlisting}[frame=lrbt,label=src:app_start,caption=アプリケーションの起動,numbers=left] | |
79 public static void main( String[] args ) throws Exception | |
80 { | |
81 RemoteConfig conf = new RemoteConfig(args); | |
82 new TopologyNode(conf, new StartJungleCodeSegment(args, conf.bbsPort)); | |
83 } | |
84 \end{lstlisting} | |
85 TopologyNode クラスは第2引数として CodeSegment を受け取る. | |
86 TopologyNode のインスタンスはまず初めにトポロジーマネージャーへ接続を行う. | |
87 次にトポロジーマネージャーから受け取った情報を元に別のサーバノードとトポロジーの形成を行う. | |
88 その後, 第2引数で渡された StartJungleCodeSegment の実行を行う. | |
89 StartJungleCodeSegment には通常のアプリケーションの処理が書かれる. | |
90 | |
91 アプリケーションの起動時にはコンフィグの情報として, トポロジーマネージャーが動いているサーバのドメインとポート番号を | |
92 渡す必要がある. | |
93 例えば, mass00.cs.ie.u-ryukyu.ac.jp というサーバ上でポート番号10000を指定してトポロジーマネージャーを | |
94 起動した場合は次のようになる(\ref{src:run_program}). | |
95 \begin{lstlisting}[frame=lrbt,label=src:run_program,caption=トポロジーマネージャーの利用,numbers=left] | |
96 % java Program -host mass00.cs.ie.u-ryukyu.ac.jp -port 10000 | |
97 \end{lstlisting} | |
98 | |
99 \section{Alice を用いての分散実装} | |
100 Aliceのポロジー形成と他のサーバのデータへのアクセスする機構を用いるためには, Aliceが | |
101 提供するプログラミングスタイルに沿わなければならない. | |
102 それはDataSegment(データ)とCodeSegment(タスク)によるプログラムである. | |
103 ここではまずDataSegmentとCodeSegmentによるプログラムの方法について説明し, 他サーバとの | |
104 通信部分の実装について述べる. | |
24
5316b4791570
Added master_paper.pdf
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
4
diff
changeset
|
105 |
50 | 106 \subsection{Alice によるプログラミング} |
107 AliceはDataSegment(データ)とCodeSegment(タスク)単位でプログラミングを行うことを述べた. | |
108 CodeSegmentには計算に必要なDataSegmentが登録される. | |
109 そしてDataSegmentが準備され次第CodeSegmentによる計算が実行される. | |
110 DataSegmentの取得は文字列のキーを使うことで行える. | |
111 以下のコードにCodeSegmentの例を示す. | |
112 \begin{lstlisting}[frame=lrbt,label=src:syslog_nfconntrack,caption=CodeSegmentの実行,numbers=left] | |
113 public class TestCodeSegment extends CodeSegment { | |
114 public Receiver arg1 = ids.create(CommandType.TAKE); | |
115 | |
116 public TestCodeSegment() { } | |
117 | |
118 public void run() { | |
119 int count = ds.asInteger(); | |
120 count++; | |
121 System.out.println("count = "+count); | |
122 if(c > 10) { exit(0); } | |
123 CodeSegment cs = new TestCodeSegment(); | |
124 cs.setKey("count"); | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
125 ods.put("local", "count", c); |
50 | 126 } |
127 | |
128 public static void main(String[] args) { | |
129 CodeSegment cs = new TestCodeSegment(); | |
130 cs.arg1.setKey("local", "count"); // setKey API | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
131 cs.ods.put("local", "count", 0); |
50 | 132 } |
133 } | |
134 \end{lstlisting} | |
135 これは, 数字を1から10まで出力を行い終了するプログラムである. | |
136 コードの説明を行う. | |
137 17行目から19行目の処理が最初に行われる. | |
138 まずTestCodeSegmentというCodeSegmentのインスタンスcsを生成する. | |
139 csはarg1というReceiverクラスのフィールドを保持しており, Receiverクラスは | |
140 DataSegmentを受けとるためのクラスである. | |
141 arg1に対しsetKey APIを使うことで, 使用したいDataSegmentのキー"count"を登録することができる. | |
142 これによりキー"count"に対してデータが登録された場合, そのデータを受け取りcsの計算が自動で始まる. | |
143 setKey APIの第一引数に渡している"local"はどのマシンのDataSegmentにアクセスするのかを指定している. | |
144 この場合は自分自身を表す"local"になる. | |
145 | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
146 データの登録は\verb|ods.put|により行える. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
147 上記のコード19行目ではputにより"count"をキーとして数値の0を登録している. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
148 putがされるとcsの計算が始まり別スレッドにより8行目からの処理が行われる. |
50 | 149 |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
150 putによりキー"count"に登録された数値0はReceiverであるdsを使って取ることができる. |
50 | 151 7行目から13行目では\verb|ds.asInteger()|により, "count"に登録したデータの中身を受け取りインクリメントし出力する. |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
152 そして最後には\verb|ods.put|を行っている. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
153 新たなTestCodeSegmentも生成しており, これはインクリメントされた"count"がputされることで実行される. |
50 | 154 この一連の処理を"count"の数値が10以上になるまで行う. |
155 | |
156 DataSegmentへデータの追加とCodeSegmentの実行について表した図\ref{fig:testcodesegment}になる. | |
39
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
157 \begin{figure}[htpb] |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
158 \begin{center} |
50 | 159 \includegraphics[scale=0.70]{figures/testcodesegment.pdf} |
160 \caption{DataSegmentとCodeSegmentによるプログラムの例} | |
161 \label{fig:testcodesegment} | |
162 \end{center} | |
163 \end{figure} | |
164 | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
165 \newpage |
50 | 166 % Alice の他サーバノードへの"log"のputの問題 |
167 | |
168 \subsection{他サーバノードのDataSegmentへアクセス} | |
169 Aliceにおける基本的なプログラミングは述べた. | |
170 次はネットワークを介して他サーバノードのDataSegmentにアクセスするプログラムについて述べる. | |
171 | |
172 まず, Aliceにより2分木3ノードのトポロジーが形成された場合を想定する. | |
173 その時に実際に作られるトポロジーを図\ref{fig:remote_cs}に示す. | |
174 \begin{figure}[htpb] | |
175 \begin{center} | |
176 \includegraphics[scale=0.70]{figures/remote_codesegment.pdf} | |
177 \caption{トポロジーの形成} | |
178 \label{fig:remote_cs} | |
179 \end{center} | |
180 \end{figure} | |
181 | |
182 ネットワークを介したDataSegmentへのアクセスはそのサーバノードを示す | |
183 文字列のキーを追加することで行える. | |
184 他サーバノードを示す文字列のキーとは図\ref{fig:remote_cs}に矢印の隣に書かれている文字列 | |
185 "parent", "child1", "child2" のことを指す. | |
186 例えば, server node0 が server node1のDataSegmentに入っている"count"というデータを | |
187 を使用したい場合は, 次のようにsetKeyを行えばよい(\ref{src:remote_cs1}). | |
188 \begin{lstlisting}[frame=lrbt,label=src:remote_cs1,caption=CodeSegmentで他サーバノードのDataSegmentを使用する,numbers=left] | |
189 CodeSegment cs = new RemoteCodeSegment(); | |
190 cs.arg1.setKey("child1", "count"); | |
191 \end{lstlisting} | |
192 また, 他サーバノードのDataSegmentにデータを送りたい場合は, putを行うときにサーバノードへのキーを | |
193 追加すればよい. | |
194 例として, server node1やserver node2がserver node0のDataSegmentに"message"というキーでデータを追加したい場合 | |
195 次のようになる(\ref{src:remote_cs2}). | |
196 \begin{lstlisting}[frame=lrbt,label=src:remote_cs2,caption=他サーバーノードのDatasSegmentにデータを追加する,numbers=left] | |
197 ods.put("parent", "message", "Hello parent"); | |
198 \end{lstlisting} | |
199 | |
200 \subsection{独自クラスのインスタンスの送受信} | |
201 最後に, 独自クラスのインスタンスのDataSegmentでの扱い方について述べる. | |
202 AliceではMessagePackを用いてシリアライズを行い他サーバノードへと送信している. | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
203 MessagePackはインスタンス単位でシリアライズを行うことができる. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
204 そのため, Aliceでもプリミティブな型に限らずクラスのインスタンスをDataSegmentとして |
50 | 205 扱うことができる. |
206 | |
207 MessagePackによりシリアライズとなるクラスはいくつか制限がある. | |
208 それはそのクラスに@Messageアノテーションを付けることと, そのクラスが保持するフィールドが | |
209 MessagePackによりシリアライズ可能であることである. | |
210 例えば次のようなクラスである. | |
211 \begin{lstlisting}[frame=lrbt,label=src:msgpack1,caption=MessagePackによりシリアライズ可能なクラス1,numbers=left] | |
212 import org.msgpack.annotation.Message | |
213 | |
214 @Message | |
215 public class Student { | |
216 String name; | |
217 int age; | |
218 } | |
219 \end{lstlisting} | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
220 上記のStudentクラスはプリミティブ型しか保持していない. |
50 | 221 そのためシリアライズが可能である |
222 また, 次のようなクラスもシリアライズ可能な型となる. | |
223 \begin{lstlisting}[frame=lrbt,label=src:msgpack2,caption=MessagePackによりシリアライズ可能なクラス2,numbers=left] | |
224 import org.msgpack.annotation.Message | |
225 | |
226 @Message | |
227 public class Class { | |
228 List<Student> studentList; | |
229 } | |
230 \end{lstlisting} | |
231 この場合, フィールドはプリミティブな型でないStudentクラスのフィールドを保持している. | |
232 しかし, Studentクラスはシリアライズ可能な形で作成しているため, クラスのフィールドとして | |
233 保持しても問題はない. | |
234 | |
235 これらの制約にそった形で作成しDataSegmentにネットワークを介してクラスのインスタンス | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
236 をputすることができる. |
50 | 237 DataSegmentから受け取ったデータはそのままではシリアライズされたものため, 一度手元で |
238 元のクラスにコンバートすることで扱う. | |
239 例として, AliceにおけるStudenクラス(Listing\ref{src:msgpack1})のコンバートを次に示す. | |
240 \begin{lstlisting}[frame=lrbt,label=src:msgpack3,caption=DataSegment,numbers=left] | |
241 // public Receiver arg1 = ids.create(CommandType.PEEK); | |
242 Student s = arg1.asClass(Student.class); | |
243 \end{lstlisting} | |
244 MessagePackでシリアライズ可能な形としているためDataSegmentはネットワークを介して | |
245 送受信が可能である. | |
246 | |
247 | |
248 \section{ログのシリアライズ} | |
249 Jungleの具体的な分散実装について述べる. | |
250 実装にあたり, 解決しなければならない問題はまず, ログをDataSegmentで扱える形にすることである. | |
251 そのためには, @Messageアノテーションを付けたログのクラスの作成を行わなければならない. | |
252 | |
253 | |
254 \subsection{TreeOperationLogのシリアライズ} | |
255 TreeOperationLogをシリアライズ可能な形にするにあたって気をつけなければならないのが, フィールドを | |
256 シリアライズ可能にする部分である. | |
257 TreeOperationLogはTreeOperationをいくつも保持し, TreeOperationはNodePathとNodeOperationを保持するものであった. | |
258 そのため, これら全てシリアライズ可能な形にしなければならない. | |
259 | |
260 基本的にこれらの実装は, フィールドを全てプリミティブなものだけにすればよい. | |
261 MessagePackはListを扱うこともできるため, TreeOperationLogで継承されていたIterableの挙動もListを使うことで | |
262 実装を行うことができた. | |
263 | |
264 \subsection{ログに対する情報の追加} | |
265 TreeOperationLogをシリアライズ可能な形にした後, 問題が発生した. | |
266 それは, TreeOperationLog事態は木の名前を保持していないというものである. | |
267 そのため, TreeOperationLogだけを受け取っても, そのログがどの木に対して行われるのか | |
268 わからなかった. | |
269 そこで, TreeOperationLogの情報だけでなく, 木の名前とUUID, それとtimestampの情報も付与 | |
270 してシリアライズが可能なNetworkTreeOperationLogの実装を行った. | |
271 | |
272 % TreeOperationLog に木の名前の情報がない | |
273 % そのため木の名前を追加して持たせた | |
274 % 木がなければそのばでつくるようにした | |
275 | |
62
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
276 \subsection{NetworkTreeOperationLogの実装} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
277 NetworkTreeOperationLogの実装の一部を以下(\ref{fig:netlog})に示す. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
278 \begin{lstlisting}[frame=lrbt,label=src:netlog,caption=NetworkTreeOperationが持つフィールド,numbers=left] |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
279 @Message |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
280 public class NetworkTreeOperationLog implements TreeOperationLog |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
281 { |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
282 public LinkedList<NetworkTreeOperation> list; |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
283 String treeName; |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
284 long timestamp; |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
285 \end{lstlisting} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
286 Listにより保持しているNetworkTreeOperationはTreeOperationをシリアライズ可能な形にしたものである. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
287 TreeOperationLogをimplementsし, 木の名前とtimestampをを保持する. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
288 他サーバノードへ伝える必要のある情報が増えた場合, このようにNetworkTreeOperationLogに情報を付与することで |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
289 対応することができる. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
290 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
291 \subsection{ログの送信} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
292 ログを送信するタイミングはいつ行うか. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
293 それは, 木の編集が成功した時である. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
294 木の編集が成功した結果得られるTreeOperationLogをNetworkTreeOperationLogに変換し, \verb|ods.put|を使って |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
295 CodeSegment側から利用できるようにする. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
296 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
297 しかし, この時気をつけなければならないことがある. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
298 それは, \verb|ods.put|の処理をレスポンスを返すスレッドの中で行うと, レスポンスが悪くなる可能性が |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
299 あることだ. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
300 そのため, \verb|ods.put|を行うのは別のThreadにしたほうがよい. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
301 以下のコードはcommitに成功した後に, NetworkTreeOperationへと変換したログを別スレッド渡し |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
302 て処理させるコードである. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
303 \begin{lstlisting}[frame=lrbt,label=src:logconvert_and_execute,caption=NetworkTreeOperationをputするために別スレッドを立ち上げる,numbers=left] |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
304 NetworkTreeOperationLog netLog = new NetworkTreeOperationLog(_uuid, _treeName,newLog); |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
305 CodeSegment cs = new LogPutCodeSegment(netLog); |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
306 cs.execute(); |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
307 \end{lstlisting} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
308 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
309 LogPutCodeSegmentの実装は次のようになっている. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
310 \begin{lstlisting}[frame=lrbt,label=src:,caption=putを行うためだけのCodeSegmentの用意,numbers=left] |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
311 // LogPutCodeSegment Class |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
312 NetworkTreeOperationLog log; |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
313 public LogPutCodeSegment(NetworkTreeOperationLog _log) { |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
314 log = _log; |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
315 } |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
316 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
317 @Override |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
318 public void run() { |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
319 ods.put("log", log); |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
320 } |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
321 \end{lstlisting} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
322 上で述べた問題は, 通常のアプリケーションとして使用する分には発生しない. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
323 だが, ベンチマークテストなど, 大量の負荷をかけた際に発生する. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
324 ベンチマークテストでは大量のログが生成される. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
325 そのため, \verb|ods.put|によりDataSegmentの"log"にアクセスが集中してしまい, レスポンスが |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
326 悪くなっていた. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
327 \verb|ods.put|を行うタイミングには気をつけなければず, 上記のコードにしても改良の余地はある. |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
328 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
329 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
330 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
331 \begin{lstlisting}[frame=lrbt,label=src:,caption=,numbers=left] |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
332 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
333 \end{lstlisting} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
334 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
335 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
336 \begin{lstlisting}[frame=lrbt,label=src:,caption=,numbers=left] |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
337 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
338 \end{lstlisting} |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
339 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
340 |
2cb5ac9282b0
writed description of ods.put
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
61
diff
changeset
|
341 |
50 | 342 \subsection{local専用の編集の用意} |
343 | |
344 | |
345 | |
346 | |
347 \section{掲示板プログラムにおけるマージの実装} | |
348 Jungle に分散実装を行った後の問題としてデータ衝突がある. | |
349 他のサーバノードから送られてくるデータが既に手元で変更を加えた木構造を対象とした | |
350 場合に発生する問題である. | |
351 Jungle ではこれをアプリケーション毎にマージを実装することで解決させる. | |
352 | |
353 今回分散実装を行い, 例題として掲示板プログラムを用意した. | |
354 掲示板プログラムに実装を行ったマージについて述べる. | |
355 まず Jungle を用いた掲示板プログラムのデータ保持方法を図\ref{fig:merge2}に示す. | |
356 \begin{figure}[htpb] | |
357 \begin{center} | |
358 \includegraphics[scale=0.70]{figures/merge2.pdf} | |
359 \caption{Jungle による掲示板プログラムのデータ保持方法} | |
360 \label{fig:merge2} | |
361 \end{center} | |
362 \end{figure} | |
363 | |
364 掲示板プログラムでは各掲示板毎に1つの木構造が作成される. | |
365 掲示板への1つの書き込みは子ノードを1つ追加することに相当する. | |
366 また, 各子ノードは attributes として書き込みの内容である message と書き込まれた時間を表す timestamp を保持している. | |
367 先に追加された順で子ノードには若い番号が割り振られる. | |
368 | |
369 他サーバノードからの書き込みをそのまま子ノードの後ろに追加してしまうと, データの整合性が崩れてしまう. | |
370 この時の状態を表しているのが図\ref{fig:merge_imp1}と\ref{fig:merge_imp2}になる. | |
371 \begin{figure}[htpb] | |
372 \begin{center} | |
373 \includegraphics[scale=0.70]{figures/merge_imp1.pdf} | |
374 \caption{他サーバノードの編集データ反映による整合性の崩れ1} | |
375 \label{fig:merge_imp1} | |
39
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
376 \end{center} |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
377 \end{figure} |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
378 |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
379 \begin{figure}[htpb] |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
380 \begin{center} |
50 | 381 \includegraphics[scale=0.70]{figures/merge_imp2.pdf} |
382 \caption{他サーバノードの編集データ反映による整合性の崩れ2} | |
383 \label{fig:merge_imp2} | |
39
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
384 \end{center} |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
385 \end{figure} |
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
386 |
50 | 387 \newpage |
39
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
388 |
50 | 389 図\ref{fig:merge_imp2}の server node0 の木の状態にするのが理想である. |
390 掲示板のへの書き込みの表示は, 書き込みされた時間が早い順に表示されるようにしたい. | |
391 これを timestamp を利用することで行う. | |
392 他サーバノードから来たデータに関しては, timestamp を参照し, 次に自分の保持している | |
393 木の子ノードの timestamp と比べていくことでデータの追加する場所を決める. | |
394 これが今回実装を行った掲示板システムにおけるマージになる. | |
39
63eca978482f
Writed description of experiment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
30
diff
changeset
|
395 |
50 | 396 %単一サーバで動いている時の Jungle はただ子ノードとして後ろに追加するだけだが, 分散 |
397 %環境下においては timestamp に従い子ノードを追加する位置を決めるようにする. | |
41
a59ede6b5a5a
Writed chapter4
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
40
diff
changeset
|
398 |
a59ede6b5a5a
Writed chapter4
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
40
diff
changeset
|
399 |
a59ede6b5a5a
Writed chapter4
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
40
diff
changeset
|
400 |
44
618adf0a9b2b
Added some figures
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
42
diff
changeset
|
401 |