このページの翻訳:
ソースの表示
最近の変更サイトマップ

ZFSにdRAID(パリティ非クラスタ化RAID)が来る

OpenZFS 2.1で分散ホットスペアを実現する新たなプール構成「dRAID」がリリースされる見込みだそうだ。dRAIDによってホットスペアが抽象化され、障害発生時のプールのリビルドが高速化されるとのこと。実装の解説を見ると、Declustered RAIDそのものな気がするが、OpenZFSでは慎ましく“Parity Declustered RAIDZ”と言っているようだ。

現在のZFSでは、ホットスペアはプールの予備デバイスという扱いとなっている。伝統的なRAIDシステムと同じ考え方で、ホットスペアは障害が起きたvdevの物理デバイスを置き換え、vdev内でresilver(データの復元とパリティの再計算)が行われる。抽象化が進んでいるZFSシステムの中では珍しく、割と物理デバイスを意識させる実装となっている。

dRAIDでは、そんなホットスペアデバイスの抽象化が行われる。表面上は今まで通りプールにスペアデバイスがあるように振る舞うが、内部的にはホットスペア用のブロックがvdevを構成する物理デバイスに分散して確保され、vdevに所属する仮想的な予備デバイスという扱いになる。デバイス障害時には、プールの全デバイスがかかわり分散的にデータ/パリティとスペアブロックを読み書きするため、リビルド時間が短縮されるという構図のようだ。ちなみに、dRAIDのrebuildはチェックサムとパリティの検証を行わないため、resilverとは明確に違うらしい。

言葉だけだとイメージが付きにくいが、図を見れば簡単に理解できるかと。

「Characterizing Declustered Software RAID for Enhancing Storage Reliability and Performance」(Zhi (George) Qiao, Song Fu, Hsing-bung Chen, Bradley Wade Settlemyer) より編集して抜粋

HCIのストレージの挙動に近いかも?

RAID-Z同様、dRAIDのvdev構成を後から変えることは現時点では出来ないとされている。ただし、dRAIDのデータ構造からするに、いわゆるdRAID Expansionはそう難しくない気がするが果たして…?。コードソンで会おう!

参考サイト



いつのまにかZoLとOpenZFSが統合されてた&永続的L2ARCが来るっぽい

ZFSのLinux向け実装であり今やZFS開発のメインストリームであるZFS on Linux (ZoL)が、いつの間にかOpenZFSと統合されていた。実態としては、統合というよりOpenZFSがZoLベースで仕切り直され、ZoLがOpenZFSに名前を変えたという感じのようだ。

経緯はともかく、既にZoLのGitHubはOpenZFSのリポジトリへとリダイレクトされるようになっている。で、2020年、すなわち今年にはZoL 0.8をベースとしたOpenZFS 2.0がLinuxとFreeBSD向けにリリース見込みとなっている。この辺のロードマップはOpenZFS Developer Summitでの発表資料(PDF)に詳しい。

また、そう遠くない未来に永続的L2ARC (Persistent L2ARC。界隈ではpL2ARCと表記されている)が取り込まれるようだ。

ZFSerにはご存じのとおり、L2ARCはSSDなどの高速ストレージを使ったZFSの読み込みキャッシュの仕組みである。後から必要な時に有効化できる簡単便利な仕組みだけど、システムの再起動でキャッシュ内容が失われてしまう欠点がある。正確には、キャッシュデータはそのままストレージ上に残っているものの、メモリにあるキャッシュ管理データが消えてしまうため、現状のL2ARCは事実上の揮発性キャッシュとなっている。

pL2ARCでは、その名前のとおりシステムが再起動しても以前のキャッシュが維持されるようになる。ちなみに、L2ARCの管理データは無視するには大きいサイズなので、あまり巨大なL2ARCを作るとメモリを圧迫し、L2じゃない方のARCが減るという本末転倒な事態に陥るので注意が必要。

pL2ARCの構想自体は以前のOpenZFSのロードマップにもあり、2015年にillumos向け実装の移植が試みられていたようだが、結局実現はしなかった。ところが最近になって、これまたZoLパワーでもって急速に開発が進められている。現時点でOpenZFS 2.0リリース予定には組み込まれていないものの、既にプルリクが作られており近々masterに取り込まれそうな勢いである。Linuxパワーしゅごい……。

参考サイト

メモリ16GBは人権の今、ZFSの重複排除(dedup)を解禁する

ZFSは2010年頃のPool Version 21で重複排除機能(dedup)を備えたが、本機能の使用は長らく禁忌とされてきた。というのも、Chr〇meも真っ青のレベルでメモリを馬鹿食いするからだ。ZFSの他の機能同様、dedupも有効にした後の書き込みから機能するため、当初は問題なく動いてるように見える。が、徐々にメモリが使われて行き「なんか重いなぁ…」と気付いた時には既に遅し、メモリが枯渇しているのである。慌ててdedup=offにしても、既に重複排除された分は効き続けるため、メモリは減ったままというオマケ付き。dedup地獄から抜け出すには、メモリを増設するかスワップを大量に割り当て、既存の重複排除が解除されるのをひたすら耐えるしかない。

そんな訳でdedupの実用は難しかったのだけども、メモリ16GBは人権宣言から1年、フッ化水素騒動も何のその、メモリ価格は下落を続け個人でメモリ1TBも現実的となってきた昨今、そろそろdedupを解禁しても良いのではないか。

FreeBSD Mastery: ZFSによると、dedupはデータ1TBあたり概ね5GBのメモリを消費するそうだ。うちの自宅サーバはメモリ64GBでメインのプールは8TBなので、dedupを有効にしてもお釣りがくる計算だ。ならば人柱よろしくdedupっちゃおうじゃないの。ちなみに、同書にはdedupメモリ消費量のより詳しい見積もり方法が書いてある。気になる人は買って読んでください。

dedupを有効にするプールzhomeは以下のような感じ。8TBのHDDを2本(ada5とada6)のミラー構成としている。改めてみるとファイルシステム名のつけ方が酷いな…。

$ zpool status zhome
  pool: zhome
 state: ONLINE
  scan: scrub repaired 0 in 0 days 02:21:29 with 0 errors on Thu Oct 24 11:57:54 2019
config:

        NAME        STATE     READ WRITE CKSUM
        zhome       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada5p1  ONLINE       0     0     0
            ada6p1  ONLINE       0     0     0
        logs
          mirror-1  ONLINE       0     0     0
            nvd0p3  ONLINE       0     0     0
            nvd1p3  ONLINE       0     0     0
        cache
          nvd0p7    ONLINE       0     0     0

errors: No known data errors

$ zpool list zhome
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zhome  7.27T  1.22T  6.04T        -         -     2%    16%  1.00x  ONLINE  -

$ zfs list -r zhome
NAME                         USED  AVAIL  REFER  MOUNTPOINT
zhome                       1.22T  5.81T    96K  /zhome
zhome/R                     1.21T  5.81T    88K  /zhome/R
zhome/R/home                1.21T  5.81T  1.21T  /usr/home
zhome/ROOT                  15.5G  5.81T    96K  /zhome/ROOT
zhome/ROOT/nextcloud        6.78G  5.81T  6.78G  /mnt/nextcloud
zhome/ROOT/vm               8.69G  5.81T    88K  /zhome/ROOT/vm
zhome/ROOT/vm/virtcurrency  8.69G  5.81T  8.69G  /zhome/ROOT/vm/virtcurrency

とりあえずホームディレクトリが置いてあるzhome/R/homeでdedupを有効にしてみる。

# zfs set dedup=skein zhome/R/home

dedup=onではなくdedup=skeinなのは、チェックサムアルゴリズムとしてSkeinを使いたいから。

dedupは標準でSHA-256を使うようになっているが、manを見る限りSkeinはSHA-256/SHA-512より安全かつ高速で、更にプール固有のソルトを用いるためハッシュ衝突攻撃にも強いらしい。「sha512は何からの理由で高速なskeinが使えないシステムで使う」とも書いてあるので、基本はskeinで良さそう。

その後、別プールにあるISOイメージやらインストーラやらが詰まってる493GBのフォルダを、dedup有効のプールにコピーした結果が以下。

$ zpool list zhome
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zhome  7.27T  1.64T  5.62T        -         -     3%    22%  1.11x  ONLINE  -

重複排除率が1.11xってのは……たぶん2.00xならdedupで実使用量が半分になったって事だろうから、(重複排除できたサイズ)=(1-(1/DEDUP))*(元のサイズ) なので48GBほど排除できた感じっすかね?

この時のメモリ使用量の変化は下図のとおり。

ARCサイズはloader.confvfs.zfs.arc_max=“20G”として20GBに制限している。dedup前はARCを20GBフルに使ってるのに対し、dedup後は15GBになっていることから、dedup用のハッシュキャッシュはARCから確保されるっぽい?

データ493GBでハッシュ5GBって冒頭の概算の2倍消費しとるやんけ!と思ったが、Skeinは512bitハッシュなので比率で考えたら見事に概算通りの結果となった。そう考えると、メモリ64GB程度ではdedupを使うにはまだ心許ない感じがするなぁ……(何というオチ)。ちなみに、将来dedupのメモリ消費量が削減される可能性があるっぽい。

まぁ、せっかくdedup有効にしてみたんだし、しばらく運用してみよう。NVMeなSSDも載ってるので、最悪そっちに大容量スワップ作れば何とかなるだろう。


(2020-01-06 追記)

dedup有効後、6日ほど経ったのでtopを見てみたら、ARCが20GBに戻ってた…。ARCからハッシュキャッシュから取られる訳ではなさそう?ちゃんと調べてみないと分かりませんな……。

last pid: 26323;  load averages:  0.21,  0.20,  0.17   up 71+13:01:17  22:29:52
51 processes:  1 running, 50 sleeping
CPU:  0.8% user,  0.0% nice,  0.3% system,  0.0% interrupt, 98.9% idle
Mem: 295M Active, 1465M Inact, 25G Wired, 35G Free
ARC: 20G Total, 11G MFU, 6802M MRU, 1530K Anon, 369M Header, 1446M Other
     17G Compressed, 24G Uncompressed, 1.43:1 Ratio
Swap:

参考サイト

ZFS on LinuxにRAID-Z Expansionのパッチが登場してた

表題の通り、ZoLにRAID-Z Expansionのパッチがコミットされていた→[WIP] raidz expansion, alpha preview 1 by ahrens · Pull Request #8853 · zfsonlinux/zfs · GitHub

まだα版ながらRAID-Z Expansionしたプールのimport/export、expansionのバックグランド実行等、基本的には動いているものの、不具合が発生した時はデータ消失の危険や、ディスクフォーマットは最終リリースとは異なるためテスト用とのこと。試される方は自己責任でオナシャス。



FreeBSDのZFS実装がZFS on Linuxベースに変更されるらしい

昨年末の話題ではあるけど、将来的にFreeBSDのZFSシステムがZFS on Linuxベースに変更されるらしい。メーリングリストを読む限り、Delphix社がZFS開発の軸をZFS on Linux(以下ZoLと表記)に移したことが発端となっているようだ。

これまで、OpenZFSの盟主たるDelphix社1)は、illumosからフォークした自社のDelphix OS用にZFSを改良し、それがOpenZFSに取り込まれてきた。現在のFreeBSDのZFS実装はillumosのコードがベースとなっており、FreeBSD用に多数のifdefを加えたものだそうだ。illumosという共通の祖先を持っていたからこそ、Delphixの改良がFreeBSDに取り込めてきたというわけだ。

ところが、前述の通りDelphixがZoLに移行したことで、illumosベースのZFS実装の改修が止まってしまった。現状、ZoLで行われた修正のillumosへのバックポートは全く行われていないそうである。ZoLの主要開発者であるBrian Behlendorfが、ZoLへのFreeBSD直接サポートの追加を薦めてくれたこともあり、ひとまずZoLをベースとしたZFS on FreeBSDプロジェクト、通称ZoFが立ち上がったという経緯のようだ。将来的にはZoLとZoFで1つのコードベースを共有するかもしれないとのこと。

ZoFの実装とテストはiX Systemsが主体となって行われており、既に殆ど問題なく動いているようだ。illumosの実装─界隈ではLegacy ZFSと呼ばれている─と比較してパフォーマンスも向上している模様。2019年3月1日にsysutils/zolとしてportsツリーに取り込まれ、2019年6月10日にはsysutils/openzfsへと名称変更されている。12.0-RELEASEのportsツリーにも取り込まれていることから、完成度の高さが伺える。FreeBSD 13の前にはillumosベースのZFSソースコードは削除されるだろうとのこと。

参考サイト

1)
自分が勝手にそう思ってるだけ
start.txt · 最終更新: 2019-08-19 02:45 by Decomo
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0