設定情報のpush型構成を組む場合の手段についてのメモ
管理画面から設定情報を保存しておいて、それをJSONで受け取ってfluentdのexec_filterで使うプログラム用に使っている箇所があります。管理画面のデータを保存するDBを、fluentdの入っているサーバ(以下、workerとします。)からは直接参照せず、管理画面のあるサーバからHTTPでJSON形式のデータをworkerで受け取るようにしています。workerでは定期的に設定情報のJSONを受け取るように設定しています。
しかし、定期的な設定情報の取得では更新からのタイムラグがあります。そこで、管理画面で設定情報が更新されたタイミングで準リアルタイムに設定情報を反映したいと考えました。
サーバに任意のカスタムイベントを送って、それを受け取ったら何かアクションを起こす的なことをしたいけど、Serfを使うまでもないし、かといって例えばfluentdをhttpで叩いてexecにつなげるというのもカジュアルだけどどうなんだろ
— Kenta Suzuki (@suzu_v) 2014, 1月 9
なんかもっとシンプルな方法ありそう
— Kenta Suzuki (@suzu_v) 2014, 1月 9
例えば設定情報を管理画面から更新した場合に、各フロントサーバにpush型で通知したい。各サーバからpollingしてpullするんじゃなくて。
— Kenta Suzuki (@suzu_v) 2014, 1月 9
@katzchang っぽい感じはするんですが、もっと古きよきものがある気もします
— Kenta Suzuki (@suzu_v) 2014, 1月 9
@bash0c7 あーそれもありですね。queueか。
— Kenta Suzuki (@suzu_v) 2014, 1月 9
@katzchang が楽かなとか。
— Kenta Suzuki (@suzu_v) 2014, 1月 9
@naoya_ito @katzchang 調べてみます
— Kenta Suzuki (@suzu_v) 2014, 1月 9
@bash0c7 enqueueするときにdequeue時のサーバを束縛してしまう、ということになってしまうのでしょうか・・・あーでもdequeue時に対象サーバ選ぶような作りにすればいいのかな
— Kenta Suzuki (@suzu_v) 2014, 1月 9
@naoya_ito @katzchang おお、イメージそんな感じかもです。読んでみます!ありがとうございます。
— Kenta Suzuki (@suzu_v) 2014, 1月 9
シンプルなケースなので新しい手段使わずに何か枯れた手段があるのではないかと思っていたところ、xinetdを教えていただきました。 id:naoya さんありがとうございます。
- inetd の仕組みを見てみる - naoyaのはてなダイアリー
- http://d.hatena.ne.jp/naoya/20070731/1185893412
今回のケースだと、管理画面での設定情報の更新イベントが発生したときにxinetdにtcpで通知すれば、worker側で設定情報をpullすることができそうです。
また、knockdというのもあることを知りました。
そして僕のtwitterを見ていた同僚からknockdでもできるんじゃないとアドバイスが飛んできた @IT:Security Tips > TCPポートをノックしてコマンドを実行するknockd
http://t.co/PLEQA9H8kp
— Kenta Suzuki (@suzu_v) 2014, 1月 9
これもシンプルにtcpポートをノックして任意のスクリプトを実行できるようです。
まとめ
多対多のサーバに柔軟にイベント設定できてあれこれしたい、ってなるとSerfとかのほうが良いかもしれないけど、今回のケースだと教えてもらったxinetdとかknockdがシンプルにフィットしそう
— Kenta Suzuki (@suzu_v) 2014, 1月 9
かなと思います。