influxdb[1] 简介

简介

时序数据库TSDB 通常具有以下的特点:

  • 时间是不可或缺的绝对主角(就像 MySQL 中的主键一样),数据按照时间顺序组织管理

  • 高并发高吞吐量的数据写入

  • 数据的更新很少发生

  • 过期的数据可以批量删除

InfluxDB 就是一款非常优秀的时序数据库,DB-Engines TSDB 排名第一。参考 https://db-engines.com/en/ranking/time+series+dbms。 分为开源版和商业版,目前只有商业版本支持集群。

InfluxDB的主要特点包括下面这些:

  • schemaless(无结构),可以是任意数量的列
  • 可扩展(目前只有商业版本支持集群)
  • 方便、强大的查询语言,类SQL,易上手
  • 支持HTTP API
  • 丰富的插件,集成了数据采集、存储、可视化功能
  • 实时数据 Downsampling
  • 高效存储,使用高压缩比算法,支持retention polices
  • 底层数据结构为TSM 树( Time-Structured Merge Tree ),性能高且资源占用少
  • go 语言编写而成,没有额外的依赖

基本概念

  • database 数据库

  • measurement 类似于表

  • timestamp 时间戳,就像是所有数据的主键一样。

  • tag tag key = tag value 键值对存储具体的数据,会构建索引,查询速度快。tag set 就是 tag key-value 键值对的不同组合。

  • field field key = field value 键值对也是存储具体的数据,但不会被索引。类似的 field set 就是 field key-value 的组合。

  • series 一个 series 序列是由同一个 RP 策略下的同一个 measurement 里的同一个 tag set 构成的数据集合。

  • point 一个 point 点代表了一条数据,由 measurement、tag set、field set、timestamp 组成。一个 series 上的某个 timestamp 时间对应唯一一个 point 。

  • retention policy( 简称 RP )

    保留策略,由以下三个部分构成:

    DURATION:数据的保留时长。

    REPLICATION:集群模式下数据的副本数,单节点无效。

    SHARD DURATION:可选项,shard group 划分的时间范围。

Line protocol

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

符号 [] 代表可选项,符号 ... 代表可以有多个,符号 ,用来分隔相同 tag 或者 field 下的多个数据,符号空格分隔 tag、field、timestamp 。

使用场景

监控平台、物联网平台、实时分析等场景

安装

权限

安装InfluxDB包需要root或是有管理员权限才可以。

网络

InfluxDB默认使用下面的网络端口:

  • TCP端口8086用作InfluxDB的客户端和服务端的http api通信
  • TCP端口8088给备份和恢复数据的RPC服务使用

另外,InfluxDB也提供了多个可能需要自定义端口的插件,所以的端口映射都可以通过配置文件修改,对于默认安装的InfluxDB,这个配置文件位于/etc/influxdb/influxdb.conf

NTP

InfluxDB使用服务器本地时间给数据加时间戳,而且是UTC时区的。并使用NTP来同步服务器之间的时间,如果服务器的时钟没有通过NTP同步,那么写入InfluxDB的数据的时间戳就可能不准确。

Install InfluxDB as a service with systemd

RedHat和CentOS用户可以直接用yum包管理来安装最新版本的InfluxDB。

# Ubuntu/Debian
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.x.x-xxx.deb
sudo dpkg -i influxdb2_2.x.x_xxx.deb

# Red Hat/CentOS/Fedora
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.x.x-xxx.rpm
sudo yum localinstall influxdb2_2.x.x_xxx.deb.rpm

或者加入yum源

cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

一旦加到了yum源里面,就可以运行下面的命令来安装和启动InfluxDB服务:

# 安装influxdb
sudo yum install influxdb
# 启动influxdb service
sudo service influxdb start
# 查看运行状态
sudo service influxdb status

When installed as a service, InfluxDB stores data in the following locations:

  • Time series data: /var/lib/influxdb/engine/

  • Key-value data: /var/lib/influxdb/influxd.bolt.

  • influx CLI configurations: ~/.influxdbv2/configs (see influx config for more information) .

配置

安装好之后,每个配置文件都有了默认的配置,可以通过命令influxd config来查看这些默认配置。

配置文件/etc/influxdb/influxdb.conf之中的大部分配置都被注释掉了,所有这些被注释掉的配置都是由内部默认值决定的。配置文件里任意没有注释的配置都可以用来覆盖内部默认值,需要注意的是,本地配置文件不需要包括每一项配置。

有两种方法可以用自定义的配置文件来运行InfluxDB:

  • 运行的时候通过可选参数-config来指定:
# 启动influxd
sudo influxd -config /etc/influxdb/influxdb.conf
  • 设置环境变量INFLUXDB_CONFIG_PATH来指定,例如:
echo $INFLUXDB_CONFIG_PATH
/etc/influxdb/influxdb.conf

influxd

其中-config的优先级高于环境变量。

Install InfluxDB in a Kubernetes cluster

参考文档 (https://docs.influxdata.com/influxdb/v2.0/install/?t=Kubernetes#install-influxdb-in-a-kubernetes-cluster)https://docs.influxdata.com/influxdb/v2.0/install/?t=Kubernetes

使用

连接数据库

$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.6
InfluxDB shell version: 1.8.6

说明:

  • InfluxDB的HTTP接口默认起在8086上,所以influx默认也是连的本地的8086端口,你可以通过influx --help来看怎么修改默认值。
  • -precision参数表明了任何返回的时间戳的格式和精度,在上面的例子里,rfc3339是让InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的时间戳。

创建数据库

> CREATE DATABASE mydb
>
> SHOW DATABASES
name: databases
---------------
name
_internal
mydb

>

说明:_internal数据库是用来存储InfluxDB内部的实时监控数据的。

> USE mydb
Using database mydb
>

读写数据

InfluxDB里存储的数据被称为时间序列数据,其包含一个数值,就像CPU的load值或是温度值类似的。时序数据有零个或多个数据点,每一个都是一个指标值。数据点包括time(一个时间戳),measurement(例如cpu_load),至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”),零个或多个tag

在概念上,你可以将measurement类比于SQL里面的table,其主键索引总是时间戳。tagfield是在table里的其他列,tag是被索引起来的,field没有。不同之处在于,在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。

数据操作

> INSERT cpu,host=serverA,region=us_west value=0.64
> select * from cpu
name: cpu
time                           host    region  value
----                           ----    ------  -----
2021-07-21T09:04:14.189591692Z serverA us_west 0.64
> 
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> 
> select * from temperature
name: temperature
time                           external internal machine type
----                           -------- -------- ------- ----
2021-07-21T09:10:47.145556558Z 25       37       unit42  assembly
> 
> select * from temperature where external = 25
name: temperature
time                           external internal machine type
----                           -------- -------- ------- ----
2021-07-21T09:10:47.145556558Z 25       37       unit42  assembly
>

显示所有表

> show measurements
name: measurements
name
----
cpu
temperature
> 

删除表

> drop measurement temperature

数据更新删除

InfluxDB属于时序数据库,没有提供修改和删除数据的方法。

但是删除可以通过InfluxDB的数据保存策略(Retention Policies)来实现删除。

field在insert时,其它值不变,只修改field值是可以更新的,如果修改tag值或者新增field,只会新增数据

> select * from cpu
name: cpu
time                host    region  value
----                ----    ------  -----
1626858254189591692 serverA us_west 0.64
> 
> INSERT cpu,host=serverA,region=us_west value=0.65 1626858254189591692
> 
> select * from cpu
name: cpu
time                host    region  value
----                ----    ------  -----
1626858254189591692 serverA us_west 0.65
> 
> INSERT cpu,host=serverA,region=us_west1 value=0.65 1626858254189591692
> 
> select * from cpu
name: cpu
time                host    region   value
----                ----    ------   -----
1626858254189591692 serverA us_west  0.65
1626858254189591692 serverA us_west1 0.65

时间戳格式

InfluxDB使用的是UTC时间,除了支持epoch_time外,还支持rfc3339_date_time_stringrfc3339_like_date_time_string

  • epoch_time 时间戳的精度可以达到纳秒级(ns)即19位Long类型
  • rfc3339_date_time_string rfc3339时间格式是ietf协会定义的一种时间格式,'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
  • rfc3339_like_date_time_string 'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'

series操作

series表示这个表里面的数据,可以在图表上画成几条线,series主要通过tags排列组合算出来。

> show series from cpu
key
---
cpu,host=serverA,region=us_west
cpu,host=serverA,region=us_west1

posted @ 2021-07-23 11:11  huonan  阅读(676)  评论(0编辑  收藏  举报