update.はじめに我が家のストレージサーバはFreeNASっていうソフトで運用してます。こいつはFreeBSD上で動くやつで、大変簡単に高価なストレージサーバレベルの機能を使用できる優れものです。FreeNASでは、RAIDを使うことはもちろんのこと、ZFSというファイルシステムを使用してファイルシステム上でRAID機能を実現することができます。Linuxを使ってみようと思います。ZFSの機能を色々検証してみたのでそれもメモとして残しておきます。ZFSのすごいところZFSはオラクルによって開発されたファイルシステムで、以下のような特徴があります。重複排除機能がある割とメモリー容量を欲する実に便利そうですなあ。メモリー容量が少ないとカーネルパニック起こすらしいので注意です。RAID-ZについてZFSが実装しているRAIDは、RAID-Zと呼ばれてます。RAID-Z1がRAID5相当にあたります。いまはRAID-Z3までありトリプルパリティまでいけます。あとRAIDでは「RAID5書き込みホール」問題というものがあります。データとパリティの間で不整合が起きる問題のことで、一見正常に動いているように見えていても徐々にデータが破壊されていくというオバケめいた問題です。この問題は停電やクラッシュで発生するようで、これを防ぐためにハードウェアRAIDではバッテリーを積んで防いでいるようです。RAID-Zを使用すると、この問題が起きないそうです。理由としてはコピーオンライト機能と可変ストライプ幅によるものと記載されていることが多いのですが、詳しいアーキテクチャについては難しくて謎です。可変ストライプ幅についてはいろいろ意見があるようなので特に謎です。Linux今回の仮想マシン早速インストールしてみたいと思います。例にもよって仮想環境を構築しました。今回はこんな感じのスペックです。最小インストールいつも邪魔ばっかしてくるSELinuxとかは既に止めてあります。あ、あと下のコマンドラインに出てくる容量表示は今回の値とは異なってる場合があるんで気にしないでください。Linuxのインストール公式ページを参考にインストールしていきます。EPELという外部リポジトリをインストールします。トランザクションの確認を実行しています。依存性解決を終了しました。0:7-5完了しました!次に、ZFSのRPMパッケージをダウンロードします。トランザクションの確認を実行しています。依存性解決を終了しました。0:1-2.el7.centos完了しました!準備が整ったので、kernel-develというのとZFSをインストールします。0:0.6.4.1-1.el7.centos完了しました!インストール完了です。インストールできているか確認してみましょう。zfs一番下にzfsと表示されています。ZFSプール作成まず、現状のデバイス状況を確認してみます。ディスクラベルが認識できません。ディスクラベルが認識できません。ディスクラベルが認識できません。ディスクラベルが認識できません。linux-swap(v1)sdaがLinuxがインストールされているデバイスのようです。sdbとかsdcがまだ何もフォーマットされてないディスクたちです。ZFSプールを作成してみます。ZFSでは基本的にzfsコマンドかzpoolコマンドしか使いません。単純明快なところが助かります。今回は調子に乗ってトリプルパリティであるRAID-Z3にします。MBR.といった矢先にエラーが出た。EFIラベルが無いとかなんとかってかいてあります。なんか-fっていうオプションつけたらいけるって書いてあるのでやってみます。ちなみにtankというのはzfsでのプールにおける慣例的なディレクトリらしく、みんなそこにマウントするので私もそうします。-f$何のエラーなく終わりました。zpoolコマンドで確認してみます。/tankなんと今の一行のコマンド一つでマウントまでされました。以下のコマンドでZFSプールの状態を確認できます。errors重複排除の威力ZFSファイルシステムは、標準装備で重複排除機能を持っています。デフォルトだと無効になっているのでまずは重複排除を有効化します。tankこの状態で1GBのファイルを作成してみます。bs=1Mサイズを確認してみます。bigfileちゃんと1GBのファイルが作成されています。普通のファイルシステムであれば、ストレージの容量も1GB分減っているはずです。-ALLOCというのが使用容量を示しています。なんと驚きの980KB!今回の実験では高効率のゼロ埋めファイルですが、例えばメールデータのバックアップ先なんかにしたら文字情報しかない為に結構な高率で保存できると思います。次はスナップショットという機能を使ってみます。ファイルを削除する前とかにスナップショットを取っておいて、なんかミスったらすぐに元に戻せるっていう機能です。スナップショットを作成します。tank@20150518スナップショットを一覧するコマンドがあるので確認してみます。-ちゃんと作成されていました。-よかった、60KB位しか増えてないようです。これでスナップショットはとれました。ここで作成した空ファイルを削除します。yこれでbigfileは消えてなくなりました。かわりにsmallfileというファイルを作成しておきます。MB/秒そして、さらにスナップショットを作成します。tank@20150518-2なぜここでスナップショットを撮ったのか?なんとZFSはスナップショット同士を比較することができるのです。!以下のコマンドで何が変わったかを確認することができます。/tank/smallfile表示された識別子で、何が変化したかを表してます。以下に表を置いておきます。|識別子|意味||:--:||:--:||M|変更||-|削除||+|追加||R|リネーム|/tankディレクトリが変更され、bigfileが削除されsmallfileが追加されたことがわかります。ロールバックも簡単です。tank@20150518ちゃんと元に戻ってるか確認してみます。bigfile完璧に元に戻りました。耐障害性の実験RAID機能の力を見る時がやってきました。ZFSプールの状態を確認しておきます。errorsstateがONLINEと表示されています。仮想マシンのいいところでHDDをぶっさすのも引っこ抜くものも自由自在です。ハードディスクを1本引き抜いてみます。再度ZFSプールの状態を確認します。errorsstateがDEGRADEDにかわっています。一台死んでやばい状態です。この状態でファイルが参照できるか確認してみます。bigfile問題なく参照できるようです。ディスクラベルが認識できません。unknownディスクフラグ:一台フォーマットしていないディスクが見えてきました。こいつをZFSプールに参加させます。-fからのZFSプールの状態確認。0エラーが無くなりました。パーフェクトだにゃん・・・おわり素晴らしいZFSでした。なくて高速化を図るテクノロジーもいっぱい搭載してるらしい。ちなみにホットスペアも検証してみました。したらZFSファイルシステムが壊れた。upLoginユーザーは見つかりませんでした。