Erlang版 memcached でレプリケーションしてみました。
先週お知らせした通り、Mnesia を使用した Erlang版 memcached が出来上がりました。ememcached ver 0.2 です。
前回の ets のコードも残してあったり、設定ファイルでストレージを切り替え られるようにしているうちにコードが長くなってしまいましたので以下からダ ウンロードしておためし下さい。
ダウンロード: ememcached-0.2.tar.gz
前回からの差分は以下の通りです
- 設定ファイルの使用
- Mnesia を使用出来るようになった(etsも使えます)
- キャッシュデータのレプリケーション
Mnesia とは
Mnesia とは Erlang の実行環境に付属する分散データベースマネジメントシ ステムです。前回紹介した ets や dets と同様に、Erlang のオブジェクトな らそのまま格納することが可能で、テーブルをメモリ上に構築するか、ディス ク上に構築するかを選択する事が出来ます。
さらにトランザクションやレプリケーションなど、高度な操作が可能になりま す。今回は、レプリケーションの機能を使用し ememcached を冗長化する方法 を紹介したいと思います。
構成
2つのノードで動作する ememcached でレプリケーションを行い、どちらのサーバーに更新を行ったとしても、もう片方のサーバーに変更が反映されるようにします。
図
Erlang のノードは物理的に離れたサーバー間で連携することも可能なのです が、手順が増えてしまうため今回は同一サーバーで複数のノードを起動する方 法で説明します。
設定ファイル
今回のバージョンから設定情報をファイルから読むようにしてみました。
node1.cfg(ノード1の設定ファイル)
{port, 11211}. {strage, {mnesia, [{extra_db_nodes, [node2@localhost]}]}}.
node2.cfg(ノード2の設定ファイル)
{port, 11212}. {strage, {mnesia, [{extra_db_nodes, [node1@localhost]}]}}.
ノード1 は 11211、ノード2 は11212 を listen し、互いに連携し合う様な設 定を行います。
実行
まずビルドします
% make erlc ememcached.erl erlc ememcached_config.erl erlc ememcached_ets.erl erlc ememcached_mnesia.erl
ノード1を起動します
% erl -noshell -sname node1@localhost -s ememcached start node1.cfg start node: node1@localhost load config: node1.cfg server listening: 11211
ノード2を起動します
% erl -noshell -sname node2@localhost -s ememcached start node2.cfg start node: node2@localhost load config: node2.cfg server listening: 11212
実験
準備が調いましたのでそれぞれのノードに netcat を使って memcache コ マンドを投げてみます。
まずノード1に {"key1", "foo"} というデータを set します。
% echo -ne "set key1 0 0 3\r\nfoo\r\nquit\r\n" | nc localhost 11211 STORED
すかさずノード2 から get してみます。
% echo -ne "get key1\r\nquit\r\n" | nc localhost 11212 VALUE key1 0 3 foo END
正常に値が取得できました。次は逆方向から {"key2", "var"} というデータを 素早く set と get してみます。
% echo -ne "set key2 0 0 3\r\nvar\r\nquit\r\n" | nc localhost 11212 && \ echo -ne "get key2\r\nquit\r\n" | nc localhost 11211 STORED VALUE key2 0 3 var END
ばっちりレプリケーション出来きました。
3つ目のノードを増やしてみる
ノードは2つだけでなくどんどん増やす事ができます。node3.cfg(ノード3の設定ファイル)
{port, 11213}. {strage, {mnesia, [{extra_db_nodes, [node1@localhost, node2@localhost]}]}}.
この様に記述し起動すればノード1 と ノード2 片方がダウンしていても生き ている方からレプリカを構成します。つまり一つでもノードが生きていれば データを維持し続ける事が可能になります。
最後に ememcached の今後につきましては、さらなる memcache プロトコルへの準拠と、ディスク書き込みによる永続化、などを予定しております。 皆様からのフィードバックもお待ちしておりますのでぜひ使って見てください。