15分で作る大容量ファイルサーバ(提案というか妄想)

発端

家に古いPCが何台もたまってくる。大体そいつらのスペックは大したことなくて、せいぜい数十〜数百GBくらいのディスク容量しか持っていない。彼らは退役したファイルサーバなのだけど、それらにバラバラにデータをためとくんだとデータの管理がとても面倒。なので、彼らの力を結集してひとつの大きなファイルサーバを作りたい。

要件

  • 沢山のファイルをひとつのインスタンス(ディレクトリツリー)に詰め込むこと。
  • No SPOF
    • どのサーバがいつ落ちてもよいこと。ただしサーバの二重故障は困るかも。
  • フラットなサーバ構成
    • どのデータがどのサーバに入ってるとかそういうことは管理したくない。
  • スケーラビリティ
    • 容量が不足してきたら、サーバを横に足すだけでよい。

録画したテレビのDVDとかたまってくる。市販の録画用DVDは安価で、数年すれば読めなくなる可能性が大きいし、HDD録画機も、秋葉原でのHDDの価格を観ると買う気が起きなくなる。RAIDにしてもいいんだけど、結局RAIDカードがイカれたら意味がない。最近でははてなが苦労しているし、doblogも二重故障に気づかずにひどい目に遭った事例がある。
さらに、最近ではHadoopなど多くの分散ファイルシステムがフリーでリリースされ、垣根が低く安定したものも多く出ていることから、一台のマシンで頑張る必要がなくなってきた。

構成

いわゆるWeb三層構成で、フロントエンドはWebDAVがよさげ。
f:id:kuenishi:20090222153633j:image
バックエンドはmemcacheプロトコルを喋る人なら誰でもいいんだけど、スケールするのはKaiだと思う。Kaiならバックアップもやってくれるし*1。テストベッドはmemcachedでやってみたけど。

最初はPyWebDAVというのを発掘して、memcache.pyと組み合わせてみようと思ってたんだけど、やっぱコードは自分で書かないに限る(ええ〜〜)。ので、memcachefsをmod_davのディレクトリにマウントしてしまうのが一番いいだろう、と判断してこういうアーキテクチャになりました。

問題点

ACLというかセキュリティ。

Apacheに丸投げでもいいのかもしれないけど、社内LANで使うならもう一工夫したい。例えば弊社での導入を考えると、数千人の社員がいるのでそこがスケールするかどうかがポイントか。

ファイルサイズの限界

memcachedはデフォルトで1MBが最大サイズなんだけど、最近ではドキュメントといえど1MBを平気で超えるファイルも多い。さらに、動画を視野に入れたときに、

  • memcachefsは大丈夫なのか(value sizeを増やせるのか)
  • kai (dets)は大丈夫なのか(value sizeを増やせるのか)

等々の心配がある。memcachedの中の仕組みは知らないけど、memcachedのkey/valueをinodeのように見せる仕組みの方が汎用性は高いかもしれない。問題は汎用性を追求するかどうかではなくて、どこに特化するかなんだろうけど。

一貫性

フロントエンドサーバが複数台になり、ユーザも増えてきたときに起きる問題。たくさんの人が一つのファイルを同時編集しているようなシーンで、CASやロックを今のアーキテクチャで提供できるのか、プロトコルはWebDAVで十分なのか、いろいろ心配です、姉さん。

おまけ

作ったけど使わなかった絵

f:id:kuenishi:20090222153632j:image

alternative

Kaiを使うんだったら、どうせならErlangで揃えちゃいなYo!と思ったら、その時のスタックは

て感じになるんだろうなぁ。問題はWebDAVロジックの実装。webアプリなんて長いこと書いてないし、できるのかなぁ、ってとこですね。

*1:いつChordが入るのか楽しみにしています