InfluxDB Internals

3169fb51728b8dc9d56675d3fb1a6de6?s=47 chobie
June 27, 2014

InfluxDB Internals

3169fb51728b8dc9d56675d3fb1a6de6?s=128

chobie

June 27, 2014
Tweet

Transcript

  1. Copyright © GREE, Inc. All Rights Reserved. InfluxDB  Internals -‐‑‒

       詳細InfluxDB  -‐‑‒ Gree,  Inc. Shuhei  Tanuma ఱԼҰInfluxDBษڧձ 27, June, 14
  2. Copyright © GREE, Inc. All Rights Reserved. 免責事項 •  2014年年6⽉月時点(v0.7系)の情報なので今後⾊色々

    変わることがあります •  流流⽯石に全部調べきれてないので間違ってることも あるのでその際はマサカリお待ちしてます! •  ⻑⾧長くなっちゃったんで⾊色々端折るんで興味ある⽅方 はあとでupされる資料料をご確認ください
  3. Copyright © GREE, Inc. All Rights Reserved. •  API • 

    AdminUI •  Coordinator •  Shards •  Query  Engine •  Write  ahead  log  /  Writer  Buffer •  開発の⼿手引 •  アプリケーションの実例例 Agenda 3
  4. Copyright © GREE, Inc. All Rights Reserved. About  Me chobi_e

    (Shuhei Tanuma) GREE, inc. Infrastructure Department Service Reliability Team Major: PHP(core), MySQL, KVS PECL Maintainer (ProtocolBuffers, Sundown. and several experimental extensions) 最近フリー素材化されたけどふとましい https://github.com/blog/1854-‐‑‒octotales-‐‑‒gree
  5. Copyright © GREE, Inc. All Rights Reserved. •  Goで書かれたアプリケーション • 

    時系列列データに特化した構造で簡単に扱える •  Clustering構成でスケールアウトできる InfluxDBの特徴 5
  6. Copyright © GREE, Inc. All Rights Reserved. InfluxDB  Internals Query

    Engine WAL Shards Coordinator API Endpoint Admin UI Shards Shards Database leveldb, hyperleveldb, rocksdb, mdb http, graphite, udp...
  7. API

  8. Copyright © GREE, Inc. All Rights Reserved. APIの基本 Coordinatorの機能を外部へ提供する Coordinator

    Insert Query API HTTP Graphite UDP... 8
  9. Copyright © GREE, Inc. All Rights Reserved. HTTP  API InfluxDB

    MainのProtocol •  HTTP+json簡単に使えるプロトコル •  HTML5  Applicationとの親和性が⾼高く、クライアントライ ブラリの作成も簡単 InfluxDBのHTTP  APIを使ったGrafana 9
  10. Copyright © GREE, Inc. All Rights Reserved. HTTP  API ▪データの挿⼊入

    curl -X POST -d \ '[{"name":"foo", \ "columns":["val"],\ "points":[[23]]\ }]' \ 'http://localhost:8086/db/mydb/series? u=root&p=root'
  11. Copyright © GREE, Inc. All Rights Reserved. HTTP  API ▪データベースの作成

    curl -X POST –d \ '{"name": "access"}’ \ 'http://localhost:8086/db? u=root&p=root' -d
  12. Copyright © GREE, Inc. All Rights Reserved. HTTP  API ▪データベースの削除

    curl -X DELETE \ 'http://localhost:8086/db/access? u=root&p=root'
  13. Copyright © GREE, Inc. All Rights Reserved. HTTP  API ▪クエリの実⾏行行

    curl -G 'http://localhost:8086/db/mydb/ series?u=root&p=root&pretty=true' \ --data-urlencode \ "q=select * from log_lines limit 1” chunked=trueͰchunked transferͰฦ͢ pretty=trueͰprettify͢Δ
  14. Copyright © GREE, Inc. All Rights Reserved. HTTP  API ▪結果

    [{ "name": "influxdb.macbook.local.mem", "columns": [ "time", "sequence_number", "used" ], "points": [[ 1403619622285, 318690001, 14255144960 ]] }]
  15. Copyright © GREE, Inc. All Rights Reserved. UDP  API write専⾨門の軽量量なAPI

    Endpoint write専⾨門のjson  API。他のプラグインと⽐比べgoroutineの 増加が抑えられるメリットも有る。 type SerializedSeries struct { Name string `json:"name"` Columns []string `json:"columns"` Points [][]interface{} `json:"points"` } [[input_plugins.udp_servers]] enabled = false port = 5551 database = "db1” 15
  16. Copyright © GREE, Inc. All Rights Reserved. Graphite  API Graphite向けの代替バックエンド

    [input_plugins.graphite] enabled = true port = 2003 database = ”graphite” 私Graphite使ってないので詳細みてないけど便便利利な⼈人には すごく便便利利なエンドポイントだと思う ううん、知らないけど絶対そう 16
  17. Copyright © GREE, Inc. All Rights Reserved. Mackerel  API Mackerel

     Meetupで振る舞われた鯖サンドが美味しかった ので作ってみたAPI  (野良良パッチ) [input_plugins.mackerel] enabled = true port = 4000 database = ”mackerel” https://mackerel.io/ https://github.com/chobie/influxdb/tree/mackerel ./agent  -‐‑‒apibase  =  “http://localhost:4000”  -‐‑‒apikey=“SABA” 等でapibaseを指定すればmackerelのメトリクスをそのままInfluxDBで 収集することも出来ます。その他のAPIは実装してません。
  18. Copyright © GREE, Inc. All Rights Reserved. API  まとめ 基本的にAPIのレイヤーはCoordinator

     Interfaceへの薄い ラッパーとなっているので実装が簡単。 今後実例例なども増えていくと⾃自分たちのニーズに合ったAPI   Pluginが増えていくのが予想される
  19. Admin UI

  20. Copyright © GREE, Inc. All Rights Reserved. https://github.com/influxdb/influxdb-‐‑‒admin Middleman,  Angular.js等を使ったhtml5

     application. Release版のInfluxDBに同梱されている。 現状ではInfluxDBの管理理と簡易易的なクエリ実⾏行行、Plotが Webから実⾏行行できる Admin  UI Middleman × HTML5のInfluxDB管理理ツール 20
  21. Copyright © GREE, Inc. All Rights Reserved. Admin  UI 接続画⾯面

    指定したHostの管理理がここから⾏行行える。 ブラウザバックはまだ対応できていないのでついつい⼿手癖で 押さないようにしとくと吉
  22. Copyright © GREE, Inc. All Rights Reserved. Plot画⾯面 データ挿⼊入、クエリの実⾏行行、簡易易的なPlotが⾏行行える データ量量が多いとTableの描画が重くブラウザがハングすることもある

    Admin  UI
  23. Copyright © GREE, Inc. All Rights Reserved. Cluster  /  Shards画⾯面

    Admin  UI
  24. Copyright © GREE, Inc. All Rights Reserved. InfluxDBを操作するのには便便利利だが⾊色々と課題は多い http://influxdb.com/jobs.html Goとfront-‐‑‒endエンジニアを募集中なので今後の発展に期待

    Admin  UI  まとめ
  25. Coordinator

  26. Copyright © GREE, Inc. All Rights Reserved. Coordinator クラスタ間での協調動作やDB操作を扱う InfluxDBのNode間での情報のSyncやレプリケーション、クエリの実⾏行行などを司る

    主にConsensusをとる部分(Raft)とCoordinationをする2つのパートから成り⽴立立つ 主要操作はCoordinatorを通して⾏行行われるので重要な部分 •  Consensus Meta  Dataの共有等(Account,  DB情報等) •  Coordination クラスタ間/local処理理の協調動作/Replication等 26
  27. Copyright © GREE, Inc. All Rights Reserved. Coordinator  (RAFT) クラスタ間でのメタデータ(User、Permission)の共有

    (seeds) RAFT(HTTP) •  Sync  metadata  (User,  Permission,  etc) (node) 27
  28. Copyright © GREE, Inc. All Rights Reserved. Coordinator  (RAFT) type

    ClusterConsensus interface { CreateDatabase(name string) error DropDatabase(name string) error CreateContinuousQuery(db string, query string) error DeleteContinuousQuery(db string, id uint32) error SaveClusterAdminUser(u *ClusterAdmin) error SaveDbUser(user *DbUser) error ChangeDbUserPassword(db, username string, hash []byte) error ChangeDbUserPermissions(db, username, readPermissions, writePermissions string) error AssignCoordinator(coordinator *CoordinatorImpl) error CreateRootUser() error ForceLogCompaction() error }
  29. Copyright © GREE, Inc. All Rights Reserved. Coordinator  (TCP  Protobuf)

    ノード間のデータ転送やクエリ実⾏行行、リモート越しの操作 (seeds) TCP  +  ProtocolBuffers •  replicate  series •  throw  query  /  aggregate  query (node) 29
  30. Copyright © GREE, Inc. All Rights Reserved. Coordinator  (TCP  Protobuf)

    type Coordinator interface { WriteSeriesData(user User, db string, series []*Series) error DropDatabase(user User, db string) error CreateDatabase(user User, db string) error ForceCompaction(user User) error ListDatabases(user User) ([]*Database, error) DeleteContinuousQuery(user User, db string, id uint32) error CreateContinuousQuery(user User, db string, query string) error ListContinuousQueries(user User, db string) ([]*Series, error) RunQuery(user User, db, query string, seriesWriter SeriesWriter) error }
  31. Copyright © GREE, Inc. All Rights Reserved. Coordinator  (TCP  Protobuf)

    message Request { enum Type { WRITE = 1; QUERY = 2; DROP_DATABASE = 3; HEARTBEAT = 7; } optional uint32 id = 1; required Type type = 2; required string database = 3; repeated Series multi_series = 4; optional uint64 sequence_number = 5; optional uint32 shard_id = 6; optional string query = 7; optional string user_name = 8; optional uint32 request_number = 9; optional bool is_db_user = 10; }
  32. Shards Clustering

  33. Copyright © GREE, Inc. All Rights Reserved. Shards Shards /

    TimeBucket 期間毎にTimeBucket,  Shardという単位でデータの格納先が分けられてい る (Series)  access TimeBucketの中にShardがいくつも⼊入っているイメージ。 物理理的なShardを分割することでSeek時間の短縮や並列列でのがFetchが容易易 6/30  –  6/20 6/20  –  6/10 6/10  –  6/01 Short  time 3/1  –  5/30 Long  time 33
  34. Copyright © GREE, Inc. All Rights Reserved. Shards Shards Configuration

    (Scaling out) [sharding]      [sharding.short-‐‑‒term]          duration  =  “7d”          split  =  1      [sharding.long-‐‑‒term]          duration  =  “30d”          split  =  1 34
  35. Copyright © GREE, Inc. All Rights Reserved. 今後のShardsについて 近いうちに任意のShardやデータの保持期間を設定することがで きるようになる。Continuous

    Queryと組み合わせることでRRD的 な使い方も簡単になる見込み
  36. Copyright © GREE, Inc. All Rights Reserved. Clustering Clustering Configuration

    •  所謂マスタノードのconfigで[seed-‐‑‒servers]をコメン トアウトする(defaultではコメントアウトされてるは ず) •  別ノードのconfigでseed-‐‑‒servers  =  [“seed-‐‑‒server: 8090”]を指定する master  nodeを⽴立立ち上げた後に別ノードを⽴立立ち上げれば ⾃自動的にクラスタリングができる 36
  37. Copyright © GREE, Inc. All Rights Reserved. Clustering Clustering Configuration

    同⼀一マシン内で複数台のノードを⽴立立ち上げる場合は •  portを重複させないようにする •  admin,  api,  protobuf,  raft等 •  storage,  walのディレクトリを分ける という⾵風に指定しておけばOK 37
  38. Copyright © GREE, Inc. All Rights Reserved. Clustering Clusteringの現状 • 

    Should  be  able  to  remove  server  from  cluster https://github.com/influxdb/influxdb/issues/322 というIssueがあるようにClusteringができるけれど異異 常系の動作などが⾃自動で⾏行行えるわけではなさそう。 go-‐‑‒raftがわかっていれば⼿手動でどうにでもなる部分なの でゴリゴリできるならClusteringもありだと思う。 38
  39. Copyright © GREE, Inc. All Rights Reserved. Clustering Replication Factor

    / Split •  Replication  Factor(RF)を変更更することでデータ をクラスタ間で複製することができる •  Splitを使うことでSeries内のデータを分散させる ことができる •  Write  /  Selectのスケールアウトが期待できる ここらへんの設定はShardが作られた時に決まるので後から ⾜足した場合は次のShardから有効になるはず 39
  40. Copyright © GREE, Inc. All Rights Reserved. Shards Shards type

     Shard  struct  { Id  uint32 StartTime  time.Time EndTime  time.Time ServerIds  []uint32 } Replication  Factor 例例えばClusterが2台でServerIdsが1,  2ならreplication  factorは2ってこと 40
  41. Copyright © GREE, Inc. All Rights Reserved. Replication Factor =

    2 Access Coordinator Coordinator Access Seeds Node 41
  42. Copyright © GREE, Inc. All Rights Reserved. Replication Factor =

    2 Access Coordinator Coordinator Access Seeds Node 42
  43. Copyright © GREE, Inc. All Rights Reserved. Replication Factor =

    2 Access Coordinator Coordinator Access Seeds Node 43
  44. Copyright © GREE, Inc. All Rights Reserved. Split = 2

    Access Coordinator Coordinator Access Seeds Node 44
  45. Copyright © GREE, Inc. All Rights Reserved. Split = 2

    Access Coordinator Coordinator Access Seeds Node 45
  46. Copyright © GREE, Inc. All Rights Reserved. Split = 2

    Access Coordinator Coordinator Access Seeds Node 46
  47. お分かりいただけただろうか?

  48. Query Engine

  49. Copyright © GREE, Inc. All Rights Reserved. InfluxDBは⾃自分たちでParser、Engineのメンテナンスをし ている CGo+

     flex  &  Bison SQL-‐‑‒ish  Query  Language クエリ⾔言語とエンジンを早期に実装した事によりInfluxDBの 魅⼒力力が⼀一気に⾼高まったと感じている Query  Engine オリジナルのQuery Parser / Engine 49
  50. Copyright © GREE, Inc. All Rights Reserved. Query  Engine CGO

    + flex & Bison ɾSQL-ish Query Language SQLっぽいけどSQLと期待して書くとハマるところがある select  ua,  count(ua)  from  series  group  by  ua  order  by  count   desc  limit  10 order  by句句は存在せずtimeに対してのorder句句のみ。上述のクエリは後 で説明するhaving  patchを追加することで1queryで実⾏行行可能になる select  *  from  series  where  time  >=  now()  -‐‑‒1h 時間に対しての>=,  <=は使えない 50
  51. Copyright © GREE, Inc. All Rights Reserved. Query  Engine Select

    Query Syntax SELECT COLUMN_NAMES FROM_CLAUSE GROUP_BY_CLAUSE #whereͷલͰ΋ޙΖͰ΋OK WHERE_CLAUSE LIMIT_AND_ORDER_CLAUSES INTO_CLAUSE 特徴的な部分のみ紹介 51
  52. Copyright © GREE, Inc. All Rights Reserved. FROM_CLAUSE: FROM TABLE_VALUE

    |FROM SIMPLE_TABLE_VALUES |FROM SIMPLE_TABLE_VALUE |FROM SIMPLE_TABLE_VALUE MERGE SIMPLE_TABLE_VALUE |FROM SIMPLE_TABLE_VALUE ALIAS_CLAUSE INNER JOIN SIMPLE_TABLE_VALUE ALIAS_CLAUSE TABLE_VALUE: SIMPLE_NAME_VALUE | TABLE_NAME_VALUE | REGEX_VALUE ਖ਼نදݱͰTableΛࢦఆͰ͖Δͷ͕ಛ௃త Query  Engine
  53. Copyright © GREE, Inc. All Rights Reserved. Query  Engine LIMIT_AND_ORDER_CLAUSES:

    ORDER_CLAUSE LIMIT_CLAUSE |LIMIT_CLAUSE ORDER_CLAUSE ORDER_CLAUSE: ORDER ASC # ORDER HOGE DESCͰ͸ͳ͍ |ORDER DESC LIMIT_CLAUSE: LIMIT INT_VALUE # ·ͩOffsetࢦఆ͕ग़དྷͳ͍
  54. Copyright © GREE, Inc. All Rights Reserved. Query  Engine ORDER句句はIteratorの⽅方向指定

    [1,  13934035005,  10001]  {} [1,  13934035004,  10001]  {} [1,  13934035003,  10001]  {} [1,  13934035002,  10001]  {} [1,  13934035001,  10001]  {} [1,  13934035000,  10001]  {} [2,  13934035005,  10001]  {} [2,  13934035004,  10001]  {} [2,  13934035003,  10001]  {} [2,  13934035002,  10001]  {} [2,  13934035001,  10001]  {} [2,  13934035000,  10001]  {} σϑΥϧτͰ͸ORDER DESCͱͳΔ SQLͰΑ͋͘ΔORDER BY COUNT DESC LIMIT 10͸ࢦఆग़དྷͳ͍ͷͰ ஫ҙ ORDER  ASC ORDER  DESC 54
  55. Copyright © GREE, Inc. All Rights Reserved. Query  Engine 参考情報

    ・CGoでYacc & Bison http://qiita.com/chobie@github/items/8bc8d1c7104f0a3ad3fe InfluxDBの初期のParserを切切り出した物。Cgoで遊ぶのにちょうどいい 感じのサイズ 55
  56. Copyright © GREE, Inc. All Rights Reserved. Query  Engine Query

    Pipeline Server  /  Shard Server  /  Shard Server  /  Shard Server  /  Shard Client Select  count(elapsed)  from  access  group  by  time(5m) 1)  Query 2)  Server/Shardsに対して        Query実⾏行行 3)  Compute  Locality  (shard内でAggregationする) 4)  処理理結果をStreamで返す 5)  結果を集約して返す 56
  57. Copyright © GREE, Inc. All Rights Reserved. QueryEngine Shard QueryEngine

    Shard QueryEngine Shard Query  Engine Query Pipeline Inside Coordinator PassthorughEngine QueryEngine   (Aggregation) Database Shard Select  count(elapsed)  from  access  group  by  time(5m) Shard内でGroup  Byが計算できるので 上位のPassthorughEngineにcount(elapsed)の結果を渡す 57
  58. Copyright © GREE, Inc. All Rights Reserved. Query  Engine Query

    Pipeline (no locality) Server  /  Shard Server  /  Shard Server  /  Shard Server  /  Shard Client Select  count(elapsed)  from  access  group  by  time(5m) 1)  Query 2)  Server/Shardsに対して        Query実⾏行行 3)  Streamでそのまま帰す 4)  結果を集約して返す 58
  59. Copyright © GREE, Inc. All Rights Reserved. QueryEngine Shard QueryEngine

    Shard QueryEngine Shard Query  Engine Query Pipeline Inside (no locality) Coordinator QueryEngine (Aggregation) PassthroughEngine Database Shard Select  count(elapsed)  from  access  group  by  time(5m) Shard内でGroup  Byが計算できないので結果をstreamで 返し上位のEngineでcount(elapsed)を計算する えっ、countなら(ryとかもあるけどまだEngineが最適化に対応してないと思う 59
  60. Copyright © GREE, Inc. All Rights Reserved. Query  Engine InfluxDBの特徴的なクエリシンタックス例例

    ▪stats.にマッチするseriesで 1時間前から現在までのpointsを返す SELECT   *   FROM  /^stats\./i   WHERE   time  >  now()  -‐‑‒  1h; 60
  61. Copyright © GREE, Inc. All Rights Reserved. Query  Engine InfluxDBの特徴的なクエリシンタックス例例

    ▪server.host1.cpuのseriesから1分毎で平均を算出した結果 を返す SELECT   MEAN(cpu_̲user)  as  user_̲mean FROM  server.host1.cpu  GROUP  BY  TIME(1m)  WHERE   time  >  now()  -‐‑‒  1h; 61
  62. Copyright © GREE, Inc. All Rights Reserved. Query  Engine InfluxDBの特徴的なクエリシンタックス例例

    ▪server.host1.cpuのseriesから1分毎で平均を算出した結果 を返す。値がない場合は0.0で埋める(地味に便便利利) SELECT        MEAN(cpu_̲user)  as  user_̲mean FROM  server.host1.cpu  GROUP  BY  TIME(1m)  FILL(0.0)   WHERE  time  >  now()  -‐‑‒  1h; 62
  63. Copyright © GREE, Inc. All Rights Reserved. Query  Engine その他の特徴的な機能

    Continuous Query select percentile(value, 95) from response_times group by time(5m) into response_times.percentiles.5m.95 Fanout, downsampling select max(value) from /stats\.*/ group by time(5m) into max.:series_name select  *  from  access  into  access.[action] into句句を使うこと別seriesにfanoutすることができる。 Continuous Query͸まだまだ⾊色々制限が多いが今後改善される⾒見見込み 63
  64. Write Ahead Log Database

  65. Copyright © GREE, Inc. All Rights Reserved. WriteBuffer  /  WAL

    WriteSeriesの書き込み時のパフォーマンス安定(leveldb   compactionを避ける)やReplication時の書き込みの保証とし てWritteBufferとWAL(Write  Ahead  Log)を使っている。 MySQLのInnoDBのようにDB組み込みの機能ではないので⾼高 負荷時にDBレイヤに反映されるまで時間がかかる、というこ ともある。 WALの説明はググって
  66. Copyright © GREE, Inc. All Rights Reserved. 初期はLevelDBのみだったがデータベース操作が抽象化され leveldb系(hyperleveldb, rocksdb),

    mdbがサポートさ れている Database  (AbstractionLayer) データベース操作は抽象化され、Database実装が楽になった 66
  67. Copyright © GREE, Inc. All Rights Reserved. Database  (AbstractionLayer) type

    Engine interface { Name() string Path() string Put(key, value []byte) error Get(key []byte) ([]byte, error) BatchPut(writes []Write) error Del(first, last []byte) error Iterator() Iterator Compact() Close() } type Write struct { Key []byte Value []byte }
  68. Copyright © GREE, Inc. All Rights Reserved. InfluxDBではProtocolBuffersを積極的につかっており、 データの保存時のフォーマットもProtocolBuffersを使って いる

    型表現を独⾃自に考えるのは⾯面倒だし、⾊色々つくるのも ProtocolBuffersは楽なのでうまくOSSを使えるところは 使って機能を素早く実現している Database  (Value) ProtocolBuffers 68
  69. Copyright © GREE, Inc. All Rights Reserved. Database  (Value) message

    FieldValue { optional string string_value = 1; optional double double_value = 3; optional bool bool_value = 4; optional int64 int64_value = 5; // tag 6はnullの表現用で保存しない optional bool is_null = 6; }
  70. Copyright © GREE, Inc. All Rights Reserved. ProtocolBuffers タグ, データタイプ,

    データ...という構造のバイナリフォーマット。IDL からコードを生成できるので色々楽 InfluxDBのFieldValueとして保存される場合は大抵数バイト or 文 字列+αなサイズになる
  71. Copyright © GREE, Inc. All Rights Reserved. Database Key –

    24bytes [id,  time,  sequence] ID:  8bytes  int64  identifies  database,  series,  column Time:  8bytes  uint64  microsecond  epoch Sequence:  8bytes  最初の3bytesがサーバーID 71
  72. Copyright © GREE, Inc. All Rights Reserved. Database Ordered Keys

    [1,  13934035006,  60001]  {} [1,  13934035005,  50001]  {} [1,  13934035004,  40001]  {} [1,  13934035003,  30001]  {} [1,  13934035002,  20001]  {} [1,  13934035001,  10001]  {} [2,  13934035006,  60001]  {} [2,  13934035005,  50001]  {} [2,  13934035004,  40001]  {} [2,  13934035003,  30001]  {} [2,  13934035002,  20001]  {} [2,  13934035001,  10001]  {} [3,  13934035006,  60001]  {} [3,  13934035005,  50001]  {} [3,  13934035004,  40001]  {} [3,  13934035003,  30001]  {} [3,  13934035002,  20001]  {} [3,  13934035001,  10001]  {} 例例えばaccess  seriesのua(1),   elapsed(2),  url(3)という3カラムが あった場合はそれぞれが左記のよう なsort済みの状態で保存されている 72
  73. Copyright © GREE, Inc. All Rights Reserved. Database  (Pointの拾拾い⽅方) Select

    ua, elapsed, url from events where time > now() -1h [1,  13934035000,  10001]  {} [1,  13934035001,  10001]  {} [1,  13934035002,  10001]  {} [1,  13934035003,  10001]  {} [1,  13934035004,  10001]  {} [1,  13934035005,  10001]  {} [2,  13934035001,  10001]  {} [2,  13934035002,  10001]  {} [2,  13934035003,  10001]  {} [2,  13934035004,  10001]  {} [2,  13934035005,  10001]  {} [2,  13934035006,  10001]  {} [3,  13934035001,  10001]  {} [3,  13934035002,  10001]  {} [3,  13934035003,  10001]  {} [3,  13934035004,  10001]  {} [3,  13934035005,  10001]  {} [3,  13934035006,  10001]  {} Shard Query   Engine DB Iterator
  74. Copyright © GREE, Inc. All Rights Reserved. Database  (Pointの拾拾い⽅方) Select

    ua, elapsed, url from events where time > now() -1h FieldValue Point(s) 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} 001]  {} Query  Engine API Client Iteratorで各FieldValueを集め、PointにまとめてEngineに渡す
  75. 開発関連情報

  76. Copyright © GREE, Inc. All Rights Reserved. 情報取得元 •  Speaker

    Deck: Paul Dix https://speakerdeck.com/pauldix とりあえずここらへん見よう •  InfluxDB Group (ML) https://groups.google.com/forum/#!forum/influxdb •  Github Issues https://github.com/influxdb/influxdb/issues •  IRC #influxdb ad freenode Discussionをする場所としてはInfluxDB Groupが適切。 新機能の提案や質問はMLでやりましょう
  77. Copyright © GREE, Inc. All Rights Reserved. OSXでの開発環境セットアップ brew install

    protobuf bison flex leveldb go hg bzr git clone https://github.com/influxdb/influxdb cd influxdb export GOPATH=`pwd` # assume your flex and bison version. ./configure --with-flex=/usr/local/Cellar/flex/2.5.37/ bin/flex --with-bison=/usr/local/Cellar/bison/3.0.2/ bin/bison && make build sed -i ‘s/log/stdout/’ config.sample.toml ./daemon -config=config.sample.toml # Testing make test, make test <component>
  78. Copyright © GREE, Inc. All Rights Reserved. ディレクトリ構成 admin  -‐‑‒>

     admin  ui api  -‐‑‒>  coordinatorのコマンド実⾏行行するラッパ cluster  -‐‑‒>  coordinatorから参照する設定とか configuration  -‐‑‒>  config coordinator  -‐‑‒>  coordination関連 daemon  -‐‑‒>  influxdbのエントリポイント datastore  -‐‑‒>  shards,  database engine  -‐‑‒>  query  engine integraton  -‐‑‒>  結合テスト parser  -‐‑‒>  parser protocol  -‐‑‒>  protobufのproto定義 server  -‐‑‒>  api,  coordinatorなどのまとめ wal  -‐‑‒>  wal
  79. Copyright © GREE, Inc. All Rights Reserved. データディレクトリ構成 ├──  db

    │      └──  shard_̲db ├──  raft │      ├──  conf │      ├──  log │      └──  name └──  wal        ├──  bookmark        ├──  index.100002        └──  log.100002 walぶっ壊した時はwalディレクトリの中⾝身消したりすれば (復復旧前のデータは消えるけど)動かせるようになってる。
  80. Copyright © GREE, Inc. All Rights Reserved. 開発時に遭遇した問題 •  Why

     the  memory  is  not  free  by  GC? https://groups.google.com/forum/#!topic/golang-‐‑‒nuts/vfmd6zaRQVs どうやらOSXで動かしてるとメモリキープしたまんまで減りづらいらしい? linuxだと問題ない •  ulimitにひっかかる sudo  ulimit  -‐‑‒n  4098 InfluxDBの使い⽅方だとleveldbが結構file  descriptorを開くので仕様 •  時まえでAdmin  Interface  not  found. ⾃自前でbuildするとAdminInterfaceがないために管理理画⾯面が表⽰示できないこ ともある。release版のadminディレクトリを拾拾ってセットするのがお⼿手軽。 ⾯面倒なのでその場限りの操作は⼤大抵curlでやってる Patchをあてて運⽤用しているので⾃自分でやらかした問題のほうが多い
  81. Copyright © GREE, Inc. All Rights Reserved. 初めてのGo 他の⾔言語やってればだいたいこんな感じでやれば2〜~3週間でなんとなくやりたい ことはできるようになると思います

    •  A  tour  of  Goをひと通りやる(数時間?⼟土⽇日でがっとやっちゃうのが吉) •  http://tour.golang.org/ •  難しいのは⾶飛ばしちゃっていいから最後までやろう。 •  15分ぐらいで終わる写経⽤用のプログラムを⽤用意して毎⽇日続ける •  ⾃自分はKobitoに20⾏行行前後で動くプログラムを数⼗十個メモして毎⽇日写経してた •  例例えば: WebServerを動かす、JsonをDecodeする、XMLをDecodeする、TCPでやりとりする、とか https://github.com/golang-‐‑‒samples  とかQiitaのGoタグを⾒見見てみるのもいいかもしれない GolangはLL的なイメージが⾃自分にとってはなぜか強かったので最初struct定義とか⼾戸惑ったけど ちょっと楽なCと思い始めてからは結構すんなり学習できた •  その問題が解決されないと⾃自分が困るプロジェクトのIssuesを直してみる •  ⾃自分で1から設計して⼩小規模な問題を解決するプログラムを書いてみる •  ⾃自分はWALのファイル書き込み処理理をgoで書くには?というのをやってた •  ドキュメントを全部読む ⾃自分のメモを⾒見見返す限りだとGo書き始めたの5/1ぐらいだった。 InfluxDBにPR送ったのが5/18ぐらいだからやっぱ⽚片⼿手間だとそんぐらいかかる。
  82. InfluxDB for internal tools

  83. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools Applicationのパフォーマンスデータ                           収集してますか?
  84. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools Applicationのパフォーマンスデータ                           収集してますか? •  GREEのインフラチームではサーバーやアプリケーション にまつわるMetricsを多数収集しています。 •  私の場合はPHP coreが専⾨門なのでPHP周りで運⽤用を楽をす るためにextensionを書いて⾊色々な情報を収集しています
  85. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools パフォーマンスデータを集めるとこんな事ができる •  統計をとって糞コードが本番に出る前に叩き落落とせる 実⾏行行Opcode数,外部Middlewareへのクエリ回数、時間等が詳細に取れる •  糞クエリを開発環境で叩き落落とせる 実際に流流れるクエリや実⾏行行場所がとれるので判断が楽 Rの⾃自動レビューも考えたけど動的クエリに弱いし何よりparseが⾯面倒 •  重複クエリ等の⾃自動検出 ⼤大規模サービスでは地味に効いたりする •  サービス毎のApplication特性の⽐比較や⾼高速化のテクニック •  定量量的な数値ででるのでノウハウを共有し易易くなった •  性能劣劣化原因の調査でも切切り分けの判断が容易易になった •  コード上では複雑な変更更だったとしても統計データから判断できる
  86. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools パフォーマンスデータを集めるとこんな事ができる •  統計をとって糞コードが本番に出る前に叩き落落とせる 実⾏行行Opcode数,外部Middlewareへのクエリ回数、時間等が詳細に取れる •  糞クエリを開発環境で叩き落落とせる 実際に流流れるクエリや実⾏行行場所がとれるので判断が楽 Rの⾃自動レビューも考えたけど動的クエリに弱いし何よりparseが⾯面倒 •  重複クエリ等の⾃自動検出 ⼤大規模サービスでは地味に効いたりする •  サービス毎のApplication特性の⽐比較や⾼高速化のテクニック •  定量量的な数値ででるのでノウハウを共有し易易くなった •  性能劣劣化原因の調査でも切切り分けの判断が容易易になった •  コード上では複雑な変更更だったとしても統計データから判断できる
  87. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools パフォーマンスデータを集めるとこんな事ができる •  統計をとって糞コードが本番に出る前に叩き落落とせる 実⾏行行Opcode数,外部Middlewareへのクエリ回数、時間等が詳細に取れる •  糞クエリを開発環境で叩き落落とせる 実際に流流れるクエリや実⾏行行場所がとれるので判断が楽 ⾃自動レビューも考えたけど動的クエリに弱いし何よりparseが⾯面倒 •  重複クエリ等の⾃自動検出 ⼤大規模サービスでは地味に効いたりする •  サービス毎のApplication特性の⽐比較や⾼高速化のテクニック •  定量量的な数値ででるのでノウハウを共有し易易くなった •  性能劣劣化原因の調査でも切切り分けの判断が容易易になった •  コード上では複雑な変更更だったとしても統計データから判断できる
  88. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools パフォーマンスデータを集めるとこんな事ができる •  統計をとって糞コードが本番に出る前に叩き落落とせる 実⾏行行Opcode数,外部Middlewareへのクエリ回数、時間等が詳細に取れる •  糞クエリを開発環境で叩き落落とせる 実際に流流れるクエリや実⾏行行場所がとれるので判断が楽 ⾃自動レビューも考えたけど動的クエリに弱いし何よりparseが⾯面倒 •  重複クエリ等の⾃自動検出 ⼤大規模サービスでは地味に効いたりする •  サービス毎のApplication特性の⽐比較や⾼高速化のテクニック 定量量的な数値ででるのでノウハウを共有し易易くなった •  性能劣劣化原因の調査でも切切り分けの判断が容易易になった •  コード上では複雑な変更更だったとしても統計データから判断できる
  89. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools パフォーマンスデータを集めるとこんな事ができる •  統計をとって糞コードが本番に出る前に叩き落落とせる 実⾏行行Opcode数,外部Middlewareへのクエリ回数、時間等が詳細に取れる •  糞クエリを開発環境で叩き落落とせる 実際に流流れるクエリや実⾏行行場所がとれるので判断が楽 ⾃自動レビューも考えたけど動的クエリに弱いし何よりparseが⾯面倒 •  重複クエリ等の⾃自動検出 ⼤大規模サービスでは地味に効いたりする •  サービス毎のApplication特性の⽐比較や⾼高速化のテクニック 定量量的な数値ででるのでノウハウを共有し易易くなった •  性能劣劣化原因の調査でも切切り分けの判断が容易易になった •  コード上では複雑な変更更だったとしても統計データから判断できる
  90. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools パフォーマンスデータを集めるとこんな事ができる •  統計をとって糞コードが本番に出る前に叩き落落とせる 実⾏行行Opcode数,外部Middlewareへのクエリ回数、時間等が詳細に取れる •  糞クエリを開発環境で叩き落落とせる 実際に流流れるクエリや実⾏行行場所がとれるので判断が楽 ⾃自動レビューも考えたけど動的クエリに弱いし何よりparseが⾯面倒 •  重複クエリ等の⾃自動検出 ⼤大規模サービスでは地味に効いたりする •  サービス毎のApplication特性の⽐比較や⾼高速化のテクニック 定量量的な数値ででるのでノウハウを共有し易易くなった •  性能劣劣化原因の調査でも切切り分けの判断が容易易になった コード上では複雑な変更更だったとしても統計データから判断できる
  91. Copyright © GREE, Inc. All Rights Reserved. Architecture Overview with

     custom  profiler  extension Protocol Buffers Go nvd3.js snappy send  profile  data  (ProtocolBuffers)
  92. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools
  93. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools nvd3.jsでplot
  94. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools nvd3.jsでplot InfluxDBで時系列列データ に対しての⾼高速なフィルタリング
  95. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools nvd3.jsでplot InfluxDBで時系列列データ に対しての⾼高速なフィルタリング Continuous  Queryで統 計情報の継続的な更更新
  96. Copyright © GREE, Inc. All Rights Reserved. my_bool percentile_init(UDF_INIT *initid,

    UDF_ARGS *args, char *message) { percentile_data *data; double score; ///... percentile等の計算をSQLでやるのは⾯面倒なのでUDF書いてた InfluxDB for internal tools 開発初期〜~中期はデータストアにMySQLを利利⽤用 これはこれで上⼿手く回ってたけど 96
  97. Copyright © GREE, Inc. All Rights Reserved. 運⽤用の為にTableのShardをさせると今度度はUDFでの計算がしづらくなって Application側のコードが複雑になってしまう。 データの保持やダウンサンプリングなども考慮するとアプリケーション

    が膨らむしメンテ出来る⼈人が減るのでそういう選択はしたくなかった。 InfluxDB for internal tools ダウンサンプリングとか運⽤用周りがとても⾯面倒 Sharded  Tables Application側でShardを頑張るとShardを跨いだ計算が複雑になる 可能な限りはStorageへの薄いラッパで運⽤用できるのが好ましかった 97
  98. Copyright © GREE, Inc. All Rights Reserved. 要件 •  時系列列データの⾼高速なSelectができる

    •  Analytics系のクエリを気軽に投げられる •  ⼀一般的なハードウェアで運⽤用ができる 欲しかったデータベース Hadoopクラスタを運⽤用したりTDを使っているのでそっちに投げても良良 かったけどPerformance  Data⾃自体サイズが⼤大きいし、⼤大規模なクラスタ で運⽤用するのはちょっと⼤大げさすぎるので丁度度いいデータベースが欲し かった
  99. Copyright © GREE, Inc. All Rights Reserved. InfluxDB First impression

    InfluxDBが話題に上がってたので評価したけど⾊色々出来ない事 が多くて調査当時は使わなかった。 特にAnalytics周りの機能が弱く実現が難しいクエリが多かった
  100. Copyright © GREE, Inc. All Rights Reserved. InfluxDB First impression

    InfluxDBが話題に上がってたので評価したけど⾊色々出来ない事 が多くて調査当時は使わなかった。 特にAnalytics周りの機能が弱く実現が難しいクエリが多かった 時は過ぎ、ゴールデンウィークやることがなかったのでGo⼒力力 を⾼高めてたら意外ととやりたい事が少しの努⼒力力で実現できそう に感じたのでContributionを個⼈人で始めてInfluxDBに Top/Bottom aggregation patchを送った。
  101. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools Having clauseの対応等いくつかPRやpatchを作って⾃自分の ニーズが満たせるようになったのでMySQLからInfluxDBに 切切り替えて開発環境で運⽤用し始めた。 Application側のAggregator系のコードやPlot系のコードが InfluxDBのクエリで殆ど済むようになり、統計処理理も殆ど ContinuousQueryで事前にInfluxDB側で計算できるように なったので⼤大幅にコードを書く量量が減ったのが⼀一番嬉しい
  102. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools InfluxDBの導⼊入ポイント ✓時系列列データを扱うこと ✓InfluxDBの機能によるコード量量削減が期待できる事 ✓クエリだけでやりたい事がある程度度実現できる事 が重要 ✓規模的にマッチしていること ✓⼩小〜~中規模なら導⼊入は難しくない。⼤大規模だと事 例例が少なく運⽤用載せるのはそれなりに⼤大変だと思う。 102
  103. Copyright © GREE, Inc. All Rights Reserved. InfluxDB for internal

    tools InfluxDBによる開発⼯工数の削減が期待できるポイント •  アプリ側でクエリ結果を頑張って計算しなくて良良い •  QueryEngineに殆ど任せられるのは⼤大分楽 (対RDBMS的に。Shardさせるとけっこー⾯面倒) •  統計系のcron jobがContinuous Queryで代替できる •  複数ホストをサポートしてると結構⾯面倒だったりする •  スキーマレスなので型、Index設計の⼿手間が省省ける •  とはいえどういうseries、pointを持つかは重要 情熱ある⼈人いないと運⽤用⾟辛いけど。 103
  104. Copyright © GREE, Inc. All Rights Reserved. Issues スキーマレスによる弊害(PHP) InfluxDBに格納されるデータはスキーマレスで基本は送信し

    た値そのままで保存される。 PHPのように数値と⽂文字列列が曖昧な環境の場合だと数値のつも りで送ったけど実は⽂文字列列で送ってた、とかありがちなので⽂文 字列列と数値の⽐比較演算でヒットしない場合が出てくる。 PHPの場合Client側できちんと型を強制して送信するのが重要 ⾃自分のTODOには⼊入ってるのでいつかPRを送るかもしれない 104
  105. Copyright © GREE, Inc. All Rights Reserved. Issues Statistic API

    monitoringしたいけど内部のApplication情報がExportされ てない。ベンチマークもふんわりしたものが多いのでもっと詳 細な内部の傾向が知りたい。 PR送ったけどかなりダサダサなハードコーディングになって しまっているので、Goでモニタリング⽤用のコードを埋め込む ナイスな⽅方法があったら知りたい (Goのこういう運⽤用周りのテクニックあんまりでないよねー) https://github.com/influxdb/influxdb/pull/635 105
  106. Copyright © GREE, Inc. All Rights Reserved. Issues Statistic apiを使ったInfluxDB

     モニタリング 106
  107. Copyright © GREE, Inc. All Rights Reserved. Issues having clause

    patch Analytics系のクエリをInfluxDBでやるときhaving系がな かったので⾟辛かった https://github.com/influxdb/influxdb/pull/611 このpatchによりhaving clauseが実⾏行行できるので select action, mean(elapsed) mean_elapsed from access where time > now() -7h group by time(1m) having top(mean_elapsed, 10) みたいなサマリ系のクエリが簡単にできるようになった 多分近いうちにmergeされると思う 107
  108. Copyright © GREE, Inc. All Rights Reserved. Issues バイナリデータが保存できない message

    FieldValue { optional string string_value = 1; optional double double_value = 3; optional bool bool_value = 4; optional int64 int64_value = 5; optional bool is_null = 6; optional bytes bytes_value = 7; // ADDED } ProtocolBuffersを多様していたのでそのままRawデータを保存したかったが http  json  apiだとバイナリデータが扱えないしそもそもFieldValueにbytesが ない TimeSeriesDBにバイナリってどうよ?ってのもありつつ、さくっとbytes_̲value を追加したところ動いたので万事オッケー。QueryEngineなどのことも考えると もっと対応が必要だけどいまん所そこまでやりこんでない。 https://github.com/influxdb/influxdb/issues/573 108
  109. Copyright © GREE, Inc. All Rights Reserved. Issues Experimental TCP

    Protobuf Plugin Half Duplex, Protobuf protocol HTTP APIと⽐比較してNetworkTraffic、messageやりとりの 削減によるパフォーマンス向上、拡張しやすいメッセージ⼿手 続き、Binaryデータのサポート、クライアントライブラリの 簡単な作成を⽬目的としている。 うちではこれで運⽤用してるけどPRとしてはまだ完成できてな いのでなうでがんばってるところ。 https://github.com/influxdb/influxdb/pull/583 109
  110. Copyright © GREE, Inc. All Rights Reserved. Issues バイナリサポートによる弊害 でかいPointsがあるとQueryが遅くなる

    当然1PointsのFieldValueがでかくなってIOコストが増⼤大してクエリが効 率率率的に実⾏行行できなくなった。 TimeIndexを使わない場合はshard期間内のデータを全て捜査する必要が あるため、出来る限りTimeIndexを使うようなクエリ、設計にしたほうが いい。 shard期間内にどれぐらいのデータが⼊入るか事前に計算するのはとても重 要。1台で捌き切切れないならseriesを分ける、splitで分ける等やっていく 必要がある そのうちIDに対してのデータを取るGETSERIES APIを⼊入れる予定 110
  111. Copyright © GREE, Inc. All Rights Reserved. Issues 過剰なInsertでWAL性能劣劣化  (benchmark)

    ベンチマークやってるとinsert等でburstさせるとWALの処理理が遅くなる のがわかっている。今なおしてるみたいだし、そもそもburstさせなきゃい いんで前段にProxyかますかInsertのQueue/Consumer作って⼿手加減して 送るようにすればだいたい解決されると思う。 RDBMSにしろ過剰なトラフィックをながすとそりゃダメになるんで⾃自分 たちのハードウェアをつかってきちんと評価、キャパシティプランニング するの⼤大事 111
  112. Copyright © GREE, Inc. All Rights Reserved. Issues アクセス集中でGoroutineがBurst(benchmark) 秒間のコネクション、クエリ数が増加すると当然goroutinesの数が跳ね上

    がる。 goroutinesの数が数百、数千単位で跳ね上がると処理理が遅くなってしまう ので、安定性を⾼高めるためにMaxConnectionsの制限やGoroutines Pool とかそういうのが今後の運⽤用では必要になってくるんだと思う。 今のところハードコーディングでConnection数を制限してる 112
  113. Copyright © GREE, Inc. All Rights Reserved. 本運⽤用に向けてのIssues •  Backup

    tool •  公式にはまだないけどleveldbもraftもわかるし 別にそんなに問題になってない •  Replication topology •  どういう運⽤用にしようか情報がまだ少ないので悩み中 •  障害対応時の⼿手順 •  おなじく •  Proxy •  あると便便利利なのでどっかで作って⼊入れたい
  114. Copyright © GREE, Inc. All Rights Reserved. 本運⽤用に向けてのIssues •  Packaging

    http://qiita.com/chobie@github/items/ ff5a08587c8635fbf95d パッケージングはここにメモしてある。独⾃自のpatchを当てて る関係上本家のリリース版は使ってない。 インストール場所等も普通のスタイルにしてる。 適当にパッケージ作るときfpmは便便利利
  115. Copyright © GREE, Inc. All Rights Reserved. その他InfluxDBのアイデア •  InfluxDB

    x Chat Application •  ほ、ほら・・・。ある種Time Seriesだし •  もしWebSocketでPubSubとかついたら単体でチャッ トが作れる •  Triggerとかが⾃自由につくれると⾯面⽩白いのかもしれない •  アホな使い⽅方すると潜在的な問題探しやすい •  ⼩小〜~中規模なAnalytics Tool •  Health Application •  移動平均(sma)とかの関数対応が欲しい •  異異常検知 •  これまたWriteSeriesのTriggerとかhookがほしい
  116. Copyright © GREE, Inc. All Rights Reserved. ⾃自分たちでカスタマイズしながら歩めるならとても魅⼒力力的。 アイデアをパッとGo実現できるのはエキサイティング とはいえ⾃自分たちで運⽤用したくない、という場合はHosting

    Service等もあるのでそっちを使うのもありかもしれない。 https://customers.influxdb.com/ ぜひみなさまのContributionおまちしております! まとめ InfluxDBはカスタマイズ性が⾼高いMiddleware 116
  117. Happy Hacking

  118. そのほか

  119. Copyright © GREE, Inc. All Rights Reserved. こんごへの淡い期待 Couchbase  Server(Membase)はBucketのNode感でのMigration問題に

    VBucketというアイデアを使ってオンラインでデータを移設できたりした。 恐らく今後InfluxDBにもこういった機能が⼊入って⾃自由にClusterを組んだ り外せたりするようになるんだろうなーという淡い期待。 http://blog.couchbase.com/scaling-memcached-vbuckets InfluxDBのクラスタリングでのデータ保持がどういうポリシーになって いくかはまだわからない