2015年4月アーカイブ

前回のブログ記事 の最後に

まぁここまでやってみて冒頭にも書いたとおりFluentd+Kafka+Norikraで十分できそうな気がしましたが、
例えばAccessLogの集計からDDoSの判定をする際に静的ファイルにホワイトリストを書いておいて、
それに入っているものは除外的な使い方をしたい場合はまだコード書かないといけないのかなという印象を受けました



と書いたのですが、何か良い方法はないかなーと思いつつ、先日IPROSさんのオフィスで行われた Presto勉強会 に参加したし、そろそろPresto触ってみようとPrestoのドキュメントを眺めてたらConnectorにKafkaが用意されてたので、Prestoを使って上記の事をやってみようかと思います。
ちなみにホワイトリストリストは今回MySQLに作ってみました。

Javaの勉強がてらサンプルコードを参考にしながら作ってみました。
長いので結論から言うと Fluentd+Kafka+Norikra あるいは Fluentd+Azure EventHubs+Azure Stream Analytics の構成が一番楽でいい気が。。。

作成したコードはGithub上に置いてあります。
ちなみに以下の環境で動作確認しました。

  • Client
    • OS: Mac OSX 10.10 Yosemite
    • JDK: 1.8.0_45
  • Server (Kafka+Zookeeper)
    • OS: Ubuntu 14.10
    • Apache Kafka: 0.8.2.1
    • Scala: 2.11


ユースケース

Web Server(Nginx)のAccess Logを分散Pub-SubシステムのApache Kafkaに送信し、そこからストリーム処理的に時間単位のUpstreamのレスポンスタイムを集計することを想定してます。
Kafkaへのデータ送信はFluentd(fluent-plugin-kafka)を利用し、ログのフォーマットはLTSVでこんな感じ。

log_format  ltsv  'remote_ip:$remote_addr\tuser:$remote_user\tt:$time_local\treq:$request\t'
                   'status:$status\tbody_size:$body_bytes_sent\treferer:$http_referer\t'
                   'ua:$http_user_agent\tforwarded_for:$http_x_forwarded_for\t'
                   'upstream:$upstream_addr\tupstream_response:$upstream_response_time';


kafka2esper.properties

ZookeeperやKafkaの設定、EPLのクエリなどはプロパティファイルから読み込むようになってます。

  • conf/kafka2esper.properties
## For Zookeeper
zookeeper.connect=<zookeeperhost>
zookeeper.session.timeout.ms=400
zookeeper.sync.time.ms=200
auto.commit.interval.ms=1000
group.id=<group.id>

## For Kafka
kafka.topic=<Consume Kafka topic>
consumer.numThreads=4

## Esper
esper.query=<Esper Query(EPL)>


このアーカイブについて

このページには、2015年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2015年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。