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

Comments

comments powered by Disqus