Erlang版 memcached でキャッシュデータの永続化をしてみました。
幾つかの改変を行った ememcached ver 0.3 をリリースします。
主な変更点は、
- ディスク書き込みによるキャッシュの永続化 キャッシュデータをディスクに書き込むことで再起動してもキャッシュデータ が消えないように出来るようになりました。
- キャッシュデータのガベージコレクション 以前のバージョンには Expire したデータが残り続けるという問題がありました。
- autoconf/automake 化 ./configure && make でビルドできます。
ダウンロード: ememcached-0.3.tar.gz
Mnesia のテーブルタイプについて
Mnesia はテーブル毎に3種類のデータの格納方法が選択できます。
- ram_copies メモリに格納されます。ememcached-0.2 で使用していたタイプで高速ですが 再起動すると消えてしまいます。
- disc_copies ram_copies 同様データはメモリに保持しますが書き込む時はディスクにも書 き込みを行います、読み込み時にはメモリアクセスのみで済みます。
- disc_only_copies 書き込みと読み込みの両方ともディスクにアクセスします。
今回の ememcahed では設定ファイルで ram_copies と disc_copies を選択で きるようにし、disc_copies を使用することでデータが消えない memcached を実装する事が出来ました。
設定ファイル
mnesia_disc.cfg(Mnesia + データの永続化の設定、ソースパッケー ジの conf ディレクトリにサンプルとして置いてあります)
{port, 11211}. {strage, {mnesia, [{table_type, disc_copies}]}}.
実行
autoconf/automake 化したことで以前のバージョンと起動方法が若干変わ ります。
% ./configure && make
起動します
% erl -pa ./src -noshell -s ememcached start conf/mnesia_disc.cfg start node: nonode@nohost load config: conf/mnesia_disc.cfg table_type: disc_copies server listening: 11211
これで再起動を行ってもデータが消えない様になりました。カレントディレク トリには Mnesia.nonode@nohost というようなディレクトリが作成されている はずです。この下に Mnesia データとしてキャッシュが保存されています。
ガーベジコレクション
以前のバージョンでは set されているデータを get した時に expire してい れば消す、という処理を行っていたのですが、get されなければデータは消え ずに貯まり続ける、という問題がありました。
今回のバージョンでは expire したデータを一定間隔で削除するガーベジ コレクタを別プロセスで起動します。
設定ファイルを以下のように書くと 10秒毎にガーベジコレクションが走り ます。
{port, 11211}. {strage, {mnesia, [{table_type, disc_copies}, {gc_interval, 10}]}}.
autoconf/automake 化
最近の autoconf には Erlang のマクロが含まれているようなので使用してみ る事にしました。AC_ERLANG_NEED_ERL や AC_ERLANG_NEED_ERLC を使うことで で erlang の環境をチェック出来、適切な場所へインストールすることが容易 に記述できました。
まとめ
今回は新しい ememcahed の説明と使用方法をメインに紹介しましたが、今後 は mnesia の挙動や、書き込みリクエストの同期性、select や QLCなどの API の詳細についても触れていきたいと思います。