Archive for the ‘ovmzfs’ tag
Deduplication, 圧縮, スナップショットはどう違うのか?
前のエントリで予告したDeduplication, 圧縮, スナップショットの違いについて簡潔にまとめておきます。
Deduplicationと圧縮
例えば10Gbyteの仮想マシンイメージをgzipのようなアルゴリズムで圧縮した場合、10Gbyteのイメージにどれだけ空きスペースが含まれているかによりますが、もし空きスペースがほとんどなければあまり大きな圧縮効果は望めないでしょう。逆にもし10Gbyte中の4Gbyteが空きスペースであったなら、その部分はほとんど圧縮されるので最悪でも6Gbyte程度までは圧縮できるでしょう。ただしこの仮想マシンを10個クローンしたらどうでしょうか。ストレージは6Gbyte x 10 = 60Gbyteの容量を消費してしまいます。実際は同じデータであるにも関わらず、です。このストレージでDeduplication(重複排除)が有効であればどうでしょうか。10Gbyteの仮想マシンイメージを10個作成しても消費する容量は10Gbyteです。先ほどのgzip圧縮と比較するとトータルでこ重複排除の方が容量を節約できています。
ただしここで注意したいのはケースバイケースだということです。前述の仮想マシンイメージのような例は、特にDeduplicationが効果を発揮する環境です。Jeff Bonwick氏も自身のBlogエントリで度々仮想マシンイメージの例を引き合いに出しています。
そしてDeduplicationと圧縮は排他的な関係ではありません。補完し得る関係です。前述のシチューエーションをそれぞれのパターンでまとめてみます。
命題:10Gbyte (空き容量4Gbyte)の仮想マシンイメージを10個クローンする
gzip圧縮のみ
10Gbyteを圧縮して6Gbyteに。6Gbyteを10個クローンして最終的に60Gbyte消費
Deduplicationのみ
10Gbyteを10個クローンするが、10個のクローンはすべてのブロックが一致するはずなので新しいデータ領域は確保されない。最終的に10Gbyte消費
gzip圧縮 + Deduplication
まず10Gbyteを圧縮して6Gbyteに。それを10個クローンするがすべてのブロックが一致するはずなので新しいデータ領域は確保されない。最終的に6Gbyte消費
実際にテストしていませんが、理論的には上記のようになり得ます。要件によっては圧縮とDeduplicationを組み合わせたら最もディスク領域を節約できるケースがあることがわかります。
Deduplicationとスナップショット
Deduplicationとスナップショットは非常に近しい技術だと思います。どちらのコンセプトも「重複するデータの実体は一つしか保持しない」がベースになっています。僕は大きな違いは次の2点だと思っています。
主従関係
スナップショットでは主従関係が存在します。ほとんどのスナップショットの実装ではマスターのイメージがあり、スナップショットとはそのイメージのスレーブとして作成されます。なのでマスターとスレーブは対等な関係ではありません。スレーブは維持するけれどもマスターを削除する、という操作は行うことができません。ZFSのスナップショットでも同様です。
*ZFSでマスターを削除するにはマスターとスレーブの主従関係を逆転させるという選択肢はあります
これはDeduplicationの仕様とは明らかにことなります。前述の仮想マシンイメージの例で言えば、Deduplicationを使って10個の仮想マシンをクローンしてもそのオリジナルとクローンとの間には主従関係はありません。あるのはディスクに格納されているブロックの実体と、それを参照しているカウンタです。どの仮想マシンを削除するのも自由です。例えば大本の仮想マシンイメージを削除するにしてもそのブロックへの参照カウンタが一つ減るだけでスナップショットのように依存関係には縛られません。
コピー速度
ほとんどの実装においてスナップショットの作成は一瞬です。オリジナルイメージのスキャンが行われることもなければ新たなブロックが確保されてデータがコピーされることもありません。これはそもそもストレージ(あるいはボリュームマネージャ)にコピーではなくスナップショットという命令が明示されているからロジックを分けることができます。これはDeduplicationとは異なります。Decuplicationではコピー(あるいはクローン)する際、ユーザからの特別な命令はありません。通常通りファイルのコピーが命ぜられ、ストレージ側は粛々とファイルの構成要素となっているブロックについて一つ一つハッシュをチェックし、重複判定を行って重複していればデータのコピーは行わず参照カウンタをインクリメントして次のブロックに処理を移します。なのでスナップショットのようにどれだけコピー元のサイズが大きくても一瞬で処理を完了させれるような仕組みではなく、サイズが大きければ大きい程、例えば最終的にデータは複製しないにしろ、コピー処理には時間がかかるのが道理です。
ということでそれぞれの技術には得意不得意があり、ケースバイケースで適切な技術を選ぶ必要があると考えられます。
僕が開発しているovmzfsというツールの現在の仕様は、ZFSのスナップショット/クローンを使用して仮想マシンを高速に作成し、圧縮を使用してテンプレートのサイズ削減を行っています。これは検証環境では作業の高速化とストレージリソースの削減に大きく寄与しますが、今回Deduplicationが出てきたことで実装を少し見直さなければと思っています。現在の仕様では仮想マシンはテンプレートをスナップショット/クローンすることで作成しているため、高速に作成できるものの元のテンプレートと依存関係が発生します。すぐに問題とはなりませんが、より複雑な運用、大規模な環境ではもしかすると問題がでてくる可能性もなきにしもあらずです。まだDeduplicationを含むベストプラクティスを確立するには至っていませんが、最終的には適材適所でZFSのDeduplication、圧縮、スナップショットを採用してユーザからは透過的にストレージを最適に利用するツールにできればと思っています。
ovmzfsセットアップ手順
資料ではかなり省略して書いてあったのでひとまずここにセットアップ手順を書いておきます。
構成のイメージ

OpenSolarisセットアップ
OpenSolaris 2009.06をインストールします。
SUNWiscsidm, SUNWiscsit, SUNWiscsitgtをインストールし、iscsitgtdを起動する
[root@opensolaris]# pkg install SUNWiscsidm SUNWiscsit SUNWiscsitgt [root@opensolaris]# svcadm enable iscsitgt
VM Server & VM Managerセットアップ
Oracle VM 2.2のVM Serverをインストールします(このあたりはマニュアル、@ITの記事、このブログの記事等を参照ください)
VM Serverのパーティションレイアウトはカスタム設定で以下のようにしておきます。
/boot ext3 200MByte
swap 1280MByte
/ ext3 残り全部
Oracle VM Managerをインストールします。もし、VM Manager用のゲストOSもしくはNativeOSを用意することが難しい場合は、VM Server上にVM Managerをインストールするという荒技も可能です。以下のようにVM ManagerのisoファイルをVM Server上でマウントし、通常通りrunInstaller.shを起動すればインストールできます。
[root@vmserver]# mount -o loop,ro OracleVM-Manager-2.2.iso /mnt [root@vmserver]# sh /mnt/runInstaller.sh
VM ManagerをVM Server上にインストールした場合は、以下の[root@vmmanager]は[root@vmserver]と読みかえてください。
SSH設定
vmmanagerでovmzfsを実行するユーザにsuします。rootでもOKです。
公開鍵を生成します。
[root@vmmanager]# ssh-keygen
生成した公開鍵を以下に対して登録します。
- VM Serverのrootユーザ
- ZFSサーバPrimary Administratorとなっているユーザ(インストール時にユーザを作成していなければroot、作成していればそのユーザ)
[root@vmserver]# mkdir $HOME/.ssh && chmod 700 $HOME/.ssh [root@vmserver]# vi $HOME/.ssh/authorized_keys (vmmanagerのid_rsa.pubの内容をコピーする) [user@opensolaris]$ mkdir $HOME/.ssh && chmod 700 $HOME/.ssh [user@opensolaris]$ vi $HOME/.ssh/authorized_keys (vmmanagerのid_rsa.pubの内容をコピーする)
*OpenSolarisのrootユーザを使用する場合は/etc/ssh/sshd_configのPermitRootLoginをyesにし、svcadm restart sshしておきます。
vmmanagerからそれぞれのホストのsshでログインして、プロンプトなしでログインできることを確認します。
python-ZSIインストール
VM Managerにpython-ZSIをインストールします。python-ZSIはULN(Unbreakable Linux Network)のEnterprise Linux 5 Add-onsのChannelにあります。
[root@vmmanager]# up2date python-ZSI
ULNが使えないという人はこちらからRPMをダウンロードしてrpm -iでインストールしてください。
python-ZSI-2.1-a1.el5.noarch.rpm
ovmzfsセットアップ
VM Managerにovmzfsをインストールします。ovmzfsは一つのpythonスクリプトなのでこのファイルをパスの通っているディレクトリに置けばOKです。
[root@vmmanager]# wget http://nkjmkzk.net/wp-content/uploads/2009/11/ovmzfs-0.81.zip [root@vmmanager]# unzip ovmzfs-0.81.zip [root@vmmanager]# mv ovmzfs /usr/bin/
以下のようにovmzfsを実行します。対話的に初期設定が行われ、必要なモジュールファイルがVM Managerからダウンロードされ、ZFSサーバでレポジトリが初期化されます。
[root@vmmanager]# ovmzfs init
ZFSサーバの初期化が成功すると以下のようなメッセージが出力されます。
>>> >>> >>> New repository has been created >>> >>> >>> Shared Filesystem for /OVS is exported as opensolaris:/rpool/ovmzfs/[POOL NAME]/ovs Please run following command on VM Server. [root@vmserver]# /opt/ovs-agent-2.3/utils/repos.py --new opensolaris:/rpool/ovmzfs/[POOL NAME]/ovs (UUID of this filesystem will be displayed) [root@vmserver]# /opt/ovs-agent-2.3/utils/repos.py --root [UUID] And then, please create Server Pool using VM Manager
このメッセージに沿ってVM Server上でレポジトリを登録します。
VM Serverで共有ディスクを登録します。
[root@vmserver]# /opt/ovs-agent-2.3/utils/repos.py --new opensolaris:rpool/ovmzfs/[POOl NAME]/ovs [ NEW ] 5bcd80df-cb99-496a-8130-8713560f6fb8 => opensolaris:rpool/ovmzfs/[POOL NAME]/ovs [root@vmserver]#/opt/ovs-agent-2.3/utils/repos.py --root 5bcd80df-cb99-496a-8130-8713560f6fb8
次にVM ManagerからServer Poolを作成し、先ほどのVM Serverを登録します。
このとき、Server Pool名はovmzfsの初期設定で入力した値と一致しなければいけないことに注意してください。
無事にVM ManagerでServer Poolが作成できればovmzfsのセットアップは完了です。VM Serverが複数ある場合はVM Managerから追加登録してください。
Oracle VM meets ZFS !!!! – Oracle VM Forum 2009 東京 追加開催(10/30)
今月末の10/30日にOracle VM Forum 2009を東京で追加開催します。
Oracle VM Forum 2009 ~クラウドを掴む!次世代IT基盤構築のノウハウを伝授~
基本的に9/1におこなったイベントが好評だったのでその追加開催という形になるのですが、2セッション程新しい物に入れ替えています。僕がお話するセッションは下記2つです。
14:20 – 15:10 徹底解説「Oracle RAC on Oracle VM」で構築する次世代基盤実装
15:20 – 16:10 ZFSとOracle VMを連携させた門外不出の検証環境 構築手法(New !!!!)
後者のセッションが今回新規のものです。このセッションでは「イケてる仮想化検証環境」をどう構築するかにスポットを当てています。Oracle VM環境のストレージとしてOpenSolarisのZFSを使用し、瞬間仮想マシンプロビジョニング、スナップショットバックアップ等を実現する手法を紹介します。
Oracle VMはバージョン2.1.5から外部からマネージャ機能を呼び出せるWeb Service APIを装備しています(現在の最新バージョンは開催中のOracle Open Worldで発表となった2.2です)。 今回紹介する環境はこのAPIを叩いてZFSとOracle VMを連携させるツール「ovmzfs」を使い、ZFSの能力を仮想化環境で発揮させるというものです。セッションではこのツールの紹介/デモを行います。
そしてこのovmzfsというツールはオープンソースとしてそろそろ公開します。ZFSや仮想化環境にご興味のある方は是非!