InfluxDB の概要 - sonots #tokyoinfluxdb

21,823
-1

Published on

InfluxDB の概要 - sonots #tokyoinfluxdb

  1. 1. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. InfluxDB の概要 June 27th, 2014 ! Naotoshi Seo @sonots
 DeNA Co., Ltd.
  2. 2. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 2 自己紹介 ・瀬尾 直利 @sonots ・DeNA Co., Ltd ・インフラのDev ・Rubyist ・OSS 活動家 ・Fluentd コミッタ
  3. 3. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ⁃ ログを処理するアプリケーション(or フレームワーク) ⁃ Ruby プラグインの仕組みが強力 (+250 plugins) ⁃ InfluxDB との連携もできます!(fluent-plugin-influxdb)
  4. 4. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ⁃ グラフツール ⁃ HTTP POST するだけ ⁃ ストレージは RRDtool http://kazeburo.github.io/GrowthForecast/ GrowthForecast
  5. 5. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. http://blog.livedoor.jp/sonots/archives/29646713.html Yohoushi ! 分散 GrowthForecast グラフツール
  6. 6. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ・
  7. 7. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 7
  8. 8. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 8
  9. 9. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 免責事項 9 ! ⁃ 対象バージョンは v0.7 ⁃ 今後いろいろ変わる可能性があります
  10. 10. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. InfluxDB 10 ! ⁃ 時系列データベースの1つ ⁃ 時系列データを格納するのに適したデータベース ⁃ メトリクスやイベントの保存や解析に便利 ⁃ Paul, Todd, John の三人がフルタイムで開発して いる (Y Combinator の出資を受けている) ⁃ golang ⁃ 2013年の Open Source Rookies に選ばれた http://influxdb.com/
  11. 11. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. InfluxDB の特徴 11 ! ! • バックエンドに LevelDB を使っている ※ 抽象レイヤーもできました • HTTP API でクエリを投げる • database と series (RDBMS でいう table のようなもの) の2階層 • スキーマレス • 分散ストレージ • (やたらと)豊富なクライアントライブラリ
  12. 12. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 豊富なクライアントライブラリ 12 • JavaScript • Ruby • Python • Node.js • PHP • Java • Clojure http://influxdb.com • Common Lisp • Go • Scala • R • Perl (by @hirose31) • Haskell
  13. 13. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 時系列データベース 何に使うの? 13
  14. 14. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 何に使うか(具体例) 14 ! • システムメトリクスの保存 • アクセスログの集計や解析 • RRDtool の置き換え • MySQL でやっている時系列データ解析置き換え
  15. 15. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 時系列データベース一覧 15 http://en.wikipedia.org/wiki/Time_series_database より • Druid • Geras • InfluxDB • KairosDB • KDB+ • OpenTSDB • SiteWhere • TempoDB • Treasure Data(?) • RRDtool • Graphite
  16. 16. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. HTTP API 16 データ登録、データ取り出し
  17. 17. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. データ登録 17 ! POST to /db/<database>/series? u=<user>&p=<pass>. [ { "name" : "hd_used", "columns" : ["time", "value", "host"], "points" : [ [1400425947368, 23.2, "serverA"] ] } ] request body ※ timeを指定しない場合は現在時間
  18. 18. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. クエリ 18 ! GET to /db/<database>/series? q=<query>&u=<user>&p=<pass>. select * from log_lines limit 1 <query> response body [ { "name": "log_lines", "columns": ["time", "sequence_number", "line"], "points": [ [1400425947368, 287780001, "here's some useful log info"] ] } ]
  19. 19. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. クエリサンプル 19 InfluxDB をちょっとさわってみた - (ひ)メモ http://d.hatena.ne.jp/hirose31/20140404/1396596668
  20. 20. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 時刻で範囲指定 20 [ { "columns": ["time","sequence_number","reqtime","url"], "name": "web9999.httpd", "points": [ ["1392030886","60703580001","0.21","/view/entry"], ["1392030885","60703560001","0.07","/login/error"], ["1392030884","60703540001","0.32","/login/"], ... ] } ] select reqtime, url from web9999.httpd where time > now() - 1h limit 1000;
  21. 21. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 値で絞り込み(where) 21 [ { "columns": ["time","sequence_number","reqtime","url"], "name": "web9999.httpd", "points": [ ["1392030885","60703560001","0.07","/login/error"], ["1392030884","60703540001","0.32","/login/"], ["1392030881","60703480001","0.78","/login/error"], ... ] } ] select reqtime, url from web9999.httpd where reqtime > 2.5;
  22. 22. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 値で絞り込み(正規表現) 22 [ { "columns": ["time","sequence_number","reqtime","url"], "name": "web9999.httpd", "points": [ ["1392030883","60703520001","2.81","/list/entry"], ["1392030878","60703420001","2.72","/view/entry"], ["1392030877","60703400001","2.94","/login/error"], ... ] } ] select reqtime, url from web9999.httpd where url =~ /^/login//;
  23. 23. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 複数Series指定(正規表現) 23 [ { "columns": ["time","sequence_number","sys","user"], "name": "web9999.cpu", "points":[ ["1392030886","60703590001",3,57], ["1392030885","60703570001",9,1], ["1392030884","60703550001",28,42], ... ] } { "columns": ["time","sequence_number","reqtime","url"], "name": "web9999.httpd", "points": [ ["1392030886","60703580001","0.21","/view/entry"], ["1392030885","60703560001","0.07","/login/error"], ["1392030884","60703540001","0.32","/login/"], ... ] } ] select * from /web9999..*/;
  24. 24. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 複数Seriesへの問い合わせを Mergeする 24 [ { "columns": ["time","sequence_number","reqtime","url","_orig_series"], "name": "web9999.httpd_merge_web0001.httpd", "points": [ ["1392030886","60706000001","1.09","/view/entry","web0001.httpd"], ["1392030886","60703580001","0.21","/view/entry","web9999.httpd"], ["1392030885","60705980001","1.53","/login/error","web0001.httpd"], ... ] } ] select reqtime, url from web9999.httpd merge web0001.httpd;
  25. 25. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. group by (ダウンサンプリング) 25 select mean(sys) from web9999.cpu group by time(15m); 15分ごとの平均値! ╭( ・ㅂ・)‫و‬ ̑̑
  26. 26. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 使える Statement 26 ! • Group by • Merge (series を複数指定して結果をマージする機能) • Limit • Join • Order (time フィールド専用の Order by) • Explain ╭( ・ㅂ・)‫و‬ ̑̑
  27. 27. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 使えない Statement 27 ! • Having • サブクエリ • Order by (今はまだカラムにインデックス利かないので...) ! ( ・᷄д・᷅ )
  28. 28. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 使える集約関数 28 ! • Count, Min, Max, Mean, Mode, Median • Distinct • Percentile, Histogram, Derivative • Sum, Stddev, First/Last • DIfference, Top/Bottom (v0.6) ! Derivative (時間微分) とか便利 ╭( ・ㅂ・)‫و‬ ̑̑
  29. 29. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 使えない集約関数 29 ! • 豊富な Built-In 集約関数 • ユーザ定義できない (UDFの仕組みがない) ( ・᷄д・᷅ )
  30. 30. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Advanced 30
  31. 31. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Continuous Query 31 select percentile(value, 95) from response_times group by time(5m) into response_times.percentiles.5m.95; ! select count(type) from events group by time(10m), type into events.count_per_type.10m; クエリをあらかじめ仕込んでおくと、 逐次 的にデータを別のSeriesに格納してくれる
  32. 32. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Fanout Continuous Query 32 select * from events into events.[page_id]; • 格納先 Series の名前が動的に定まる • Seriesを分けてインデックス代わりにす るための機能 ※ group by, join, merge, where と一緒に使えません
  33. 33. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Administration 33 • 3つのロール • Cluster Admin • データベースを追加削除できる • Database admin と user を追加削除できる • クエリは投げれない • Database Admin • Database admin と user を追加削除できる • write/read パーミッションを変更できる • Database User • カレントデータベースを読み書きできる
  34. 34. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Graphite Protocol 34 http://influxdb.com/blog/2014/03/24/influxdb_v0_5_0_ready_for_production.html • Input Plugin をサポート • もう、HTTP だけじゃない • Graphite Plugin • UDP Plugin • Graphite (欧米で人気) をすでに使っているシス テムを InfluxDB に移行しやすくする狙い
  35. 35. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Abstract Storage Engines 35 https://github.com/influxdb/influxdb/tree/master/src/datastore/storage http://influxdb.com/blog/2014/06/20/ leveldb_vs_rocksdb_vs_hyperleveldb_vs_lmdb_performance.html 抽象レイヤーが入ってLevelDBだけじゃなくなった
  36. 36. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. クラスタリング/Shard 36 • ドキュメントがない\(^o^)/ • config_sample.toml に設定項目はある @chobi_e さんの発表に期待(・ω<) テヘペロ ※ 後記:こちらです https://speakerdeck.com/chobie/influxdb-internals-1
  37. 37. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 思ったこと / 気になったことツラツラ 37
  38. 38. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 38 • カラムにインデックス利かないので遅い • LevelDB だと key (id,時間,sequence) に しかインデックスきかない • 集約関数は豊富だけど UDF 定義できない • Having, サブクエリ, Order by 使えない... • RRDtool のように古いデータを自動で消す事はで きないのでバッチで消す...? 思ったこと
  39. 39. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Future 39
  40. 40. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Binary Protocol 40 ! ! • Protobuf / Msgpack / BSON • Asynchronisity • PubSub
  41. 41. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. PubSub Interface 41 ! ! • クエリを subscribe しておくと、 • データが入ってくるようなインターフェース
  42. 42. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Column Indexes 42 ! ! • カラムにインデックス貼りたい! • タグカラムを用意したいらしい • データにタグを貼る • ついでに、1カラムに複数データを入れられる Array 型もサポートしたいらしい
  43. 43. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Shard Spaces and Retention Policies 43 ! • 保持期間を決めてそれが過ぎたらデータを捨てる • RRDtool 的な(ry shardSpaces = [ ! {name: "raw", retention: "4h"}, ! {name: "week", retention: "7d"}, ! {name: "month", retention: "30d"}, ! {name: "year", retention: "365d"}, ! {name: "keep", retention: "inf"} ! ] // apply these rules for shard spaces ! rules = [{ "database": "metricsDB", ! "mappings": [ ! {"space": "week", "regex": "^week.*"}, ! {"space": "month", "regex": "^month.*"}, ! {"space": "year", "regex": "^year.*"}, ! {"space": "keep", "regex": "^keep.*"}, ! {"space": "raw", "regex": ".*"} ! ] }]
  44. 44. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Custom Function 44 ! ! • ユーザ定義関数 (UDF) • Lua Scripts ...
  45. 45. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Security Enhancements 45 ! ! • where custom_id = 3 にマッチするデータ だけ許可とか { "readPermissions": [ { "matcher": ".*" }, { "name": "customer_events", "whereClause": "where customer_id = 3" } ], "writePermissions": [ { "name": "customer_events", "valueRestrictions": { "customer_id": 3 } } ] }
  46. 46. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Merging Many Series into One 46 ! • select * from merge /stats.*/ • 正規表現で指定できるようにしたいらしい ! ※ 下のような merge はすでにできる select * from series1 merge series2
  47. 47. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. (ついでに) ダッシュボード紹介 47 Elasticsearch に対する Kibana のような
  48. 48. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Built-In Interface 48 ※おもちゃです
  49. 49. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Grafana 49 Kibana の fork。元は Graphite 用
  50. 50. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Influga 50 @hakobera 氏が作ってる便利そうなやつ :D
  51. 51. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. まとめ  51 • InfluxDB の概要を説明しました • Input Plugin の仕組みが出来て、HTTP API だけ ではなく、Graphite, UDP でもデータ投入できる • group by, join は使えるが、having, サブクエリ, order by などはまだ使えない • 抽象ストレージレイヤーができたのでストレージによっ てはカラムにインデックスが利くようになるかも • Future に期待
  52. 52. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 52 Thank you
  53. 53. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Appendix: 情報源 53 • デザインゴール • http://influxdb.com/docs/v0.7/introduction/overview.html • https://github.com/influxdb/influxdb/blob/master/design_notes.md • config_sample.toml • https://github.com/influxdb/influxdb/blob/master/config.sample.toml • 設定ファイルを読むとドキュメントに書いてないようなのが書いてあったり.... • Community • http://influxdb.com/community • メーリングリストに入って、@jvshahid, @toddpersen, and @pauldix の三人を follow しておくとよさそう • Paul Dix - Internals of InfluxDB • http://pivotallabs.com/paul-dix-internals-influxdb/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×