nkjmkzk.net

powered by Kazuki Nakajima

Archive for the ‘virtzfs’ tag

XenとZFSで仮想マシンの高速Thin-Provisioning、スナップショット/ロールバックを可能にする

一年ほど前にOracle VMとZFSを連携させて高速Thin-Provisioning、スナップショット/ロールバックを実現するovmzfsを作成&紹介しました。

しばらく放置しておりましたがSolaris 11 Expressがリリースされ、COMSTARがグッと身近になったということもありovmzfsをvirtzfsとして書き直しました。virtzfsとはXenの仮想マシンイメージをZFSに格納することによって下図のようなこと実現しその作業を自動化するツールです。





ovmzfsからの主な変更点は、下記の通り

  • Solaris 11 Express COMSTAR対応。
  • Oracle VM APIのサポートを廃止して(オイオイ)、よりシンプルに。VM Managerは不要になり、仮想サーバもOracle VM ServerではなくてもXenかつRedhat系OSなら多分動く。
  • Deduplicationを有効に。そもそもvirtzfsはVMの作成をSnapshot & Cloneで行うので容量効率は非常に良いわけですが、Deduplicationを有効にすること究極的に消費容量を圧縮します。(特に同じようなVM Templateを複数インポートしたときに効果を発揮。

それではインストール方法を。

必要なものは、NASとしてSolaris 11 Expressと、仮想サーバとしてOracle VM Server。Oracle VM Serverは別のXen環境でも代替可能だと思いますが、Oracle VM Serverがフリーでダウンロードできて実際テストもこれでやってるので一番手堅い。まずはこの2台をインストールしてネットワークをつなげてください。

次にSolaris 11 ExpressのrootからOracle VM ServerにパスワードなしでSSHログインできるように公開鍵設定をしておきます。Solaris 11 Express上でssh-keygen -t rsaなどとして/root/.ssh/id_rsa.pubを作成した上で、このファイルの中身をコピーしてOracle VM Server上の/root/.ssh/authorized_keysに張り付けます。

次にSolaris 11 ExpressにCOMSTARのパッケージをインストールしサービスを有効化します。

[root@nas]# pkg install storage-server
[root@nas]# svcadm enable stmf
[root@nas]# svcadm enable -r svc:/network/iscsi/target:default

次にGithubからモジュールをダウンロードしてSolaris 11 Express上に保存します。

ダウンロードはこちらから:https://github.com/nkjm/virtzfs

モジュールをSolaris 11 Express上で展開したらconfig.pyファイルを編集して設定を行います。設定を行うのは基本的に次の3つでOKです。

  • zfs_ip : Solaris 11 ExpressのIPアドレス。複数セグメントがある場合はOracle VM Serverから接続するIPを選択。
  • vmserver_list : Oracle VM ServerのIPアドレス。複数セグメントがある場合はSolaris 11 Expressから接続するIPを選択。また、複数のOracle VM Serverがある場合はコンマ区切りで設定 ex.["172.22.0.1","172.22.0.2"]
  • reposistory_name : 適当に。rpool/REPOSITORY_NAMEというファイルシステムをルートとしてレポジトリが形成されます。

次にvirtzfsを下記のように実行してレポジトリを初期化します。

[root@nas]# ./virtzfs init repository

成功したらインストールは完了です。

引き続きvirtzfsの利用に移ります。

virtzfs show nfsと打ってみてください。これで表示されるディレクトリをOracle VM ServerからNFSマウントするのです。例えばこんな感じ。

[root@nas]# ./virtzfs show nfs
        nas:/rpool/nkjm/nfs

[root@vmserver]# mount nas:/rpool/nkjm/nfs /srv

このディレクトリ中にはイメージファイルは作成されません。単にdomain定義ファイル(仮想マシンの設定ファイル)が作成されます。VM Server側からはこのファイルを指定してxm create [domain定義ファイル]とすることでVMを起動できます。

とはいうもののまだVMは作成されていないのでまずはVM Templateをインポートします。これも必ずしもそうである必要はありませんが、手堅いところでOracle VM Templateをダウンロードしてインポートします。VM TemplateをSolaris 11 Express上にダウロードして解凍し、下記のようにvirtzfsを実行します。

[root@nas]# ./virtzfs import template [解凍したTEMPLATEのディレクトリ]

Templateの名前を聞かれますのでそれを入力するとインポートが始まります。これにはしばらく時間がかかりますのでコーヒーでも淹れて待ちます。また、このインポートのロジックはかなり怪しいのですぐエラーになります(オイ。Templateディレクトリ中のvm.cfgのvifエントリが空だったらエラーになったりするのでその場合はvif = ['type=netfornt,bridge=xenbr0']とかを書いておくと突破できるはずです。まぁどちらにしてもdomain定義ファイルの生成ロジックは相当ヤバいので後から確認してみてください。

インポートが完了したらVMを作成できます。下記のようにvirtzfsを実行して対話的に作成を進めます。

[root@nas]# ./virtzfs create vm

複数VMを一気に作成することもできます。例え10個VMを作ったとしても作成時間はほんの数秒、必要となるディスクスペースは初期状態ではほぼゼロです。このあたりから楽しくなってきます。

VMが作成されたら起動してみます。Oracle VM Server側でxm createコマンドを発行します。

[root@vmserver]# xm create -c /srv/[VM名]/vm_cfg.py

成功すればVMが起動してコンソールが表示されるはずです。

あとはスナップショットとロールバック。スナップショットはVMが起動していても取得できます。また、VM作成時にも初期状態として勝手に一つスナップショットtが取られるようになっています。スナップショットを取るには下記のようにvirtzfsを実行して対話的に対象のVMとスナップショット名を入力します。

[root@nas]# ./virtzfs snapshot vm

取得したスナップショットtは下記のように確認できます。

[root@nas]# ./virtzfs list snapshot

ロールバックする場合はまずVMを停止します。停止した上で下記のようにvirtzfsを実行して対話的に対象のVMとロールバックしたスナップショットを選択します。

[root@nas]# ./virtzfs rollback vm

大体こんな感じです。かなりヘボいロジックも入ってますが、ハマれば中々便利です。

with one comment

Written by 中嶋 一樹

2月 1st, 2011 at 8:53 am

Posted in Uncategorized

Tagged with

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、圧縮、スナップショットを採用してユーザからは透過的にストレージを最適に利用するツールにできればと思っています。

with one comment

Written by 中嶋 一樹

11月 8th, 2009 at 2:33 pm

Posted in Uncategorized

Tagged with , , , ,

ovmzfsセットアップ手順

資料ではかなり省略して書いてあったのでひとまずここにセットアップ手順を書いておきます。

構成のイメージ

ovmzfs_minimum_design

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から追加登録してください。

without comments

Written by 中嶋 一樹

11月 3rd, 2009 at 7:57 pm

Posted in Uncategorized

Tagged with , ,

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や仮想化環境にご興味のある方は是非!

without comments

Written by 中嶋 一樹

10月 15th, 2009 at 3:29 pm

Posted in Uncategorized

Tagged with , , , ,