Hatena::ブログ(Diary)

cooldaemonの備忘録 RSSフィード

2009-06-25

「分散Key/Valueストア,Kaiを使ってみよう!」第4回が公開されました

公開日の朝まで修正依頼を出し続けてしまい、技術評論社の方に多大なるご迷惑をお掛けしてしまいましたが、何とか 6/24 に公開されました。

今回は、Quorum 以外の設定について書きました。

既に Kai の trunk では、設定の項目名が変更になっているので、trunk を使う方はお気をつけ下さい。

(互換性を意識して、古い項目名も使えますが、警告メッセージが表示されます)

分散Key/Valueストア,Kaiを使ってみよう!:第4回 Kaiの詳細(2)―Kaiの設定をチューニングする|gihyo.jp … 技術評論社

次回から、橋本さんにバトンタッチです。

運用中心の話になるらしいので、今から楽しみ!

2009-06-17

「分散Key/Valueストア,Kaiを使ってみよう!」第3回が公開されました

今回は、クラスタについて、少し詳しく書いてみました。

「Kai を使うなら絶対にクラスタ構成にして欲しい!」と考え、力んで書いたα版が訳の分からない文章になってしまい、id:teahut さんに沢山添削して頂きました。多謝!

分散Key/Valueストア,Kaiを使ってみよう!:第3回 Kaiの詳細(1) ─Kaiの要であるクラスタを極める|gihyo.jp … 技術評論社

次回は、Kai の設定値を一つ一つ説明する予定です。

締め切りに間に合うか不安だなぁ・・・ orz

2009-06-10

「分散Key/Valueストア,Kaiを使ってみよう!」第2回が公開されました

第2回は下準備がメインですが、第3回は Kai の要であるクラスタを、第4回は設定値による影響について説明する予定です。

不備などありましたら、ご指摘をお願い致します。

分散Key/Valueストア,Kaiを使ってみよう!:第2回 Kai の基礎 ─Kaiのインストールと基本的な使い方|gihyo.jp … 技術評論社

諸々感想

未だに執筆者が未熟な自分で良いのか疑問ではあるのですが、ちょっと背伸びをしてみました。

Kai に関しては、ほんの少し開発に参加しただけではあるのですが、ありがたい事に id:teahut さんや id:ita-wasa さんのような専門家の方々にご指導頂け、その上、執筆の話まで頂けました。

少しでも恩返しできるよう、今回の記事が Kai 普及のキッカケになればと考えております。

なるべく、分散処理の素人視点で解りやすく書くつもりですので、最後までお付き合い頂ければ幸いです。

2009-03-29

Supervisor 配下のプロセスが停止した際に State を Dump し、再起動した際に State を Restore するには?

サンプルコードを書きました。gist: 91309 - GitHub

つい最近、kai_tcp_server に、現在の接続クライアント数を記録する為の Monitor プロセスを追加したのですが、現在の仕様では、何かの拍子に Monitor が落ちると接続数がリセットされてしまいます。(そのまま運用し続ければ、いつか正しい値に戻りますが・・・)

これは Supervisor が、その配下のプロセスを再起動する際に、クラッシュ直前の State を引き継ぐような仕組みを持たない為です。

簡単に思いつく回避策としては・・・

  • Supervisor に少し手を加えた新しいモジュールを作る
  • Callback:terminate/2 で State を、ファイルに保存するか他のプロセスに預ける

などでしょうか?

そんな事を悩んでいた所、Erlang の ML にタイミング良く同じ悩みを持った方が現れました。下記 URI は、その回答です。

erlang-questions- Restore state on supervisor restart

Supervisor 起動時に State 保存用の ets(or Mnesia) を起動しておけば、配下のプロセスは State を ets に保存しておけるよ。との事。

ets は起動プロセスが生き続ける限り使う事ができる為、Supervisor が ets を起動するのは理に適った方法ですし、これであれば簡単に実装できそうです。

Supervisor に監視以外のロジックを持たせると、Supervisor がクラッシュする確率が上がってしまうのではないか?とも考えましたが(Supervisor の Callback 関数にロジックを持たせるような類いの関数が存在しないのは、その為?)ets のテーブルは、プロセス内ではなくノード内に作成されるものであり、起動プロセスとは無関係な存在だったような気がする(ets:new/2 の Source を追う気力が無かったので、識者の突っ込みを希望)ので平気だろうと思い直しました。(起動プロセスが死ぬとテーブルが消える仕様は、誰にも参照されないテーブルが残り続けるのを防ぐ為の措置?)

ただ、よほど酷い使い方をしなければ、普通の State 操作やプロセスディクショナリが、速度で ets に負ける事は無い為、常に State の代わりに ets を使うのではなく、Callback:terminate/2 で State の退避先に ets を使う方が良い方法だと思います。

kai_tcp_server の Monitor の場合、erlang:monitor/2 を用いてプロセス監視を行っている為、State を引き継いだ場合は、erlang:monitor/2 を再実行する必要があります。まー、そんなに難しい話ではないので、そのうち対応したいなぁと考えてます。

サンプルコードは、後で書きます。

んー、いい加減、Erlang で仕事!とか、並列分散処理の仕事!とか、その辺が出来る職場に転職したくなってきました(w;

2008-12-05

kai_tcp_server: a simple module for implementing concurrent TCP servers

Last July, Kai developer team made a simple module named "kai_tcp_server", which has the following features:

  • Makes it easy to implement concurrent TCP servers,
  • Provides typical TCP server behaviours, listen, accept, and so forth,
  • Handles multiple requests concurrently by maintaining process pool,
  • Supports active as well as passive mode of gen_tcp,
  • Based on OTP principles.

How to Use

The following code of module provides a simple example of a echo server.

-module(echo).
-behaviour(kai_tcp_server).

-export([start_link/0, stop/0]).
-export([init/1, handle_call/3]).

-include("kai.hrl").

%% I/F
start_link() ->
    kai_tcp_server:start_link(
        ?MODULE, [], #tcp_server_option{port = 10000, max_processes = 2}
    ).

stop() ->
    kai_tcp_server:stop().

%% Callbacks
init(_Args) ->
    {ok, {}}.

handle_call(_Socket, <<"bye\r\n">>, State) ->
    {close, <<"cya\r\n">>, State};
handle_call(_Socket, Data, State) ->
    {reply, Data, State}.

This server is listening on port 10000 and accepts the two connections or less at the same time.

For more examples, see the following links.

Process Design

This module include a supervisor process with one_for_one restart strategy and several child process for socket accepting.

   +-------------------------+
   | tcp_server (supervisor) |
   +------------+------------+
                | (one_for_one)
   +------------|-----------------+
 +--------------|----------------+|
+---------------+---------------+|+
| acceptor (made from proc_lib) |+
+-------------------------------+

Download

Please download the latest version from the Kai subversion repository on Sourceforge.

Maybe this module is separated from the Kai if there is someone's hope.

See Also