annotate paper/chapter2.tex @ 10:a349b2c01cfe

add graffle
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Tue, 28 Jan 2014 06:40:52 +0900
parents 70bda541eb1d
children ff03e6179f19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
a349b2c01cfe add graffle
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
1 \chapter{Haskellによる並列データベースの設計}\label{ch:design}
2
d8b94e828d79 add tex files
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
9
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
3 \section{スケーラビリティのあるデータベース}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
4 本研究の目標はマルチスレッド環境でのスケーラビリティのあるデータベースの開発である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
5 データベースは、ウェブサービスでの利用を前提とする。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
6 Twitter や Facebook などのタイムラインは多少遅延しても問題のないサービスである。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
7 これはデータの整合性を犠牲にできることを意味し、結果的に整合性が保たれればよいという考え方であり結果整合性と呼ばれる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
8 本研究で開発するデータベースは結果整合性の特性を持つ。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
9
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
10 開発するデータベースはデータに並列にアクセスできる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
11 マルチスレッド間でデータを共有する方法はいくつかある。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
12 最も一般的なのは、共有変数に対して排他制御を行う方法である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
13 データにアクセスしてよいスレッドを1つに制限することで、そのデータが常に正しいことが保証される。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
14 しかしながら、1つのスレッドしかアクセスできないため、大量にデータにアクセスする場合ボトルネックとなってしまい並列度がでない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
15 本研究では非破壊的木構造を採用する。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
16 非破壊的木構造は、最新の木構造はどれかという情報を取り扱う部分にのみ排他制御が必要で、並列に編集可能なデータ構造として扱うことができる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
17 そのためマルチスレッド環境でのスケーラビリティのあるデータベースと相性がよい。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
18 また、ウェブサービスのデータ構造は木構造で表現することができる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
19
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
20 \section{非破壊的木構造}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
21 非破壊的木構造は、木構造を書き換えることなく編集を行う手法である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
22 排他制御を行わず、並列に読み書きを行うことが可能である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
23 元の木構造は破壊されることがないため、自由にコピーを行うことができる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
24 コピーを複数作成することでアクセスを分散させることも可能である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
25
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
26 通常の破壊的木構造との違いを説明する。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
27
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
28 \subsection{破壊的木構造}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
29 破壊的木構造は、木構造を編集する際に木構造を書き換えることにより編集を実現する。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
30 図\ref{fig:destructive_tree_modification}では、ノード6をノード A に書き換える処理を行っている。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
31
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
32
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
33 \begin{figure}[!htbp]
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
34 \begin{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
35 \includegraphics[width=100mm]{./images/destructive_tree_modification.pdf}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
36 \end{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
37 \caption{木構造の破壊的編集}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
38 \label{fig:destructive_tree_modification}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
39 \end{figure}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
40
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
41 破壊的に編集する方法では、並列環境において問題が発生する。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
42 閲覧者が木構造を参照している間に編集者が木構造を書き換えると、閲覧者が参照を開始した時点での木構造ではなくなり整合性が崩れてしまう。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
43 整合性が崩れた状態では、正しい状態のコンテンツを参照することは出来ない(図\ref{fig:destructive_tree_modification_in_lace})
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
44
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
45 \begin{figure}[!htbp]
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
46 \begin{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
47 \includegraphics[width=120mm]{./images/destructive_tree_modification_in_lace.pdf}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
48 \end{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
49 \caption{競合状態に陥る木構造の破壊的編集}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
50 \label{fig:destructive_tree_modification_in_lace}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
51 \end{figure}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
52
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
53 この状態を回避するためには、木構造にアクセスする際に排他制御を行う。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
54 その場合、木構造に1つのスレッドしかアクセスできないため並列度が下がりスケーラビリティを損なってしまう。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
55 破壊的木構造では、スケーラビリティのあるデータベースの開発はできない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
56
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
57 \subsection{非破壊的木構造}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
58 非破壊的木構造は、木構造を書き換えることなく編集を行うため、読み書きを並列に行うことが可能である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
59 図\ref{fig:nondestructive_tree_modification}では、ノード 6 をノード A へ書き換える処理を行なっている。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
60
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
61 \begin{figure}[!htbp]
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
62 \begin{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
63 \includegraphics[width=120mm]{./images/nondestructive_tree_modification.pdf}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
64 \end{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
65 \caption{木構造の非破壊的編集}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
66 \label{fig:nondestructive_tree_modification}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
67 \end{figure}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
68
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
69 非破壊的木構造の基本的な戦略は、変更したいノードへのルートノードからのパスを全てコピーする。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
70 そして、パス上に存在しない (編集に関係のない) ノードはコピー元の木構造と共有することである。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
71
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
72 編集は以下の手順で行われる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
73
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
74 \begin{enumerate}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
75 \item{変更したいノードまでのパスを求める。}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
76 \item{変更したいノードをコピーし、コピーしたノードの内容を変更する。}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
77 \item{求めたパス上に存在するノードをルートノードに向かって、コピーする。 コピーしたノードに一つ前にコピーしたノードを子供として追加する。}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
78 \item{影響のないノードをコピー元の木構造と共有する。}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
79 \end{enumerate}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
80
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
81 この編集方法を用いた場合、閲覧者が木構造を参照してる間に、木の変更を行っても問題がない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
82 閲覧者は木が変更されたとしても、保持しているルートノードから整合性を崩さずに参照が可能である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
83 ロックをせずに並列に読み書きが可能であるため、スケーラブルなシステムに有用であると考えられる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
84 元の木構造は破壊されることがないため、自由にコピーを作成しても構わない。したがってアクセスの負荷の分散も可能である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
85
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
86 \begin{figure}[!htbp]
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
87 \begin{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
88 \includegraphics[width=140mm]{./images/nondestructive_tree_modification_in_lace.pdf}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
89 \end{center}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
90 \caption{並列に読み書きが可能な非破壊的木構造}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
91 \label{fig:nondestructive_tree_modification_in_lace}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
92 \end{figure}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
93
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
94
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
95 \newpage
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
96 \section{Haskellの並列処理}
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
97 純粋関数型言語 Haskell は並列処理に向いていると言われる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
98 しかしながら、安直にそう言い切ることはできない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
99 参照透過性があるため、各々の関数の処理は独立している。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
100 そのため、並列で走らせても問題ないように思われるが、Haskell は遅延評価を行うため問題が発生する。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
101 遅延評価では、結果が必要になるまで評価せず、同じ呼び出しがあった場合メモ化を行うことで最適化を行う。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
102 並列で実行する際は、遅延評価を行っていては並列度を高めることができない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
103 また、メモ化は結果をキャッシュするため各スレッド間で同期するコストが発生する。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
104 Haskell においても並列化によるコストが実際の処理とは別に発生するため、並列化箇所をよく見極める必要がある。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
105
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
106 Haskellでは、様々な並列化手法が提供されている。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
107 もちろんスレッドを直接操作することも可能である。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
108 本研究では、抽象度の高い Eval モナドを利用した。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
109 Eval モナドを利用することで、並列処理のために必要な処理の流れを分かりやすく記述することができる。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
110 しかしながら実行順序を細かく制御することはできない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
111 Par モナドを利用すれば、並列処理の流れを細かく記述できるが、
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
112 Eval モナドのように処理と並列処理の流れを分けて記述し、後からプログラムに並列処理を組み込むというようなことはできない。
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
113
70bda541eb1d add pdf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
114 Haskellで並列処理を実装する場合は、どの並列化手法を採用するかということをよく考察する必要がある。