P2P型分散共有ファイルシステム(その1)

Internet上でP2Pで通信する分散共有ファイルシステムを考えてみる。
基本的なストーリーはこうだ。


あるネットワーク上に、ユーザーA, ユーザーB, ユーザーC がいたとして、それぞれのHDDの総容量と空き容量は下記のようになっている。

名前 HDDの総容量 HDDの使用容量 HDDの空き容量
ユーザーA 200GB 80GB 120GB
ユーザーB 200GB 40GB 160GB
ユーザーC 200GB 20GB 180GB
トータル 600GB 140GB 460GB


ここでユーザーAのHDDの空き容量は120GBしかないため、それ以上のデータを保存することはもちろん出来ない。


しかし、ここで考えている共有ファイルシステムでは、別のユーザーのHDDの空き容量も利用できるため、ユーザーAは最大460GBの領域を使用することもできる。
ただし、ユーザーAがすべての領域を使い切ってしまうと、ユーザーB/Cは追加のデータを保存することは出来なくなってしまう。


次に、このファイルシステムにデータの冗長性を持たせてみて、それぞれのデータは別のユーザーのHDDに必ずコピーされた状態で保存されるとすると、使用できる総容量は減るものの、ある一人のHDDが故障したとしても、別のユーザーのHDDに保存されたデータを使い、データが復旧できるようになる。


上記のような考えを実際に実装したものとして NRFS がある。


NRFSは、ネットワークRAIDファイルシステムの略だそうで、NRFSの特徴は上記URLより下記のように紹介されています。

NRFSの特徴


1. 複数(3 台以上)の PC もしくは WS を持っていればネットワーク RAID ファイルシステム(NRFS)を使用可能 → 高価な RAID 装置を購入する必要がない
2. 訂正可能な障害はファイルシステムが自動的に修正 → ハードウェア交換が必要な障害に対しても停止することなく交換作業が可能
3. マシンレベルの冗長性を持っている → 故障ノードの電源を切断して修理作業を行ってもファイルシステムは運用可能(システムレベルのホットスワップ)
4. 自動的にファイルシステムの内容を引き継ぎ 1 台ずつのマシン交換可能 → 低コストかつ便利でメンテナンスが容易
5. Gigabit Ethernet レベルの高速 LAN 上において NRFS を使用 → SAN (Storage Area Network) として同様な運用も可能
・データのビット等を自動修正し、ディスククラッシュ時もファイルシステムが停止せずに運用でき、 ディスククラッシュ時からの復旧のための莫大な作業時間も削減
・NRFS のベースとなる NFS 自体が分散共有ファイルシステムを実現しており、 さらに NRFS は高信頼性を付加しているため、 NRFS を高速ネットワークと共に使用することで、 高価な SAN 用ディスクサブシステムを導入する必要がなくなる。


NRFSはIPAの平成 12 年度・13 年度の未踏ソフトウェア創造事業の一環として開発のサポートを受けたようだが、最近は開発が止まっているのか Linux kernel-2.2.16 で動くコードしか公開してないようだ。
kernel-2.6系で動くのであればすぐにでも試してみたかったし、実際使えるのであれば使ってみたいと思えるユースケースがあったので、とても残念である。


さて、上記のNRFSの特徴と、Winnyの特徴を組み合わせたものを、P2P型分散共有ファイルシステムとして考えてみます。
そのファイルシステムは、まずNRFSの特徴である、ディスククラッシュ時でも訂正可能な障害はファイルシステムが自動的に修正することで、ファイルシステムが停止せずに運用できるという機能を有し、また、Winnyの特徴である、データをP2Pで通信し、自動的に接続先のノードを探して、それぞれが保持するキャッシュデータを交換する、という機能を持ったファイルシステムになります。


ユーザーから見たストーリーで説明すると、あるユーザーがP2P型分散共有ファイルシステムを立ち上げて、自分専用の領域を作成し、その領域にファイルをコピーすると、そのデータは自分のローカルHDDとは別に自動的にInternet上の別のユーザーのHDDにもコピーされ、もし自分が使ってるPCがクラッシュしても、別のマシンから自分専用の領域をマウントすることで、Internet上に分散されているデータをかき集めて、復旧できるようになっています。
ただし、データの分散のし具合や、データを保持してる別のユーザーがずっとオフラインのままだと、データが失われる可能性があるため、もしデータを失わないようしたいのであれば、データのコピー数を多くする必要があるでしょう。


こう考えると、データが常に複数コピーされるため、冗長性のためとはいえディスクの空き容量が無駄に消費されていってしまうという可能性もありますが、もし保存されたデータとまったく同じデータを別のユーザーが元々保存してた場合、そのデータは複製する必要はなくなるため、冗長性を保ちつつ、ディスク容量を節約できるようになります。


例えば、Winnyでは大量の画像・音楽・動画が流れてるそうですが、それらのデータはそっくりそのまま多くのユーザーのHDDにコピーされてるため、こういったデータは(データの違法性はともかくとして)P2P型分散共有ファイルシステムで共有して保存するのに向いてるでしょう。


また、Winnyはファイル交換を目的として作られてるため、データの暗号化はほぼ行われてない(Winnyクライアントなら誰でも受信可能)が、P2P型分散共有ファイルシステムで自分専用のファイルシステムとして利用するのであれば、他のユーザーのHDDにデータを保存はするが、そのデータの中身は見られては困るということはあるでしょう。
その場合は、データを分散する際に自分が持ってる公開鍵で暗号化し、データを復旧する場合は、自分しか持っていない秘密鍵で復号化すればいいでしょう。ただし、暗号化してしまうと、データが同じかどうかが判断できなくなるため、データを別のユーザーと共有できなくなってしまいます。
共有されるディスクの総空き容量がある程度多くて、自分が利用できない別のユーザーのデータが勝手に自分のHDDにコピーされても問題ないという環境であれば、暗号化した状態で分散するのもありでしょう。


・・・今日のところはここまで。続きはまた今度。