2007年5月29日

Content-addressable storage -4- CASの定義

枕を話し始めたら興が乗ってしまって、いつまでも本ネタに入れなくなった落語家のような状態ではあるが、ようやっと本題だ。というわけで CAS

CAS の定義はその名前そのもの「Content」で「addressable」な「Storage」のことだ。
……ぜんぜんわからねぇ…… orz

というわけで、比較のために、もう2つ単語を定義する。SASとNASだ。

SAS: Sector Addressable Storage
NAS: Name Addressable Storage

先に断っておくと、SAS も NAS もここで定義しているようなものは、この場限りの定義だから。EMC用語でもないし、IBM用語にも無い。世の中一般にもこんな風には言わない。なので、SASとかNASをこれから定義する意味で使って、意図が通じなくても文句は言わないように。


あ、そうか。用語の定義から。

Storage:
これは判ると思っていいよね? HDDとかフラッシュROMとか…とにかく、「外部からの電力供給を断っても、(しばらくの間)データを保持してくれる外部デバイス」のこと。外部というからには内部があるわけで、それはメモリとかCPUとかの事を言う。
深く突っ込まないが、この辺も歴史的な背景があってこういう名前になっているものなので、あまりこだわらないように。

Addressable:
うーん。アドレス指定できるとかそういう意味になるのだが、この場合は「検索できる」とか「見つけられる」という風に捕らえるとよいかと。つまり
「この条件のものがほしいんですが?」
と言うと
「ほぃ、これね?」
と出してくれるもの。できれば O(1) …つまり常に一定時間で。ただし、最近はO(1)はだんだん難しくなっているらしくて、O(log n)とかでも許しちゃうけど。




で、まずはSAS。これは「セクターを指定すると、そのセクターに存在するデータを返してくれる」Storage。HDDとかがそうだ、といえば判りやすかろう。

昔は シリンダーだの、プラッターだのを指定した上での「このトラック上の何番目のセクター」とか言っていたが、最近はもう ATA だと48bit, SCSI だと 64bit のアドレス空間を目いっぱい使って、
「全体を通じて xxxx 番目のセクターを頂戴」
と言うと、1セクター分のデータをくれる。


実は、あなたの HDD の中にあるセクター数は、あなたが使えるセクター数よりも多い。あるセクターが調子が悪くなった場合、HDDは勝手に代替セクターというものにデータを移し変えてくれたりするのだが、この「代替セクター」は全体の 1/4 も用意してあったりする。勝手に移し変えられるのは、ユーザーから見ると、前に使っていたセクターも代替セクターも同じ「xxxx番目のセクター」でアクセスできるからだ。

だから、「xxxx番目のセクター」と言っても、使いはじめと、5年ぐらいたってからでは、物理的なセクターの位置は違っている可能性がある。と言う事は、実は「xxxx番目のセクター」とあなたが言ったとき、HDDは内部で
「はて、こいつが言う xxxx 番目のセクターって本当はどこ?」
という検索を行っているのだ。逆に言えば、ちゃんと検索して正しい答えを返してくれさえすれば、もう内部構造なんてどうなっていても良い。垂直磁気だろうが、小人さんがいようがかまわないのだ。そう。xxxx というセクター番号は仮想的な番号なんである。

SANはこの「セクター番号なんて仮想的なものだ」に「物理的なHDDだって仮想的ジャン」という考えをつないで、さらに「ネットワークでつなげば仮想かどうかはばれないよね」という考えにいたった SAS の最終進化系だ、と言うこともできる。



NAS: Name Addressable Storage。そう。名前を指定すると内容を教えてくれる Storage。

ようするに Network Attached Storage、通常言うところの NAS と同じ。ファイル名というか、パス名を与えると、
「あぁ、そのファイルはこれでございますな」
と内容を教えてくれる(あるいは、「それはあなた様は触ってはいけないものでございます」と文句を言われるかもしれないが)。別の言い方をすると、パス名をキーにファイル実体を検索してくれるわけだ。

ファイルシステムって全体的にそうだよね。ただ、「物理的な箱」という感じで言うと普通に言う NAS なんかがこれにあたる。もちろん、プロトコルはいっぱいあって NFSv2,v3,v4, SMB, CIFS なんかのほかに AFS, DFS, などなど。NFSv2,v3 や SMB, CIFS は NAS としては結構初歩的な機能しかなかったりするので、これがはやる理由が良く判らない(SIer が不勉強であるっていう場合以外は)。

まぁ、とにかく。これは多分一番判りやすいと思う。



で、これで考えると CAS ってのは
「すみません。『hogehoge. Ahage,ufuu … Heppero-pon』という内容のファイルがほしいんですが」
と言うと
「あぁ、ありますよ。これですね。中身は『hogehoge. Ahage,ufuu … Heppero-pon』です」
と言ってくるという…そういう Storage。ファイルの中身をキーにファイルを検索するわけだ。

え? ファイルを指定するのに中身を指定しなくちゃいけないなんて、間抜けだ?! まずもって、その感想は正しい。でも、こういう場合を考えてごらん。

a) 「すみません。ファイルの中身のハッシュ値が 58200g8d7sd.....Z なファイルがほしいんですが」
「あぁ、ありますよ。中身は『hogehoge. Ahage,ufuu … Heppero-pon』です」

b)「すみません。ファイルの中に Ahage という文字列があるファイルがほしいんですが」
「あぁ、ありますよ。中身は『hogehoge. Ahage,ufuu … Heppero-pon』です」

c) 「すみません。ファイルの中身が MS-Word のフォーマットになっているファイルがほしいんですが」
「えーーー、それは無いですね、今は」

c は unix でいう find コマンドと、file コマンドの組み合わせみたいな感じだよね。

b は自分のマシンだけだと grep とか、google desktop とかで、インターネット全体になると検索エンジンそのものだ。

a … a の例ねぇ。ファイルを指定するのに中身のハッシュ値を使う、有名なものとなると… Winny!! そう、Winny の ID ってのはようするにそういうものですな。こう考えると、Winny ってのも CAS の一種です。


このように「ファイルの中身」から「ファイル」を指定するものを一般に CAS と言います。



で、ここからが問題。CAS の何がそんなにいいのさ? …これが次回のテーマになります。
ヒントは Winny。