組み込みTiki/キャッシュサーバ
SuzTiki:組み込みTiki
キャッシュサーバ の実装を考える。
ファイル自体は、ファイルシステムとは別のところにつくる。
- char 型デバイスを用意して、lseek して read/write。
メタデータは、DBM を使う。gdbm を使いたいところかも知れないのだが ...
ジャーナリングファイルシステムの対応とか.. ちょっといじりたいので
単純な ndbm にしておく。
基本的なアイディアは、
- データ構造
- url に対応した index ファイルを作る。
- url の先のデータは、データファイル に append
- データファイルには、ヘッダーとデータ本体をセットにしていれる。
- 消す場合は、index に消したという情報を付ける。
- 全検索は、データファイルをシーケンシャルに見る。
- キャッシュサーバは、単なる proxy server として 実装。
- キャッシュ化自体は、index を見て あれば それを返すし、
なければ読んで来たものを append 。
- ただし、デカイものは スルー。header だけ記録。
- コンパクション ... フルになったら、積めていく。
- 安全にコンパクション するにはどうしたら良いか思い付いていない。
- キャッシュだし おかしくなったら捨てればいいか。
- メモ: そうするのなら、捨てたくないメタデータ
( 何をもっていたかとか )は index ファイルの方にもっておくわけか ...
で、別のキャッシュサーバから 取って来るとかできれば良い?
- 新しい器を用意して、削除フラグのついていないものをそちらにコピーしていくというのはどうでしょう。コピーが全部終わったところで器を入れ替えるということで。--SHIMADA
- PDA でそれしていいのかな?というのがあって、一応コンパクション
考えています。でも、CF でコンパクションしていいのかな というのもある。
もっと検討が必要そうですね。
キャッシュサーバ の データファイル形式
どういう風にデータをため込むかについては、どんどん append していく
つもり。
ヘッダ1
データ1
ヘッダ2
データ2
という形式。ヘッダは、http のヘッダとおなじ形式 ( RFC822メールヘッダとおなじ
ともいうらしい)
ヘッダの中には、
- データの名前/ID
- データのサイズ
- データのタイプ
- データの日付
- データのダイジェスト
- キャッシュコントロールの情報
がはいっていないといけない。
それぞれについて の規定を検討。
データの名前:
URL: 名前
URI: 名前
キャッシュデータは、URL: しか含まないが、別のことにもフォーマットを
使いたいので、URI: というのも ありとする。( この2つは 排他的に使う )
名前は、URL エンコーディング?されたもの。
データのサイズ:
Content-Length: バイト数
データのタイプ:
Content-Type:
Content-Encoding:
とってきたときのものを格納
データのダイジェスト:
Content-MD5: md5-digest
これは、データが壊れていないかチェックするために必要。
( append している最中に システムが落ちた場合とか、コンパクションしている
最中にシステムが落ちた場合とか ...の対処用 )
データの日付
Last-Modified: Fri, 15 Feb 2002 08:00:12 GMT
とか。
キャッシュコントロールの情報
Expires:
Cache-Control:
とってきたときのものを格納
その他:
とってきたときのものを格納する。
参考: http://www.studyinghttp.net/rfc_ja/2616/rfc2616_ja.html
以上のフォーマット は、キャッシュ のデータだけではなく。他にも使おうと
考えている。
- ruby-box への import/ ruby-box からの export
- 他の ruby-box とのデータ同期。
要するに通信用のデータにも使う。
通信に使った場合、データのダイジェスト Content-MD5 の値は 意味が変わる
場合がある。
- データ + ヘッダ(一部) + パスワード に対して MD5 をかけた値。
パスワードがどういうものかは、まだ規定しないが、
import では、MD5 が一致しないかぎり システムは データを受け取らない
ことにする。
URI が指定された場合 キャッシュ以外の システム内のデータを意味
するが、次の 3 通りの内容がある。
- システムファイル
- システム設定ファイル
- Tiki などのコンテンツ
ファイルシステム内の具体的なファイル名はどうなるか、上記のどれに
相当するかについては、パス名に ある変換をかけたもので決まる。
その変換が具体的にどういうものかは、これから考える。
上記フォーマットで in/out する。
というのをまず作る予定。テストに必要なので。
とりあえず、ruby/nar.rb なんてのを考えてみました。
インターフェイスは変わるかと思いますが、
Nar::import_file1(head,in_io,out_io,passwd)
- Head は別途 パーズして、head[] にいれることにして、
in_io から読んで来たものを out_io にまず 書き出す。
- 読むついでに md5 をかけて、out_io の内容が OK かどうかを return する。
- passwd が設定されていたら、ヘッダの一部と passwd にも MD5 をかける。
- out_io を指定しないと OK かどうかだけを判断。
- tempfile をいきなり使わないのは、Disk をできるだけ 汚したくないから。
Nar::export_file1(path,out_io,name_conv,passwd)
- path のファイルを ヘッダを付けて out_io に書き出す。
- ファイル名変換 の 関数 name_conv が登録されて いたらその戻りを
ファイル名とする。
- passwd が設定されていたら、ヘッダの一部と passwd にも MD5 をかける。
インターフェイスはともかく、こういうのを核 にして考えていくつもり。
(最終更新 Thu Mar 30 19:06:34 2006)