纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

influxdb基础那些事儿

luoxn28   2020-01-30 我要评论

InfluxDB是一个开源的时序数据库使用GO语言开发特别适合用于处理和分析资源监控数据这种时序相关数据而InfluxDB自带的各种特殊函数如求标准差随机取样数据统计数据变化比等使数据统计和实时分析变得十分方便

influxdb的单机版是开源的而集群版是商业版influxdb被设计运行在SSD上如果使用机器或者网络磁盘作为存储介质会导致性能下降至少一个数量级influxdb支持restful api同时也支持https为了保证安全性非局域网建议使用https与Influxdb进行通信

influxdb基础

infludb中存储的是时间序列数据比如说某个时间点系统负载、服务耗时等信息时间序列数据可以包含多个值关于什么是时间序列数据简单来来说就是数据是和一个时间点关联的结合mysql中的记录与id关系来看就是时间序列数据的主键就是时间点(timestrap)

infludb中的一条数据至少包括measurement(对应mysql中表概念)、timestamp、至少一个k-v结构的field再加上0个或者多个k-v结构的tag对比mysql来看measurement就是一张表其主键是timestamp时间戳tag和field对应就是表中列tag和field都是k-v接口k对应列的名字v对应该列存储的值tag和field不同的是tag是有索引的而field没有(如果查询条件为tag则会扫描所有查询到的数据)对于mysql表的有索引列和无索引列注意mysql中的表需要提前定义结构而influxdb中的measurement无需提前定义其null值也不会被存储

influxdb中measurement无需定义即无模式设计开发者可以在任意添加measurementtags和fields不过针对同一个field第二次和第一次写入的数据类型不匹配influxdb会报错(由于默认tag的v都是字符串类型所有不存在这个问题不管输入是什么数据都当做字符串来处理)

数据读写

influxdb数据写入需满足如下格式:

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

注意:measurement和至少一个fileld的k-v是必须的tag和timestrap时间戳是可选的

说实话这个写入格式还是有点小严格的因为它要求measurement和可能的0个或多个tag之间必须是紧挨着的中间不能有空格同时多个filed之间也是不能有空格tag和field的ktag的v都是字符串类型时间戳不是必须的如果为空则使用服务端的本地时间作为时间戳相同时间戳的数据第二次写入会覆盖第一次写入的数据相当于更新操作

为什么至少有一个filed是必须的而tag是可选的呢?

这是influxdb的存储模型决定的measurement+tag set+field key作为keyfield value作为value如果没有field则没有了对应的value了

插入数据的tag key和field key能一样么?

数据插入没问题这是由于infludb底层存储tag和field是在不同地方的只不过为了区分会加上_序号而已如下图:

当在use某个db之后就可以执行数据读写操作比如下面往名字为cpu的MEASUREMENT(对应mysql中的表概念)中写入如下数据:

insert cpu,host=s01,region=hangzhou value=0.64 1520052020000000000
命令说明:
- 插入数据对应的MEASUREMENT名字为cpu
- 数据tag分别是host和regionfield是value
- 数据的最后一项是时间戳(1520052020000000000)时间戳不是必须的如果不传则使用influxdb服务端本地时间戳注意时间戳都是UTC时间

数据保留策略

Influxdb可支持每秒十万级别的数据量如果长时间保存会对存储造成很大压力因此和一般数据存储系统一样有一个数据保留策略同时针对大流量量数据可采样保存小流量数据可全量保存influxdb通过保留策略(RPRetention Policy)来管理过期数据使用连续查询(CRContinuous Queries)来进行数据采样

  • RP:数据保留策略过期数据会被清除每个数据库可拥有多种RP策略
  • CQ:数据连续查询定时跑的一个查询语句比如周期性统计某个数据指标查询语句需要在select语句中使用并且包含group by time子句(这里有点类似Flink中流数据处理的按时间窗口统计功能)

默认写数据不指定保留策略(RPRetention Policy)时默认使用influxdb默认的RP名字叫做autogen的RP会永久保留数据如果使用命令 create retention policy "default2" on "db2" duration 2h replication 1 default执行该命令后default2会取代默认的autugen作为db2数据库的默认RP默认influxdb会间隔半个小时执行一次RP操作

比如有一个服务请求日志measurement的名字为log(RP策略是2小时数据库是db2)其中数据有服务耗时(字段对应名字time)我们想统计每分钟平均服务耗时然后将平均耗时数据写入到名字为log2的measurement(RP策略是2天)该如何做呢?

首先创建2小时和2天的RP策略:

create retention policy "tow_hour" on db2 duration 2h replication 1
# 对数据库db2创建一个名字叫"tow_hour"的RP策略数据保存2小时由于最后没有加default所以数据读写如果没有执行RP仍然使用的是influxdb默认的RP
create retention policy "tow_day" on db2 duration 2d replication 1
# 对数据库db2创建一个名字叫"tow_day"的RP策略注意对于单机版influxdb来说replication无意义

然后使用create continuous query创建CQ策略:

create continuous query "cq_avg_time" on db2 
begin 
    select mean("time") as "mean_time" into "tow_day"."log2" from log 
    group by time(1m) 
end

这样就创建了一个名字叫cq_avg_time的CQ作用于db2数据库每1分钟一次计算measurement为log的time字段的平均值然后写入到另一个measurement为log2中

推荐阅读

  • influxdb的命令们
  • Linux Cgroup浅析
  • Linux Namespace浅析
  • kubernetes基础概念知多少

相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式