このエントリーをはてなブックマークに追加

dping(Distributed Ping) というものをriak_coreの上で試しに書いてみた

これまでriak_coreに関する記事をいくつか書いてて、その中でdpingという名前を使っていました。これは実はこの記事で紹介するものを作りたかったためです。

github:http://github.com/shirou/dping/

dpingとはなにか

Distributed Pingです。

監視を行うときに、一箇所からの監視だと、本当にそのサーバーが落ちてるのか、それとも途中経路が落ちてるのかが分からなかったりします。

dpingは、riak_core上の複数のノードからHTTP GETを送ることにより、複数箇所からの監視を行えます。全てのノードからのアクセスに対して200を返せば、途中経路の問題の可能性は少なくなるわけです。

こんな感じでriak nodeにattachして使います。

% dev/dev1/bin/dping attach

(dping1@127.0.0.1)1> dping("http://www.google.com").
command from 'dping1@127.0.0.1'
dping to "http://www.google.com" recieved. node: <0.237.0> on
'dping1@127.0.0.1'
responsed node 'dping1@127.0.0.1'
responsed node 'dping2@127.0.0.1'
responsed node 'dping3@127.0.0.1'
dping to "http://www.google.com" success.
ok

この例では、dping1に対してcommandを実行して、dping1,2,3がwww.google.comにHTTP GETをして、その結果すべてが200 OKだった、ということが分かります。

もちろん、多分同じ機能を持ったツールは数多くあるでしょう。単にriak_coreを使いたかった、というだけのことですww

なお、実装しつつ気がついたのですが、riak_coreは物理ノードではなくvnodeで管理しているので、同じ物理ノードからいっぱいHTTP GETが送られるという無駄なことになっています。このあたりは物理ノードを意識して、コマンドを送るvnodeをPrefListによって絞ることで無駄を省けるのではと思っています。

ちなみに当初はping(ICMP Echo/Reply)のつもりだったんですが、HTTPの方が受けがいいんじゃないかと思って変えました。でも、名前はそのままです。

riak_coreを試してみて

riak_coreを使うことにより、ノードがどこにあるのか、またその設定なども意識する必要がなくなるのではないか、と考えたわけです。

実際には監視点を変える必要はあんまりないわけですし、これだけだったらriakを使う必要はまったくないです。データのhandoffとかないですし。ただ、これはなにかには使えそうだなーという漠然とした感覚が持てたのでそれで十分です。

それよりもriak_coreが簡単に使えることに驚きました。書いたのは実質30行ぐらいでした。これでnodeのjoinとか面倒見てくれるわけですから、分散アプリケーションを作りたい人は使うといいと思います。

実用的?

今の実装はすべてのノードの先頭3つに対してcommandを送って、すべて200であればOKとしていますが、例えば

  • ランダムなノードからHTTPを送るようにする
  • 各ノードにtagをつけて、適合するノードからのみHTTPを送る
  • 1個ぐらいのエラーがあっても成功と見なす

なんてするともうちょっと役に立つかもしれません。

あと、実は今はsync_commandを使っているのでちゃんとcommandで非同期にしたいですね。

まとめ

  • dpingという、複数箇所から監視ができるツールをriak_coreのサンプルとして作りました
  • riak_coreいいよriak_core