Mercurial > hg > Papers > 2016 > nozomi-sigos
view paper/sigos.tex @ 24:f07b74bc7485
first commit
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 08 May 2016 18:07:17 +0900 (2016-05-08) |
parents | 818786ab5a5a |
children | 6c936f5c7f9b |
line wrap: on
line source
\documentclass[techrep, ,dvipdfmx]{ipsjpapers} \usepackage[dvipdfmx]{graphicx} \usepackage[dvipdfmx]{color} \usepackage{url} \usepackage{listings} \lstset{% language={C++},%使用言語 basicstyle={\small},%書体 commentstyle={\small\itshape},%コメントの書体 keywordstyle={\small\bfseries},%キーワードの書体 %identifierstyle={\small},% %ndkeywordstyle={\small},% stringstyle={\small},%文字列の書体 frame={trlb},%外枠 breaklines=true,%改行 columns=[l]{fullflexible},% xrightmargin=0zw,% xleftmargin=3zw,% %numbers=none,%行番号の表示 %numberstyle={\scriptsize},%行番号の書体 %numbersep=1zw,% %stepnumber=1, lineskip=-0.5ex,% captionpos=b,%キャプションの位置 moredelim=**[s][\color{red}]{\"compressed}{\"}, } \renewcommand{\lstlistingname}{Code} \input{dummy.tex} %% Font % ユーザが定義したマクロなど. \makeatletter \begin{document} % 和文表題 \title{分散システム向けのTopology Managerの改良} % 英文表題 \etitle{Improvement of Topology Manager for distributed system} % 所属ラベルの定義 \affilabel{1}{琉球大学工学部情報工学科\\Information Engineering, University of the Ryukyus.} \affilabel{3}{琉球大学工学部情報工学科\\Information Engineering, University of the Ryukyus.} % 和文著者名 \author{ 照屋 のぞみ\affiref{1}\and 河野 真治\affiref{3} } % 英文著者名 \eauthor{ Nozomi TERUYA\affiref{1}\and Shinji KONO\affiref{3} } % 連絡先(投稿時に必要.製版用では無視される.) \contact{照屋 のぞみ\\ 〒903-0213 沖縄県西原町千原1番地\\ 琉球大学工学部情報工学科\\ TEL: (098)895-2221\qquad FAX: (098)895-8727\\ email: kokubo@cr.ie.u-ryukyu.ac.jp} % 和文概要 \begin{abstract} Aliceでは、スケーラブルな分散プログラムを信頼性高く記述できる環境を実現するために、ComputationとMetaComputationによる階層化を採用している。 分散環境の構築等の複雑な処理をAliceがMeta Computationとして提供することで、仕様変更を抑え、変更前の信頼性を保ったまま拡張可能にする。 本研究では、分散トポロジー管理のMeta ComputationであるTopology ManagerにNAT越えを実現するための設計を行う。 そしてその設計がAliceアプリケーション同士の接続も可能にすることを示す。 \end{abstract} % 英文概要 仮 \begin{eabstract} \end{eabstract} % 表題などの出力 \maketitle % 本文はここから始まる \section{研究背景と目的} 当研究室ではデータをData Segment、タスクをCode Segmentという単位で記述する分散フレームワークAlice\cite{senkokenkyu}の開発を行っている。 Aliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 ここで言う信頼性とは、定められた環境下で安定して仕様に従った動作を行うことを指す。 Aliceでは、処理をComputationとMeta Computationに階層化し、コアな仕様と複雑な例外処理に分離する。 そして分散環境の構築に必要な処理をMeta Computationとして提供する。 プログラマはコアな仕様の変更を抑えつつプログラムの挙動変更ができるため、信頼性の高い分散アプリケーションの記述が可能となる。 Meta ComputationのひとつであるTopologyManagerは、アプリケーション外部からトポロジーの構成・管理をサポートする。 本研究では、分散アプリケーションにおける課題であるNAT越えの機能をTopologyManagerで実現するための設計を行う。 同時にAliceVNCやAliceChatといったAlice上でのアプリケーションを連携するための設計を行うことで、 相互干渉なく容易にアプリケーションの接続・拡張ができる環境の提供を目指す。 \section{分散フレームワーク Alice の概要} \subsection*{[Data SegmentとCode Segment]} AliceではCode Segment(以下CS)とData Segment(以下DS)の依存関係を記述することでプログラミングを行う。 CSは実行に必要なDSが全て揃うと実行される。CSを実行するために必要な入力されるDSのことをInputDS、CSが計算を行った後に出力されるDSのことをOutput DSと呼ぶ。 データの依存関係にないCSは並列実行が可能である(図 \ref{fig:CS} )。 CSの実行においてDSが他のCSから変更を受けることはない。そのためAliceではデータが他から変更され整合性がとれなくなることはない。 \begin{figure}[htbp] \begin{center} \includegraphics[width=60mm]{images/dsandcs2.pdf} \end{center} \caption{CodeSegmentの依存関係 } \label{fig:CS} \end{figure} AliceはJavaで実装されており、DSはJava Objectに相当する。プログラマがCSを記述する際は、CodeSegmentクラスを継承する。 \subsection*{[Data Segment Manager]} DSは数値や文字列などの基本的なデータの集まりを指し、Aliceが内部にもつデータベースによって管理されている。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。 CSは複数のDSMを持っている。DS Managerには対になるString型のkeyが存在し、それぞれのManagerにkeyを指定してDSにアクセスする。 DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:Remote DSM} )。 他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 \begin{figure}[h] \begin{center} \includegraphics[width=60mm]{images/remote_datasegment.pdf} \end{center} \caption{Remote DSMは他のノードのLocal DSMのproxy } \label{fig:Remote DSM} \end{figure} \subsection*{[ComputationとMeta Computation]} Aliceでは、計算の本質的な処理をComputation、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。 AliceのComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理と捉えられる。 それに対して、AliceのMeta Computation は、Remoteノードとの通信時のトポロジーの構成やデータの表現形式の選択の処理と言える。 つまりこれらの処理はAliceのComputationを支えているComputationとみなすことができる。 Aliceの機能を追加するということはプログラマ側が記述するComputationを支えるためのMeta Computationを追加することと言い換えられる。 AliceではMeta Computationとして分散環境の構築等の機能を提供するため、プログラマはCSを記述する際にトポロジー構成や切断、再接続という状況を予め想定した処理にする必要はない。 プログラマは目的の処理だけ記述し、切断や再接続が起こった場合の処理をMeta Computationとして指定する。 このようにプログラムすることで、通常処理と例外処理を分離することができるため、仕様の変更を抑えたシンプルなプログラムを記述できる。 \subsection*{[Topology Manager]} Aliceでは、ノード間の接続管理やトポロジーの構成管理を、Topology ManagerというMeta Computationが提供している。 このTopology ManagerもCS/DSを用いて実装されている。 プログラマはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。 トポロジーファイルはDOT Language\cite{dot}という言語で記述される。 DOT Languageとは、プレーンテキストを用いてデータ構造としてのグラフを表現するためのデータ記述言語の一つである。 ソースコード\ref{src:topologyfile}は3台のノードでリングトポロジーを組むときのトポロジーファイルの例である。 \begin{table}[html] \lstinputlisting[label=src:topologyfile, caption=トポロジーファイルの例]{source/TopologyFile.dot} \end{table} また、DOT Languageファイルはdotコマンドを用いてグラフの画像ファイルを生成することができる。そのため、記述したトポロジーが正しいか可視化することが可能である。 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきクライアントのIPアドレスやポート番号、接続名を送る(図\ref{fig:topologymanager})。 \begin{figure}[h] \begin{center} \includegraphics[width=40mm]{images/topologymanager.pdf} \end{center} \caption{Topology Managerが記述に従いトポロジーを構成} \label{fig:topologymanager} \end{figure} トポロジーファイルでlavelとして指定した名前はRemote DSMの名前としてTopology Nodeに渡される。 そのため、Topology NodeはTopology ManagerのIPアドレスさえ知っていれば自分の接続すべきノードのデータを受け取り、ノード間での正しい接続を実現できる。 また、実際の分散アプリケーションでは参加するノードの数が予め決まっているとは限らない。 そのためTopology Managerは動的トポロジーにも対応している。 トポロジーの種類を選択してTopology Managerを立ち上げれば、あとは新しいTopology Nodeが参加表明するたびに、 Topology ManagerからTopology Nodeに対して接続すべきTopology Nodeの情報が渡され接続処理が順次行われる。 そしてTopology Managerが持つトポロジー情報が更新される。 現在Topology Managerでは動的なトポロジータイプとしてBinary Tree とStarに対応している。 さらに、Topology Managerではトポロジーの管理だけでなく、ノードとの接続状態を常に確認するMeta Computation(Keep Alive)や、 切断・再接続時の処理を指定できるMeta Computationが用いられている。 そのため、構成したノード間の接続が途切れても再構成することができる。 \section{TreeVNCのNAT越え} TreeVNCとは、当研究室で開発を行っている授業向け画面共有システムである\cite{TreeVNC}。 オープンソースのVNCであるTightVNC \cite{tightVNC} をもとに作られている。 授業でVNCを使う場合、1つのコンピュータに多人数が同時につながるため、性能が大幅に落ちてしまう。 この問題をノード同士を接続させ、木構造を構成することで負荷分散を行い解決したものがTreeVNCである(図 \ref{fig:TreeVNC})。 \begin{figure}[h] \begin{center} \includegraphics[width=50mm]{images/treestructure.pdf} \end{center} \caption{TreeVNC の構造} \label{fig:TreeVNC} \end{figure} TreeVNCは授業向けのシステムであるため、プライベートネットワーク内のみでの使用を前提に作られている。 しかし学外から授業に参加したい場合、教室にカメラを設置するだけではスクリーンに写した教員のPC画面までは見ることは困難であるため、 学外のノードからでも画面配信のTreeに入りたい要求が生まれた。 つまり、NATを越えた通信に対応する必要がある。 そのために、TreeVNCでは画面配信側ネットワークがグローバルIPアドレスを持っていることを前提とし、 別ネットワーク上のノードが画面配信側ルートノードのIPアドレスを指定して直下の子になるDirect Connectionを実装した(図 \ref{fig:DirectConnection})。 \begin{figure}[h] \begin{center} \includegraphics[width=70mm]{images/directConnection.pdf} \end{center} \caption{TreeVNC のDirect Connection} \label{fig:DirectConnection} \end{figure} しかし、この方法だと複数の別ネットワークからの接続があった場合、ルートノードに大量に子が接続されてしまうためルートノードに接続台数分の負荷がかかってしまう。 また、別ネットワーク側のノードが途中で画面を配信したい場合(Server Change Request)がある。 TreeVNCではソケットの反転が考案されたが、ソースコードが膨大で拡張した場合どこに影響するかわからないほど複雜であったため、実装までに至らなかった。 さらに、どちらのノードもプライベートネットワークであった場合、TreeVNCではNAT越えのための中間サーバをプログラマが作らなければならない。 このように、NATは分散アプリケーション構築における課題の1つでもあるが、その実装は容易ではない。 AliceのTopology ManagerにもNAT越えをサポートする機能が必要であると考えた。 \section{AliceVNCとAliceChatの接続} Aliceが実用的なアプリケーションを実装するのに充分な性能があるかをテストする例題として、Alice上にTreeVNCとStarトポロジーのChatが実装された。 それぞれをAliceVNC、AliceChatと呼ぶ。 これらは全く別のアプリケーションであるが、お互いに接続させたい要求がでてきた。 例えば、AliceChat上にAliceVNCの画面のスナップショットを載せたい場合や、AliceVNC上にAliceChatの内容をコメントとして画面に流したい場合である。 このように別トポロジーのアプリケーション間で相互干渉なく接続するための機能が必要であると考えた。 \section{Topology Managerの拡張設計} \subsection*{[別トポロジー間での接続]} AliceVNCとAliceChatのように同一ネットワーク内での別アプリケーションの接続を実現する仕組みが図 \ref{fig:private} である。 \begin{figure}[h] \begin{center} \includegraphics[width=70mm]{images/privateconnect.pdf} \end{center} \caption{プライベートネットワーク内での接続} \label{fig:private} \end{figure} \begin{enumerate} \item {\ttfamily 接続を要求する側のいずれかのNodeが接続先Topology Manager(A)のIPアドレスを自身を管理するTopology Manager(B)のDSMに保存} \item {\ttfamily Topology Manager(B)はRootNode(B)にTopology Manager(A)への接続をするよう要求} \item {\ttfamily RootNode(B)がTopology Manager(A)と接続し、自身の接続先ノードの情報を取得} \item {\ttfamily 取得した情報をもとにRootNode(A)に接続} \end{enumerate} これでAliceChat側にAliceVNCのスナップショット情報を送ることができる。 また、(1)の手順を踏むことでAliceChatのトポロジーの再構成時にAliceVNCへ再接続も自動で行うことができる。 TopologyManagerはNode間の接続が切れるとトポロジーを再構成するため、RootNode(B)が落ちると、それを検知したTopology Manager(B)が他のノードをRootNodeとして配置し接続をやり直す。 どのノードが落ちてもTopology Manager(B)が接続先Topology Manager(A)の情報を保持したままなので、再び(2)以降の手順でAliceVNCの接続が行われる。 今までのAliceでは、ノードに対してTopology Managerは1つと決められていた。 Topology Managerと各ノードのやり取りをするのは、ノードごとに実行されるTopology NodeというMeta Computationである。 Topology Managerは接続されたnodeの情報(nodeNameとIPアドレスのHashMap)を"nodeTable"というKeyに対応するDSとして保存している。 そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。 つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 そこで、Meta Computationとして、通常のLocal DSMとは別にTopology ManagerごとのLocal DSMを立ち上げる方法が考えられる(図 \ref{fig:hostname})。 それぞれのTopology Managerに対応するDSMを作り、そこにそれぞれのnodeNameを格納することで、 DSMを切り替えるだけでTopologyNodeの仕様は変えずに複数のTopology Managerに対応できる。 \begin{figure}[h] \begin{center} \includegraphics[width=60mm]{images/somehostname.pdf} \end{center} \caption{Topology Nodeは複数のnodeNameを持つ} \label{fig:hostname} \end{figure} しかし、現在のAliceのコードではDSMを管理するclassがstatic classであったため、複数のLocal DSMを持つことができない。 staticを取り除くためにはAliceの大部分のコードを修正する必要がある。 そのため、現状ではKeyである"hostname"のあとにTopology Managerごとの番号を付け加えることで、KeyによってTopology Managerごとの対応を分けている。 Aliceの再設計を行う際にはstatic classのない実装を行い、DSM切り替えによる方式を実現したい。 \subsection*{[別ネットワーク間での接続]} TreeVNCでお互いにプライベートネットワークのノードの接続をするには、NAT越えのための中継プログラムをプログラマが書かなければならなかった。 しかし、Aliceではトポロジー管理をアプリケーションから分離しているため、グローバルIPアドレスを持ったTopology Manager(以下、Global Topology Manager)を立てるだけで良い。 プライベートネットワークのTopology Manager(以下、Private Topology Manager)はプライベートネットワーク内で木を構成し、 Global Topology Managerは各ネットワークのroot nodeで木を構成する。つまり、3次元的な木構造が構成される。 つまり複数のTopology Managerを立ち上げるだけで、Topology Manager自体の「参加表明のあったノードを木構造」に接続するという仕様は変更しなくとも良い。 NAT越えのため以下の機能をTopology ManagerのMeta Computation、つまりMeta Meta Computationとして取り入れる。 \begin{figure}[h] \begin{center} \includegraphics[width=70mm]{images/globalconnect.pdf} \end{center} \caption{NATを越えた接続} \label{fig:global} \end{figure} \begin{enumerate} \setcounter{enumi}{-1} \item {\ttfamily 接続を受け入れる側(Network1)のルートノードがグローバルIPアドレスを持ったGlobal Topology Managerを立ちあげておく} \item {\ttfamily 接続を要求する側(Network2)のいずれかのNodeがGlobal Topology ManagerのIPアドレスを自身を管理するTopology ManagerのDSMに保存} \item {\ttfamily Topology ManagerはRootNodeにGlobal Topology Managerへの接続をするよう要求} \item {\ttfamily RootNodeがGrobal Topology Managerと接続し、自身のIPアドレスを送る。Global Topology Managerが受け取ったIPアドレスがプライベートアドレスであれば、ノードに対してNATの外側IPアドレス/ポート番号を要求されるので、RootNodeはそれに返答。} \item {\ttfamily UDP hole punchingが行われ、Network1のroot nodeとNetwork2のroot nodeが接続される} \item {\ttfamily もし接続が確立されなければ、Global Topology Managerがデータ中継用のCSを用意しデータを中継する} \end{enumerate} Meta Meta ComputationがNAT越えをサポートするため、Topology ManagerもTopology Nodeも接続要求のあったノードがグローバルかプライベートかを気にせず扱える。 \section{まとめ} \nocite{*} %\nocite{opencl} %\nocite{opencl:ref} %\nocite{opencl:applied} %\nocite{yutaka:os} \bibliographystyle{ipsjunsrt} \bibliography{sigos} %\bibliography{cerium,book} \end{document}