2007年09月12日

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 でレプリケーションを行い、どちらのサーバーに更新を行ったとしても、もう片方のサーバーに変更が反映されるようにします。

ememcached1.png

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 プロトコルへの準拠と、ディスク書き込みによる永続化、などを予定しております。 皆様からのフィードバックもお待ちしておりますのでぜひ使って見てください。
klab_gijutsu2 at 10:00│Comments(0)TrackBack(0)Erlang 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント