InfluxDB 数据库是用 Go 语言实现的一个开源分布式时序、事件和指标数据库。InfluxDB 提供类 SQL 语法。
需要注意的是 InfluxDB 单节点是免费的,但是集群版是要收费的。
安装
sudo apt install influxdb
数据库设计
正因为 InfluxDB 是一个时序数据库,在实际使用的时候有些概念需要提前知道。InfluxDB 数据库中的每一个数据都有一列 time
保存时间戳 (RFC3339 形式显示)。
time | butterflies | honeybees | location | scientist |
---|---|---|---|---|
2015-08-18T00:00:00Z | 12 | 23 | 1 | langstroth |
2015-08-18T00:00:00Z | 1 | 30 | 1 | perpetua |
以该数据说明,butterflies
和 honeybees
是 Field keys
用来保存元数据,每一个 key 都对应这 value,下面的数字都是要存储的值。
location
和 scientist
是 Tags
,用来存储元数据。location 有两种取值,scientist 也有两种取值。所以组合可以有四种 tag 集合。tag 是可选的。但是推荐给数据加上 tags。和 field 不同,tags 都是索引,这意味着在查询时可以更快。
measurement
可以理解成 tags, fields 和 time 列的容器。measurement 的名字是数据的描述,和关系型数据库中的表可以做对应。在 InfluxDB 中可以创建多个数据库,不同数据库中的数据文件是隔离存放的,存放在磁盘上的不同目录
每一个 measurement
可以属于不同的 retention policies
(存储策略),一个 retention policy
描述了 InfluxDB 保存数据多久(DURATION)和多少副本被保存到 cluster 中(REPLICATION)。(Replication factors 不对单节点开放)
在 InfluxDB 中 series
是一组数据的集合,这些数据共享一个 retention policy
,measurement
和 tag set
。理解 series 的概念才能设计好数据库的 schema。
最后 point
是在相同 series
中相同 timestamp 的数据。
InfluxDB Shell
如果需要使用 shell 需要安装
sudo apt install influxdb-client
然后在终端输入
influx
进入,默认的端口是 8086。输入 help
可以查看命令列表。
influx 命令参数
influx 启动命令常用参数
influx -database 'name' # 数据库
influx -host 'hostname' # 默认是 localhost
influx -password 'password' # 如果有密码
influx -port 'port' # 端口
更多参数可以使用 influx --help
查看。
基本操作
查看数据库
show databases
创建和删除数据库
create database test
drop database test
切换使用数据库
use test
表基本操作,查询,插入
显示所有表
show measurements
删除表
drop measurement test_table
插入数据
insert [measurement],[tag],[field],[time]
insert cpu,host=serverA,regin=us value=0.64
解释:
- 如果 measurement 表不存在,自动创建。
host
和region
是 tagvalue
是 0.64- 如果字段存在则会报错
这里还要注意 measurement 和 tag 之间不能有空格,空格后面是真正要存储的值,所以如果要存两个 field,那么就需要
insert temperature,machine=unit42,tpye=assembly external=25,internal=37
注意 type=assembly 和 external 之间的空格。
查询数据
select "host","region","value" from "cpu"
select * from "temperature"
更多的查询可以参考这里
用户管理
查看用户
show users
创建用户
create user "username" with password "password"
create user "username" with password "password" with all privileges
删除用户
drop user "username"
Python Client
安装下面的客户端
pip install influxdb
其实这个 client 也只不过是在 influxdb 提供的 HTTP 接口外封装了一层 API,如果熟悉 HTTP 的接口,可以直接调用 influxdb 提供的接口。
curl -sL -I localhost:8086/ping
比如:
创建数据库
import requests
posturl = 'http://localhost:8086/query'
data = {'q': 'create DATABASE mydb'}
response = requests.post(posturl, data=data)
类似于 curl 命令如下:
curl -GET http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
写数据
import requests
posturl = 'http://localhost:8086/write?db=mydb'
data="cpu_load_short,host=server01,region=us-west value=0.69"
response = requests.post(posturl, data=data)
类似于 curl 命令如下:
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 '
如果使用 python client:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import psutil
import time
from influxdb import InfluxDBClient
host = "localhost"
port = 8086
user = "root"
password = "root"
dbname = "test"
def read_info():
cpu_time_info = psutil.cpu_percent(1, True)
data_list = [
{
'measurement': 'cpu',
'tags': {
'cpu': 'i7'
},
'fields': {
'cpu_info_user': cpu_time_info[0],
'cpu_info_system': cpu_time_info[1],
'cpu_info_idle': cpu_time_info[2],
'cpu_info_interrupt': cpu_time_info[3],
'cpu_info_dpc': cpu_time_info[4]
}
}
]
return data_list
def parse_db(dbs):
l = []
for db in dbs:
l.append(db['name'])
return l
if __name__ == '__main__':
client = InfluxDBClient(host, port, user, password) # 初始化
dbs = client.get_list_database()
if dbname not in parse_db(dbs):
client.create_database(dbname)
for i in range(20):
client.write_points(read_info())
time.sleep(2)
大致是这样,但是这个 client 似乎还有 bug,在使用的时候就发现 HTTP 方法不支持,Method Not Allowed 这样的错误,需要自己手动改一改。
reference
- https://docs.influxdata.com/influxdb/v1.6/tools/shell/
- https://influxdb-python.readthedocs.io/en/latest/include-readme.html
- https://blog.csdn.net/qq_37258787/article/details/79190027
- http://eskiyin.cc/2017/03/13/influxdb-and-influxdb-python/