数据库

---
title: influxDB
renderNumberedHeading: true
grammar_cjkRuby: true
---

> InfluxDB是一个当下比较流行的时序数据库,InfluxDB使用 Go 语言编写,无需外部依赖,安装配置非常方便,适合构建大型分布式系统的监控系统。

# 简介
InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。类似的数据库有Elasticsearch、Graphite等。

其主要特色功能
1)基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)
2)可度量性:你可以实时对大量数据进行计算
3)基于事件:它支持任意的事件数据

InfluxDB的主要特点
1)无结构(无模式):可以是任意数量的列
2)可拓展的
3)支持min, max, sum, count, mean, median 等一系列函数,方便统计
4)原生的HTTP支持,内置HTTP API
5)强大的类SQL语法
6)自带管理界面,方便使用

influxdb 安装
wget https://dl.influxdata.com/influxdb/releases/influxdb-0.13.0.x86_64.rpm
sudo yum localinstall influxdb-0.13.0.x86_64.rpm
服务端启动: service influxdb start(usr/bin/influx)
客户端登录:
![enter description here](./images/1591177991272.png)
influxdb自带web管理页面,
http://IP:8083

# 与其他数据中名词比较
![表格](./attachments/1591172833520.table.html)

# InfluxDB中独有的概念
1)point
Point由时间戳(time)、数据(field)、标签(tags)组成。

Point相当于传统数据库里的一行数据,如下表所示:

![表格](./attachments/1591173069140.table.html)

2)series
所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。

# influxdb数据库操作
## 数据库
如同MYSQL一样,InfluxDB提供多数据库支持,对数据库的操作也与MYSQL相同。
1)显示数据库
> show databases
2) 新建数据库
> create database test
3)删除数据库
> drop database test
4)使用某个数据库
> use test
## 数据表
在InfluxDB当中,并没有表(table)这个概念,取而代之的是MEASUREMENTS,MEASUREMENTS的功能与传统数据库中的表一致,因此我们也可以将MEASUREMENTS称为InfluxDB中的表。

1)显示表
> show MEASUREMENTS

2) 新建表
InfluxDB中没有显式的新建表的语句,只能通过insert数据的方式来建立新表。如下所示:
> insert disk_free,hostname=server01 value=442221834240i 1435362189575692182

其中 disk_free 就是表名,hostname是索引,value=xx是记录值,记录值可以有多个,最后是指定的时间

3)删除表
> drop measurement disk_free
## 数据操作
1)新增数据
增加数据采用insert的方式,要注意的是 InfluxDB的insert中,表名与数据之间用逗号(,)分隔,tag和field之间用 空格分隔,多个tag或者多个field之间用逗号(,)分隔。
> insert disk_free,hostname=server01 value=442221834240i 1435362189575692182

2)查询数据
> select * from test

3)删除和修改数据
InfluxDB属于时序数据库,没有提供修改和删除数据的方法。
但是删除可以通过InfluxDB的数据保存策略(Retention Policies)来实现,这个会在以后的文章中讲到。

## series操作
series表示这个表里面的数据,可以在图表上画成几条线,series主要通过tags排列组合算出来。
> show series from test

# API 操作数据库
为了方便,本文主要使用curl来发起http请求,示例当中也是使用curl这个工具来模拟HTTP 请求。
在实际使用中,可以将请求写入代码中,通过其他编程语言来模拟HTTP请求。
1)建立数据库
> curl -POST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"

2)删除数据库
> curl -POST http://localhost:8086/query --data-urlencode "q=DROP DATABASE mydb"

3)添加数据库
> curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
```
db=mydb是指使用mydb这个数据库。
--data-binary后面是需插入数据。
cpu_load_short是表名(measurement),tag字段是host和region,值分别为:server01和us-west。
field key字段是value,值为0.64。
时间戳(timestamp)指定为1434055562000000000。
就向mydb数据库的cpu_load_short表中插入了一条数据。
其中,db参数必须指定一个数据库中已经存在的数据库名,数据体的格式遵从InfluxDB规定格式,首先是表名,后面是tags,然后是field,最后是时间戳。tags、field和时间戳三者之间以空格相分隔
```
4)添加多条数据
```
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'
```
5) 查询
> curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb"
--data-urlencode "q=SELECT value FROM cpu_load_short WHERE region='us-west'"

- 格式化输出
```
HTTP查询时可以使用 epoch 参数指定输出的时间格式。可选值有 epoch=[h,m,s,ms,u,ns]
curl -G 'http://localhost:8086/query' --data-urlencode "db=mydb" --data-urlencode "epoch=s" --data-urlencode "q=SELECT value FROM cpu_load_short WHERE region='us-west'"
```
- 指定每次查询数据大小
```
可以使用 chunk_size 参数来指定每次结果的大小
curl -G 'http://localhost:8086/query' --data-urlencode "db=mydb" --data-urlencode "chunk_size=200" --data-urlencode "q=SELECT value FROM cpu_load_short WHERE region='us-west'"
```

# API响应

- 2xx:204代表no content,200代表InfluxDB可以接收请求但是没有完成请求。一般会在body体中带有出错信息。
- 4xx:InfluxDB不能解析请求。
- 5xx:系统出现错误。

# Retention Policies 数据保留策略
> InfluxDB每秒可以处理成千上万条数据,要将这些数据全部保存下来会占用大量的存储空间,有时我们可能并不需要将所有历史数据进行存储,因此,InfluxDB推出了数据保留策略(Retention Policies),用来让我们自定义数据的保留时间
## 保留策略说明
InfluxDB的数据保留策略(RP) 用来定义数据在InfluxDB中存放的时间,或者定义保存某个期间的数据。
一个数据库可以有多个保留策略,但每个策略必须是独一无二的。

## 保留策略目的
InfluxDB本身不提供数据的删除操作,因此用来控制数据量的方式就是定义数据保留策略。
因此定义数据保留策略的目的是让InfluxDB能够知道可以丢弃哪些数据,从而更高效的处理数据。

## 保留策略操作
**注意**
> 策略这个关键词“POLICY”在使用是应该大写
> 当一个表使用的策略不是默认策略时,在进行操作时一定要显式的指定策略名称,否则会出现错误。


1)查询策略
> SHOW RETENTION POLICIES ON telegraf

- name--名称,此示例名称为 default
- duration--持续时间,0代表无限制
- shardGroupDuration--shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,应该大于这个时间的数据在查询效率上应该有所降低。
- replicaN--全称是REPLICATION,副本个数
- default--是否是默认策略

2)新建策略
> CREATE RETENTION POLICY "2_hours" ON "telegraf" DURATION 2h REPLICATION 1 DEFAULT

3)修改策略
> ALTER RETENTION POLICY "2_hours" ON "telegraf" DURATION 4h DEFAULT

4)删除策略
> drop retention POLICY "2_hours" ON "telegraf"

 

posted @ 2020-06-12 09:54  予沫笙  阅读(194)  评论(0编辑  收藏  举报