とんでもなくスケールする分散ファイルシステム
を作りたいんですが。ロックをやらないといけない反面、ロックがあるので(?)、ブロックデバイスより作りやすい気がする。
プロトコルはほぼできた感じ。
はてなに書いたエントリ(「第2案」)に、非同期IO、バイト単位ロック、共有データ→HDDブロックのマッピングとその逆変換を加えたもの。
例のごとく利用環境はLAN。
問題は2点。
・分散されたデータの整合性を保つために分散トランザクションが必要だが、何か良くワカラン上に、たぶん遅い。非同期IOの実装は難しくないけど、信頼性が落ちる。
・カーネルモードはイヤだけど、FUSEもイヤ
ファイルをinode(数字)で識別したい。カーネルモードだとそのあたりやってくれる。FUSEだとファイルパス(文字列)になってしまってイヤ。いちいちハッシュ取るのも何かイヤ。
それから、FUSEだとカーネルキャッシュをコントロールできないっぽい。それでもってユーザースペースでキャッシュをやると遅い。
かと言ってカーネルモードはデバッグがorz Cだし。
GFSとかOCFSとかカーネルモードだけど、すごいなと思う。
で、ちょっと見つけたのが、システムコールをフックして、全部ユーザーランドでファイルシステムを完結させる方法LD_PRELOADでフックライブラリをリンクさせて、readやらwriteやらを全部フックする。
http://datafarm.apgrid.org/document/html/ja/user/samba-hook.html
ファイルシステムデーモンとライブラリ間は共有メモリかを何か使うのかな?
が、フックライブラリだとカーネルから使えない。たとえばNFSのカーネルモードサーバーからは見えない。同じようにeCryptFSやCacheFSはたぶん使えない。
それからGfarmFSのフックライブラリの説明を読むと、mmap()を使えないらしい。原理的な問題?
…さて、今のところコレをやっている暇が無い。ぐぁぁ。