Upgrade to Pro — share decks privately, control downloads, hide ads and more …

InfluxDB - Time-series database pra valer

InfluxDB - Time-series database pra valer

Marco Antônio Singer

September 23, 2016
Tweet

More Decks by Marco Antônio Singer

Other Decks in Technology

Transcript

  1. Agenda Go além de command line e API O que

    é um time­series database? Outras opções / Benchmark Instalação Conceitos do InfluxDB Manipulando os dados Indo além Nem tudo é perfeito
  2. Go além de command line e API Awesome Go (https://github.com/avelino/awesome­go)

    Bolt CockroachDB Drone Mattermost Web Frameworks Bioinformática
  3. O que é um time­series database? Time­series é uma sequência

    de observações iguais, medidas com base em tempo. Em outras palavras, se você colocar seus dados em um gráfico, um eixo sempre será de tempo. TSDB são bancos de dados otimizados para escrita, leitura e processamento de time­series data. Acessos a um serviço / app Sensores ( IoT ) Dados de rede Bolsa de valores ( stocks )
  4. Instalação Mac brew install influxdb Docker docker pull influxdb Ubuntu

    / Debian RedHat / CentOS Binários ( Windows / Linux 32­64 bits )
  5. Primeiros Passos Iniciando o serviço: i n f l u

    x d s e r v i c e i n f l u x d b s t a r t
  6. Iniciando CLI: $ i n f l u x C

    o n n e c t e d t o h t t p : / / l o c a l h o s t : 8 0 8 6 v e r s i o n 1 . 0 . x I n f l u x D B s h e l l 1 . 0 . x > Criando database: > C R E A T E D A T A B A S E s t o c k >
  7. Conceitos do InfluxDB Points Measurement ( "Tabela" ) Tags (

    "Colunas" c/ índice ) Fields ( "Coluna" s/ índice ) { m e a s u r e m e n t } [ , { t a g ­ k e y } = { t a g ­ v a l u e } . . . ] [ , { f i e l d ­ k e y } = { f i e l d ­ v a l u e } . . . ] { u n i x ­ n a n o ­ t i m e s t a m p } s t o c k , s y m b o l = I T U B 4 b i d = 3 5 . 3 5 , a s k = 3 5 . 3 7 e v e n t s u s e r _ i d = " a 1 b 2 c 3 " , i m p r e s s i o n = 1 , c l i c k = 1 1 4 6 5 8 3 9 8 3 0 1 0 0 4 0 0 2 0 0 # 1 3 / 0 6 / 2 0 1 6 1 7 : 4 3 : 5 0 U T C
  8. Manipulando os dados Inserindo métricas: > U S E s

    t o c k U s i n g d a t a b a s e s t o c k > I N S E R T s t o c k , s y m b o l = I T U B 4 b i d = 3 5 . 3 5 , a s k = 3 5 . 3 7 > Query simples: > S E L E C T * F R O M s t o c k n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e a s k b i d s y m b o l 1 4 7 4 5 4 3 9 9 2 3 7 0 9 5 4 0 9 2 3 5 . 3 7 3 5 . 3 5 I T U B 4
  9. Mudando a unidade de tempo ( default nanosegundos ): >

    p r e c i s i o n r f c 3 3 3 9 > S E L E C T * F R O M s t o c k n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e a s k b i d s y m b o l 2 0 1 6 ­ 0 9 ­ 2 2 T 1 1 : 3 3 : 1 2 . 3 7 0 9 5 4 0 9 2 Z 3 5 . 3 7 3 5 . 3 5 I T U B 4
  10. Analizando keys: > S H O W T A G

    K E Y S F R O M s t o c k n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t a g K e y s y m b o l > S H O W F I E L D K E Y S F R O M s t o c k n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ f i e l d K e y f i e l d T y p e a s k f l o a t b i d f l o a t
  11. Voltando um pouco > I N S E R T

    e v e n t s u s e r _ i d = " a 1 b 2 c 3 " , i m p r e s s i o n = 1 , c l i c k = 1 1 4 6 5 8 3 9 8 3 0 1 0 0 4 0 0 2 0 0 > S E L E C T * F R O M e v e n t s n a m e : e v e n t s ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e c l i c k i m p r e s s i o n u s e r _ i d 2 0 1 6 ­ 0 6 ­ 1 3 T 1 7 : 4 3 : 5 0 . 1 0 0 4 0 0 2 Z 1 1 a 1 b 2 c 3 > S H O W T A G K E Y S F R O M e v e n t s > S H O W F I E L D K E Y S F R O M e v e n t s n a m e : e v e n t s ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ f i e l d K e y f i e l d T y p e c l i c k f l o a t i m p r e s s i o n f l o a t u s e r _ i d s t r i n g
  12. Não é possível modificar o tipo dos fields > I

    N S E R T s t o c k , s y m b o l = V A L E 5 b i d = 2 0 . 1 , a s k = T r u e E R R : { " e r r o r " : " f i e l d t y p e c o n f l i c t : i n p u t f i e l d \ " a s k \ " o n m e a s u r e m e n t \ " s t o c k \ " i s t y p e b o o l , a l r e a d y e x i s t s a s t y p e f l o a t " }
  13. Mas é permitido inserir novos > I N S E

    R T s t o c k , s y m b o l = V A L E 5 b i d = 2 0 . 1 , a s k = 2 2 , a c t i v e = T r u e > S E L E C T * F R O M s t o c k n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e a c t i v e a s k b i d s y m b o l 2 0 1 6 ­ 0 9 ­ 2 2 T 1 1 : 3 3 : 1 2 . 3 7 0 9 5 4 0 9 2 Z 3 5 . 3 7 3 5 . 3 5 I T U B 4 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 2 0 : 5 5 . 8 9 6 8 0 6 7 1 9 Z t r u e 2 2 2 0 . 1 V A L E 5 >
  14. Syntax dos booleans true, True, TRUE, t, T false, False,

    FALSE, f, F Sendo que t, T, f, T não são aceitos no SELECT
  15. Filtrando por tags: > S E L E C T

    * F R O M s t o c k W H E R E s y m b o l = ' I T U B 4 ' n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e a c t i v e a s k b i d s y m b o l 2 0 1 6 ­ 0 9 ­ 2 2 T 1 1 : 3 3 : 1 2 . 3 7 0 9 5 4 0 9 2 Z 3 5 . 3 7 3 5 . 3 5 I T U B 4 Filtrando por timestamp: > S E L E C T * F R O M s t o c k W H E R E t i m e < n o w ( ) ­ 5 h n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e a c t i v e a s k b i d s y m b o l 2 0 1 6 ­ 0 9 ­ 2 2 T 1 1 : 3 3 : 1 2 . 3 7 0 9 5 4 0 9 2 Z 3 5 . 3 7 3 5 . 3 5 I T U B 4 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 2 0 : 5 5 . 8 9 6 8 0 6 7 1 9 Z t r u e 2 2 2 0 . 1 V A L E 5
  16. Filtrando por timestamp (string): > S E L E C

    T * F R O M s t o c k W H E R E t i m e > ' 2 0 1 6 ­ 0 9 ­ 2 2 1 1 : 3 0 : 0 0 ' A N D t i m e < ' 2 0 1 6 ­ 0 9 ­ 2 2 1 2 : 3 0 : 0 0 ' n a m e : s t o c k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ t i m e a c t i v e a s k b i d s y m b o l 2 0 1 6 ­ 0 9 ­ 2 2 T 1 1 : 3 3 : 1 2 . 3 7 0 9 5 4 0 9 2 Z 3 5 . 3 7 3 5 . 3 5 I T U B 4 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 2 0 : 5 5 . 8 9 6 8 0 6 7 1 9 Z t r u e 2 2 2 0 . 1 V A L E 5
  17. Group By > S E L E C T m

    e a n ( b i d ) a s m e a n _ b i d s , m e a n ( a s k ) a s m e a n _ a s k F R O M s t o c k W H E R E t i m e > n o w ( ) ­ 1 d G R O U P B Y s y m b o l n a m e : s t o c k t a g s : s y m b o l = I T U B 4 t i m e m e a n _ b i d s m e a n _ a s k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 2 0 1 6 ­ 0 9 ­ 2 1 T 1 8 : 2 2 : 0 1 . 9 7 5 7 6 0 4 9 4 Z 3 2 . 2 8 3 3 3 3 3 3 3 3 3 3 3 3 3 3 . 2 5 6 6 6 6 6 6 6 6 6 6 6 7 n a m e : s t o c k t a g s : s y m b o l = V A L E 5 t i m e m e a n _ b i d s m e a n _ a s k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 2 0 1 6 ­ 0 9 ­ 2 1 T 1 8 : 2 2 : 0 1 . 9 7 5 7 6 0 4 9 4 Z 2 1 . 2 2 3 . 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6
  18. Group By time > S E L E C T

    m e a n ( b i d ) a s m e a n _ b i d s , m e a n ( a s k ) a s m e a n _ a s k F R O M s t o c k W H E R E t i m e > n o w ( ) ­ 1 d G R O U P B Y s y m b o l , t i m e ( 1 2 h ) t a g s : s y m b o l = I T U B 4 t i m e m e a n _ b i d s m e a n _ a s k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 2 0 1 6 ­ 0 9 ­ 2 1 T 1 2 : 0 0 : 0 0 Z 2 0 1 6 ­ 0 9 ­ 2 2 T 0 0 : 0 0 : 0 0 Z 3 5 . 3 5 3 5 . 3 7 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 0 0 : 0 0 Z 3 0 . 7 5 3 2 . 2 n a m e : s t o c k t a g s : s y m b o l = V A L E 5 t i m e m e a n _ b i d s m e a n _ a s k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 2 0 1 6 ­ 0 9 ­ 2 1 T 1 2 : 0 0 : 0 0 Z 2 0 1 6 ­ 0 9 ­ 2 2 T 0 0 : 0 0 : 0 0 Z 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 0 0 : 0 0 Z 2 1 . 2 2 3 . 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6
  19. Group By time ­ fill > S E L E

    C T m e a n ( b i d ) a s m e a n _ b i d s , m e a n ( a s k ) a s m e a n _ a s k F R O M s t o c k W H E R E t i m e > n o w ( ) ­ 1 d G R O U P B Y s y m b o l , t i m e ( 1 2 h ) f i l l ( 0 ) t a g s : s y m b o l = I T U B 4 t i m e m e a n _ b i d s m e a n _ a s k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 2 0 1 6 ­ 0 9 ­ 2 1 T 1 2 : 0 0 : 0 0 Z 0 0 2 0 1 6 ­ 0 9 ­ 2 2 T 0 0 : 0 0 : 0 0 Z 3 5 . 3 5 3 5 . 3 7 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 0 0 : 0 0 Z 3 0 . 7 5 3 2 . 2 n a m e : s t o c k t a g s : s y m b o l = V A L E 5 t i m e m e a n _ b i d s m e a n _ a s k ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 2 0 1 6 ­ 0 9 ­ 2 1 T 1 2 : 0 0 : 0 0 Z 0 0 2 0 1 6 ­ 0 9 ­ 2 2 T 0 0 : 0 0 : 0 0 Z 0 0 2 0 1 6 ­ 0 9 ­ 2 2 T 1 2 : 0 0 : 0 0 Z 2 1 . 2 2 3 . 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6
  20. Continuous Query C R E A T E C O

    N T I N U O U S Q U E R Y " c q _ m e a n _ s t o c k _ 1 2 h " O N " s t o c k " B E G I N S E L E C T m e a n ( b i d ) a s m e a n _ b i d s , m e a n ( a s k ) a s m e a n _ a s k I N T O " m e a n _ s t o c k " F R O M s t o c k W H E R E t i m e > n o w ( ) ­ 1 d G R O U P B Y s y m b o l , t i m e ( 1 2 h ) f i l l ( 0 ) E N D
  21. Indo além REST API Retention Policy Management Downsampling and Data

    Retention Influx Admin ( http://localhost:8083 ) Grafana Influx Stress
  22. Nem tudo é perfeito Ingestão por Line Protocol Não funciona

    bem com dados com alta cardinalidade Escrever dados com timestamp randômico não é performático Clustering só na versão Enterprise
  23. Referências Benchmark Code (https://github.com/influxdata/influxdb­comparisons) Grafana (http://grafana.org) InfluxDB 1.0 Docs (https://docs.influxdata.com/influxdb/v1.0/)

    Hardware Sizing (https://docs.influxdata.com/influxdb/v1.0/guides/hardware_sizing) Meetup Golang Brasil (https://www.meetup.com/golangbr/) GopherCon Brasil (https://2016.gopherconbr.org) Slack Invite Gophers (https://invite.slack.golangbridge.org)
  24. Thank you Marco Singer Senior Software Enginner, Codeminer42 [email protected] (mailto:[email protected])

    http://github.com/marcosinger (http://github.com/marcosinger) @mahsinger (http://twitter.com/mahsinger)