通过命令行工具 influx 完成数据库的创建和读写练习

入门指南

这部分内容主要通过 influx (CLI) 工具操作 influxdb 数据库,即:创建数据库和读写数据。

说明:也可以直接发送裸的HTTP请求来操作数据库,例如 curl

通过这些操作,先简单熟悉一下 influxdb 相关内容,然后带着这些初步认识,再去学习其概念等知识

创建数据库

  • influx 命令连接到 influxd 服务,进入交互式 shell:

    1
    2
    3
    4
    
    $ influx 
    Connected to http://localhost:8086 version 1.7.0~n201807280800
    InfluxDB shell version: 1.7.0~n201807280800
    > 

    Note: InfluxDB 的 HTTP 接口默认起在 8086 上,所以 inlux 默认也是连的本地的 8086 端口,你可以通过 influx –help 来看怎么修改默认值。

  • 查看 influx 交互式 shell 下的命令列表

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    > help
    Usage:
        connect <host:port>   connects to another node specified by host:port
        auth                  prompts for username and password
        pretty                toggles pretty print for the json format
        chunked               turns on chunked responses from server
        chunk size <size>     sets the size of the chunked responses.  Set to 0 to reset to the default chunked size
        use <db_name>         sets current database
        format <format>       specifies the format of the server responses: json, csv, or column
        precision <format>    specifies the format of the timestamp: rfc3339, h, m, s, ms, u or ns
        consistency <level>   sets write consistency level: any, one, quorum, or all
        history               displays command history
        settings              outputs the current settings for the shell
        clear                 clears settings such as database or retention policy.  run 'clear' for help
        exit/quit/ctrl+d      quits the influx shell
    
        show databases        show database names
        show series           show series information
        show measurements     show measurement information
        show tag keys         show tag key information
        show field keys       show field key information
    
        A full list of influxql commands can be found at:
        https://docs.influxdata.com/influxdb/latest/query_language/spec/
  • 创建数据库:mydb

    1
    2
    3
    4
    5
    6
    7
    
    > CREATE DATABASE mydb
    > show databases
    name: databases
    name
    ----
    _internal
    mydb

    Note: _internal 是由 influxdb 创建,用来存储其内部运行时指标数据的数据库。

  • 使用 use 命令切换到 mydb,切换成功后所有的命令将使用在 mydb 数据库上

    use mydb Using database mydb

读写数据

首先对数据存储的格式做个入门介绍:

InfluxDB 中的数据按时间序列进行组织,其中包含一个测量值,如 “cpu_load” 或 “temperature”。时序数据有零个或多个数据点(points), 每一个都是一个离散的度量样本。数据点(Points)包括:

  • time(时间戳)、
  • a measurement(指标: cpu_load)、
  • 至少一个 k-v 格式的 field(即测量值本身, 例如:value=0.64, or temperature=21.2)、
  • 零个或多个 tag,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。

在概念上来讲,你可以将一个 measurement(测量) 看作是 SQL 表, 其中 primary index 主索引始终是时间。tagsfields 实际上是表格中的列。 tags 是被索引起来的,而 fields 没有。不同之处在于,在 InfluxDB 里,你可以有几百万的 measurements,你不用事先定义数据的 scheme,并且 null 值不会被存储。

  • 将数据点写入 influxdb, 只需要遵守如下 行协议

    1
    
    <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
  • 下面是数据写入InfluxDB的格式示例:

    cpu,host=serverA,region=us_west value=0.64 payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230 stock,symbol=AAPL bid=127.46,ask=127.48 temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000

    说明:关于写入格式的更多语法,请参考写入语法这一章

  • 使用CLI插入单条的时间序列数据到InfluxDB中, 输入 INSERT,后跟一个 Point

    1
    2
    
    > INSERT cpu,host=serverA,region=us_west value=0.64
    > 

    这样,一个 measurement 为 cpu, taghostregion,测量值 value0.64 的数据点 point 就被写入了 InfluxDB

  • 现在我们将查询刚才写的数据:

    1
    2
    3
    4
    5
    6
    7
    
    > SELECT host,region,value FROM cpu
    name: cpu
    time                host    region  value
    ----                ----    ------  -----
    1532889113525004206 serverA us_west 0.64
    1532889224748413400 serverB us_east 0.56
    > 

    说明:我们在写入的时候没有包含时间戳,当没有带时间戳的时候,InfluxDB会自动添加本地的当前时间作为它的时间戳。

  • 让我们尝试存储另一种类型的数据,在同一测量中有两个字段:

    1
    2
    
    > INSERT temperature,machine=unit42,type=assembly external=25,internal=37
    > 
  • 要使用查询返回所有字段和标记,可以使用*运算符:

    1
    2
    3
    4
    5
    
    > SELECT * FROM temperature
    name: temperature
    time                external internal machine type
    ----                -------- -------- ------- ----
    1532889736591859552 25       37       unit42  assemly

    Warning: Using * without a LIMIT clause on a large database can cause performance issues. You can use Ctrl+C to cancel a query that is taking too long to respond.

  • InfluxQL还有很多特性和用法没有被提及,包括支持golang样式的正则,例如:

    1
    2
    3
    4
    5
    
    > SELECT * FROM /.*/ LIMIT 1
    --
    > SELECT * FROM "cpu_load_short"
    --
    > SELECT * FROM "cpu_load_short" WHERE "value" > 0.9

See Also

Thanks to the authors 🙂

InfluxDB Getting Started