百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

influxdb基础那些事儿

wptr33 2025-05-21 16:55 25 浏览


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无需定义,即无模式设计,开发者可以在任意添加measurement,tags和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的k,tag的v都是字符串类型;时间戳不是必须的,如果为空则使用服务端的本地时间作为时间戳。相同时间戳的数据第二次写入会覆盖第一次写入的数据,相当于更新操作。

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

这是influxdb的存储模型决定的,measurement+tag set+field key作为key,field 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和region,field是value;

- 数据的最后一项是时间戳(1520052020000000000),时间戳不是必须的,如果不传则使用influxdb服务端本地时间戳,注意时间戳都是UTC时间

数据保留策略

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

默认写数据不指定保留策略(RP,Retention 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中。

推荐阅读


相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...