view paper/chapter3.tex @ 8:bc41d38f98d0

update pdf file
author taiki
date Fri, 06 Feb 2015 11:07:58 +0900
parents 9c08c451a8fc
children 741bd4ff00c0
line wrap: on
line source

\chapter{Shien システムの構成}

本章では Shien システムの構成について述べる。

Shien システムは、複数のアカウントの計算機資源の使用を管理できるよう補助するシステムである。アカウント所有者が開発したアプリケーションのデプロイや、コンテナ・VM を使った実験を行える環境を提供する。

\section{Fedora}

Shien システムは情報工学科の次期システムに合わせて設計する。そのためには最新のソフトウエアを取り入れ、次期システムが稼働する際に安定になっているものを検証する必要がある。

Fedora は最新の技術を積極的に取り込んでおり、その成果を Ret Hat Enterprise Linux に取り込まれるといった検証目的の位置づけになっている。

最新の Fedora を使用することによって、教育用 OS 管理システムで使われる OS やソフトウエアを予測し、また検証することが可能である。そのため今回のシステムでは Fedora を利用し、次期システムが稼働する際の環境を構築し、検証を行った。

\section{Global File System 2 (GFS2)}

iSCSI に対応しており、複数のノードからのアクセスに対して整合性のある読み書きをするファイルシステムとして、GFS2 を選択する。

GFS2 は、Linux カーネルファイルシステムインターフェィスに直接的に対応するカーネルファイルシステムである。単独システム内、またはクラスタ設定の一部として使用することができる。GFS2 では、すべてのノードから同じ共有ストレージへアクセスできる。クラスタファイルシステムの一部として使用された場合、GFS2 は分散型メタデータと複数ジャーナルを運用する。

GFS2 でフォーマットされたディスクへアクセスするノードはクラスタ構成になっていなければならない。

\section{Distributed Lock Manager (DLM)} 

GFS2 を使用する Red Hat のクラスタでは、ロック機構として DLM が使用される。DLM は GFS2 ファイルシステムへのアクセスなどの、クラスタ内のリソースへのアクセスを制御する。DLM がない場合、共有ストレージへのアクセス制御がなくなり、クラスタ内のノードが相互のデータを破損させる可能性がある。

DLM は各クラスタノードで実行され、またロック管理はクラスタ内のすべてのノードを対象として行われる。

DLM をクラスタで動作させるには、以下のように設定する必要がある。

\begin{itemize}
    \item ノードをクラスタの一部として設定する
    \item すべてのノードがクラスタのメンバーであり、Quorum を所持している
    \item ノード同士が IP アドレスで通信できる必要がある。
\end{itemize}
 
\section{The corosync Cluster Engine (corosync)} 

クラスタを構成するためには、クラスタの基盤が必要である。corosync は、高可用性を実現するクラスタ基盤ソフトウエアである。

Extended virtual syncrony と呼ばれる形式で、マルチキャストやブロードキャストを使ったノード間のメッセージング機能を提供する。また、クラスタ全体でプロセスグループを管理するための管理機能や、基礎的なアプリケーションの監視などの機能も提供する。

今回使用する Fedora では過去にクラスタを管理するために使用されていた Cluster Manager (CMAN) が削除されているため、今後使用できない。Shien システムの設計をするためには CMAN を外す必要がある。

\section{Logical Volume Manager (LVM)} 

LVM とは、複数のハードディスクやパーティションにまたがった記憶領域を一つの論理的なディスクとして扱うことのできるディスク管理機能である。

図\ref{fig:lvm}を用いて説明を行う。LVM はハードディスク内に、Physical Volume と呼ばれる LVM 用のパーティションを用意する。その Physical Volume を初期化し、Physical Extent と呼ばれる小さな領域に分割する。複数の Physical Volume をまとめて新たに作られる管理単位が、Volume Group になる。そして実際のパーティション同様に利用できる Volume 、Logical Volume を作成する。

Logical Volume は物理的なディスクのパーティションと同様に利用することができる。この Logical Volume を GFS2 でフォーマットする。

\begin{figure}[htpb]
  \begin{center}
    \includegraphics[scale=0.7]{figures/lvm.pdf}
    \caption{LVM}
    \label{fig:lvm}
  \end{center}
\end{figure}

\section{Clustered Logical Volume Manager (CLVM)}

クラスタを構成するノード間で LVM を使用する場合は、CLVM を使う。

LVM のクラスタリング拡張機能のセットである。一部のホストが変更した LVM 情報を他のホストに通知する。クラスタは LVM を使用した共有ストレージを管理できるようになる。GFS2 は CLVM を利用して複数ノードからのアクセスに対応する。

クラスタで Volume Group を使用する場合は、Volume Group にクラスタに対応するフラグの設定を行わなければならない。

\section{構成}

複数のブレードサーバでクラスタを構成する。クラスタの構成には corosync を使う。


\begin{figure}[htpb]
  \begin{center}
    \includegraphics[scale=0.7]{figures/gfs2cluster.pdf}
    \caption{GFS2 Cluster}
    \label{fig:gfs2cluster}
  \end{center}
\end{figure}

図\ref{fig:gfs2cluster} がブレードサーバ一台の構成である。GFS2 でフォーマットされた一つの iSCSI ストレージを共有し、iSCSI ストレージに VM のディスクイメージ、Docker のアプリケーションを保存する。これにより複数のブレードサーバ間で VM のイメージの共有や移動、コンテナイメージの移動を簡単に行える。 

\section{ie-virsh による資源の制限}

複数のアカウントで計算機資源を共有する場合、管理者による資源の制限が必須である。VM の使用が主な ie-virsh では過剰なディスク容量やメモリ、CPU の確保を防がなければならない。

ie-virsh がラップしている virsh は、XMLファイルを使って VM を管理している。XML ファイルには VM のパラメータが記述されている。

ie-virsh では学生が使用する VM が使用する資源を制限するために、予めこの XML ファイルのテンプレートを作成し利用している。

XML テンプレートで予め制限されている設定は、以下のようになる。

\begin{itemize}
    \item ネットワークの設定
    \item I/O 設定
    \item VM イメージのフォーマット
    \item CPU 数
    \item メモリ容量
\end{itemize}

これによって学生が使用する背資源を制限し、過剰なメモリや CPU の確保を防ぐ。
また学生が VM を多く作成するという形で資源を利用してしまうことを防ぐために、作成し操作できる VM の数を4台に制限した。

\section{ie-virsh debug}

本研究では、ie-virsh の新しい機能として debug コマンドの実装を行った。Linux Kernel のソースコードを読む方法は2つ挙げられる。Linux kernel をダウンロードし、そのソースコードをそのまま読むという手法と、gdb で逐次ソースコード追って読むという手法である。

gdb で Linux kernel のソースコードを追う準備には、手間がかかってしまう。また授業で Linux kernel を題材に出す際、gdb で追うことができると課題の幅が広がる。そこで本研究のシステムに、gdb で Linux kernel を追う機能を追加する。

KVM には gdb で接続するための Port を指定し、接続すると gdb から Linux kernel のデバッグへ入ることができる。更に libvirt の XML 設定ファイルに、KVM へ gdb で接続するために開ける VM の Port を記述することで、VM の Port を開くことができる。

今回は図\ref{fig:ievirshdebug} のように、Port の Pool から Port 番号を取得し、デバッグ対象の VM を起動し、その VM へ gdb で接続するという方法で実装した。Port は、libvirt の XML 設定ファイルに Port 番号を書き込み、VM を起動することで割り当てられる。

\begin{figure}[htpb]
  \begin{center}
    \includegraphics[scale=0.7]{figures/ievirshdebug.pdf}
    \caption{ie-virsh debug}
    \label{fig:ievirshdebug}
  \end{center}
\end{figure}


\section{Docker}

Docker とは、Docker 社が開発してるオープンソースのコンテナ型仮想化ソフトウエアである。Linux 上で Linuxコンテナ (LXC) を活用し、コンテナ型の仮想環境を作成する。図\ref{fig:container} は Docker のアーキテクチャである。

\begin{figure}[htpb]
  \begin{center}
    \includegraphics[scale=0.7]{figures/container.pdf}
    \caption{Container architecture}
    \label{fig:container}
  \end{center}
\end{figure}

コンテナは OS 環境を複数のグループに区切って別のサーバのように利用する技術である。KVM などの hypervisor 型の仮想化とは異なり、ホスト OS がまとめて管理する。
Docker は、コンテナでアプリケーションを実行するため、コンピュータリソースの隔離・制限や、他のホスト、他のコンテナとのネットワーク構成や、ファイル・ディレクトリの世代と差分の管理などの機能を持つ。また容易に配布して実行することもできる。

Docker では新しい独自技術をほとんど用いていない。しかし新たなサーバ資源の運用方法として注目されており、学生が学ぶのに必須な技術の一つである。

\section{ie-docker}

ie-docker は本研究で新たに開発を行った、Docker をラップし複数のユーザで利用することのできるコンテナ管理ツールである。他のアカウントのコンテナを操作させない。またアカウントの使える docker の機能を制限する。表\ref{table:iedockerfunc}が ie-docker の機能である。


\begin{tiny}
    \begin{table}[ht]
        \begin{center}
            \caption{ie-docker のコマンド}
            \label{table:iedockerfunc}
            \small
            \begin{tabular}[t]{c|l}
                \hline
                run & XML の template を元に domain を作成 \\
                \hline
                build & define で作成した domain を削除 \\
                \hline
                attach & 動作しているコンテナに attach する\\
                \hline
                images & docker image を一覧表示する\\
                \hline
                rmi & docker image を削除する\\
                \hline
                rm & docker process を削除する\\
                \hline
                start & docker process を起動する\\
                \hline
                stop & docker process を停止する\\
                \hline
            \end{tabular}
        \end{center}
    \end{table}
\end{tiny}

またウェブサービスを ie-docker で動作させる際、複数のコンテナが外部に向けて同一の Port を使用することはできない。そのため図\ref{fig:iedockerport} ie-docker では、docker run を実行すると自動的に Port を取得する。

Port を取得後は、リバースプロキシを使用して外部に公開する IP アドレスやドメイン名に Port を割り当て、外部からウェブサービスが参照できるようにする。

\begin{figure}[htpb]
  \begin{center}
    \includegraphics[scale=0.7]{figures/iedockerport.pdf}
    \caption{ie-docker による Port の付与}
    \label{fig:iedockerport}
  \end{center}
\end{figure}

\section{ie-docker による資源の制限}

Docker はコンテナごとに使用するメモリの上限を指定することができる。ie-docker では、コンテナのメモリ使用量の制限をユーザ全てに管理者が付与できるよう実装した。


\section{クラウド上での使用}

クラウドサービスではコンテナをユーザに使用させる。 ie-virsh 、ie-docker は LDAP を参照して資源を制限しているため、クラウド上でも本学科の LDAP を利用する必要がある。