携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
1. 什么是时序数据库
与传统的Mysql关系型数据库相比,它的最大的特点是:数据按照时间顺序存储。
举例来说,日志数据,是以时间顺序存储的,所以用时序数据库存储是一种很好的选择。使用Mysql在存储的过程中,不是对这种基于时间的数据进行优化的,所以,在查询、插入上有一些瓶颈。
时序数据库就是存放事件序列数据的数据库,需要支持时序数据的快速写入、持久化、多维度的聚合查询等基本功能。
1.1 时间序列数据
时间序列数据是基于时间的一系列数据。
在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。
1.2 数据写入
- 写入平稳、持续、高并发和高吞吐:时序数据的写入是比较平稳的,这点与应用数据不同,应用数据通常与应用的访问量成正比,而应用的访问量通常存在波峰波谷。时序数据的产生通常是以一个固定的时间频率产生,不会受其他因素的制约,其数据生成的速度是相对比较平稳的。
- 写多读少:时序数据上95%-99%的操作都是写操作,是典型的写多读少的数据。这与其数据特性相关,例如监控数据,你的监控项可能很多,但是你真正去读的可能比较少,通常只会关心几个特定的关键指标或者在特定的场景下才会去读数据。
- 实时写入、无更新:时序数据的写入是实时的,且每次写入都是最近生成的数据,这与其数据生成的特点相关,因为其数据生成是随着时间推进的,而新生成的数据会实时的进行写入。数据写入无更新,在时间这个维度上,随着时间的推进,每次数据都是新数据,不会存在旧数据的更新,不过不排除人为的对数据做订正。
1.3 数据查询
- 按时间范围读取
- 最近的数据被读取的概率高
- 历史数据粗粒度查询的概率高
- 多种精度查询
- 多维度分析
1.4 数据存储
- 数据量大:拿监控数据来举例,如果我们采集的监控数据的时间间隔是1s,那一个监控项每天会产生86400个数据点,若有10000个监控项,则一天就会产生864000000个数据点。在物联网场景下,这个数字会更大。整个数据的规模,是TB甚至是PB级的。
- 冷热分明:时序数据有非常典型的冷热特征,越是历史的数据,被查询和分析的概率越低。 具有时效性:时序数据具有时效性,数据通常会有一个保存周期,超过这个保存周期的数据可以认为是失效的,可以被回收。一方面是因为越是历史的数据,可利用的价值越低;另一方面是为了节省存储成本,低价值的数据可以被清理。
- 多精度数据存储:在查询的特点里提到时序数据出于存储成本和查询效率的考虑,会需要一个多精度的查询,同样也需要一个多精度数据的存储。
2. Docker安装influxDb
2.1 安装
先在命令行使用docker搜一下influxDb看看有没有这个镜像
docker search influxdb
发现有后,我们这里选择拉去2.1.1版本的的influxDb镜像
docker pull influxdb:2.1.1
创建并启动Influxdb容器
2.1版本官方文档:docs.influxdata.com/influxdb/v2…
2.3版本官方文档:docs.influxdata.com/influxdb/v2…
创建一个新目录来存储数据,然后导航到该目录
mkdir -p /mydata/influxdb/influxdb-docker-data-volume && cd $_
在主机文件系统上生成默认配置文件
docker run \
--rm influxdb:2.1.1 \
influxd print-config > config.yml
再重新启动InfluxDB 容器
docker run -p 8086:8086 --name influxdb2 \
-v $PWD/config.yml:/etc/influxdb2/config.yml \
-v $PWD:/var/lib/influxdb2 \
-d influxdb:2.1.1
开放端口8086
firewall-cmd --zone=public --add-port=8086/tcp --permanent
配置立即生效
firewall-cmd --reload
若是使用云服务的,去安全组开放端口即可
我这里安装在了云服务器,访问xxx.xxx.xxx.xxx:8086即可进入到页面
至此influxDb安装完成
2.2 设置
按要求填数据信息
界面查看token
2.3 进入容器
用命令进入容器
docker exec -it influxdb2 /bin/bash
为避免必须使用每个命令传递 InfluxDB API 令牌,请设置配置文件来存储凭据
复制刚刚的token,运行命令
influx config create -n default \
-u http://xxx.xxx.xxx.xxx:8086 \
-o my-org \
-t _Eb39hygj-FvDNPP_5_qw94uvApWVYXlS3rPOAsAgjRXMwSOD7mxDjvzCoPRUbzArw-0-TfZIRzXuUeMgXRMYA== \
-a
运行结果(假设Influxdb的地址是在本地的情况)
也可以使用如下命令查看结果
influx config ls
2.4 使用令牌
export INFLUX_TOKEN=_Eb39hygj-FvDNPP_5_qw94uvApWVYXlS3rPOAsAgjRXMwSOD7mxDjvzCoPRUbzArw-0-TfZIRzXuUeMgXRMYA==
influx write -t $INFLUX_TOKEN -b my-bucket -o my-org "measurement field=1"
3.InfluxDb
3.1 InfluxDB是什么
InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖,是一个用于存储和分析时间序列数据的开源数据库。也是使用最多的一个时序数据库。
3.2 InfluxDB相关概念
- Database:InfluxDB可以创建数据库,一个数据库可以包含多个user、保存策略、schemaless ,支持随时灵活创建mersurement
- Measurement:相当于表的概念;
- Tags:是一些key——value的结构,标签会被用来建立索引;
- Fields:是保存真实数据的结构,也是key——value结构,但是不会被用来建立索引;
- Point: 代表了一条记录,可以理解为关系型数据库中的一条记录;
- Timestamp:既然InfluxDB被称之为时序数据库,少了时间是不可能的,每条记录必须要有一个时间戳;
- Series:是由Measurement+Tags组成的
与数据库作对比
influxdb数据库也叫database- 只是表名变了
measurement测量值的含义更能体现influxdb的特点,存储的数据是在时间的刻度上统计测量的结果,并不是一些冷冰冰的数值。 - 正因为如此,数据记录的概念也有所不同,influxdb的一行记录称之为
point,一个点。
point由3部分组成time+fields+tags:
| point的属性 | 解释 |
|---|---|
| time | 每行记录都有一列time,主索引,记录时间戳,单位纳秒,时区UTC(东八区减8小时) |
| fields | 普通列 ,key-value结构, value数据类型支持型(float、integer、string、boolean) |
| tags | 索引列 ,key-value结构, value数据类型只支持string |
fields和tags的key名称严格区分大小写。
fields数据类型注意:
| 类型 | 备注 |
|---|---|
| float | influxdb的fields默认是float浮点型 |
| integer | 整型,insert语句如需写入field是整型,需在数值后面加个 i |
| string | 字符串,insert语句如需写入field是字符串,需英文双引号包含数值 |
| boolean | 布尔型,真可以用 t , T , true , True , TRUE表示;假可以用 f , F , false , False 或者 FALSE表示 |
- 一般情况下,经常作为查询条件的列,在初始时设置为tag,即索引;
- fields不常作为查询条件;
- 更甚者,在复杂查询语法中,聚合语句group by 后面只能是time和tags。
3.3 特点
-
InfluxDB 自带的各种特殊函数如求标准差,随机取样数据,统计数据变化比等,使数据统计和实时分析变得十分方便。
-
此外它还有如下特性:
- 内置 HTTP 接口,使用方便
- 数据可以打标记,这样查询可以很灵活
- 类 SQL 的查询语句
- 安装管理很简单,并且读写数据很高效
- 能够实时查询,数据在写入时被索引后就能够被立即查出
\