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

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

推荐阅读

influxdb基础那些事儿的更多相关文章

  1. 认识Influxdb时序数据库及Influxdb基础命令操作

    认识Influxdb时序数据库及Influxdb基础命令操作 一.什么是Influxdb,什么又是时序数据库 Influxdb是一个用于存储时间序列,事件和指标的开源数据库,由Go语言编写而成,无需外 ...

  2. 时序数据库InfluxDB(I)- 搭建与采集信息demo操作

    搭建环境:vmware workstation pro15.5.0, ubuntu18.04.3 实践时间:2019.10.12-10.27 (一)时序数据库InfluxDB准备 (1)安装 曾出现问 ...

  3. 物联网架构成长之路(33)-EMQ数据存储到influxDB

    一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...

  4. StatsD!次世代系统监控的核心

    在互联网业务蒸蒸日上的今时今日,系统架构日渐复杂,随着软件产品和工程团队的变革,许多开源的监控工具应运而生,其中有一些相当出名,比如 Zabbix.Nagios 还有 StatsD.也有一些问题被大家 ...

  5. Cloud Insight!StatsD 系监控产品新宠!

    年关将至,Cloud Insight 正式版悄然上线了.没有大张旗鼓的宣传,也没有热热闹闹的庆祝,只是一群人在上线前踏踏实实的优化了两周,然后发版,就是这样一件简单的事. 然而就是这样一个低调的产品, ...

  6. 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密

    本文选自云栖大会下一代云数据库分析专场讲师自修的演讲——<TSDB云边一体化时序时空数据库技术揭秘> 自修 —— 阿里云智能数据库产品事业部高级专家 认识TSDB 第一代时序时空数据处理工 ...

  7. 云栖深度干货 | 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密

    本文选自云栖大会下一代云数据库分析专场讲师自修的演讲——<TSDB云边一体化时序时空数据库技术揭秘> 自修 —— 阿里云智能数据库产品事业部高级专家       认识TSDB 第一代时序时 ...

  8. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  9. form表单那点事儿(上) 基础篇

    form表单那点事儿(上) 基础篇 做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了fo ...

随机推荐

  1. Linux 内核总线属性

    几乎 Linux 驱动模型中的每一层都提供一个添加属性的接口, 并且总线层不例外. bus_attribute 类型定义在 <linux/device.h> 如下: struct bus_ ...

  2. koa2--06.koa-static中间件的使用

    koa-static中间件,主要用于设置静态文件资源的文件路径 首先安装koa-static中间,以下是代码示例 const koa = require('koa'); var router = re ...

  3. C#调用smtp邮件发送几个大坑

    1.网易.新浪邮箱新增了一个叫“授权码”的东西,开通smtp服务时,必须开启授权码,并且邮件发送代码中也需要加上授权码,如下代码: //指定邮箱账号和密码,需要注意的是,这个密码是你在邮箱设置里开启服 ...

  4. Swagger Editor 本地搭建

    看了很多文章,怎么本地安装都比较乱,一番折腾,最后终于成功本地搭建Swagger Editor,记录如下(Windows 7): 进入命令行: (1)cd E:\Learning\AWS (2)git ...

  5. 曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  6. 利用脚本运行APP

    1.电脑安装Xcode(iOS)/Androidsdk(Android),连接手机,并在手机上安装相应代理,下图为iOS的Xcode代理样式: 2.打开Appium,点击搜索图标,添加并设置该手机信息 ...

  7. AI炼丹 - 深度学习必备库 numpy

    目录 深度学习必备库 - Numpy 1. 基础数据结构ndarray数组 1.1 为什么引入ndarray数组 1.2 如何创建ndarray数组 1.3 ndarray 数组的基本运算 1.4 n ...

  8. 从零开始のcocos2dx生活(五)ActionEase

    文章目录 sineEaseIn sineEaseOut sineEaseInOut expoEaseIn expoEaseOut expoEaseInOut easeIn easeOut easeIn ...

  9. 【一起学源码-微服务】Ribbon 源码三:Ribbon与Eureka整合原理分析

    前言 前情回顾 上一篇讲了Ribbon的初始化过程,从LoadBalancerAutoConfiguration 到RibbonAutoConfiguration 再到RibbonClientConf ...

  10. iscsi,nfs

    存储概述 存储的目标 存储是根据不同的应用环境通过采取合理.安全.有效的方式将数据保存到某些介质上并能保证有效的访问. 一方面它是数据临时或长期驻留的物理媒介. 另一方面,它是保证数据完整安全存放的方 ...