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,其主键索引总是时间戳。tag
和field
是在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_string
和rfc3339_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