可以认为InfluxDB
是一个主键为时间的数据库,官网有免费体验:
https://cloud2.influxdata.com/signup
不过手头刚好白瞎了一台Ubuntu
,试试。
安装
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
然后:
sudo apt-get update # 云服务器如果有限制,跳过
sudo apt-get install influxdb
sudo service influxdb start
看看状态:
查看配置,使用
influxd config
,可以看到一些端口:默认是外网也能访问的,云服务器可以开一下
8086
端口的安全组。测试下连接,rfc3339
为时间格式:
influx -precision rfc3339 # 直接influx也行
如果报错,可能需要安装一下:
sudo apt install influxdb-client
最后没问题:
使用
类似mysql
,
> create database food_data
> show databases
name: databases
name
----
_internal
food_data
> use food_data
Using database food_data
读写数据
使用POST
即可插入数据,InfluxDB
的schema
不需要提前定义,可直接插入,写个脚本定时插入:
import requests
import random
import time
count = 0
while True:
place = random.choice(['home', 'cafe', 'hotel'])
phone = random.randint(1, 60)
website = random.randint(1, 100)
s = f'orders,place={place} phone={phone},website={website}'
res = requests.post('http://yourIP:8086/write?db=food_data',
data=s.encode())
count += 1
print(count, s)
time.sleep(random.randint(1, 60))
其中orders
是measurement
,相当于表名。
place
是tag
,可以有多个tag
,形成tag set
,tag
不是必须的,但一般都加上,另外,上面的代码如果不加tag
会报错,待研究。
phone
、website
是field
。field
和tag
都是key-value
型的,field
默认为float
,tag
只能是string
,tag
可以索引,field
无法索引,所以查询tag
快一些,需要查询、聚合、元数据的字段最好设计为tag
,但tag
不宜过多,比如姓名就不适合。
可以在客户端查询看到结果:
可以通过脚本插入数据。
CQ和RP
试试设置连续查询CQ
和保留策略RP
,自动定期执行,来实现数据采样和保留,类似滑动窗口。下面的语句给数据库food_data
创建一个只保留2小时内的数据的默认保留策略,这将覆盖掉本来默认的永久保留的autogen
策略。REPLICATION
为副本,单点为1,多节点需要付费使用,可以先忽略。
> CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAULT
在创建一个非默认的1年保留策略,数据库里的measurement
必须指定才能使用这个策略,否则还是用上面的two_hours
:
CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1
再创建一个连续查询,注意不分行:
> CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
INTO "a_year"."downsampled_orders"
FROM "orders"
GROUP BY time(30m)
END
这会将orders
里的数据,每30分钟平均聚合一下,存入downsampled_orders
表,且该表的保留策略为a_year
。由于之前写了定时脚本产生数据到orders
表,经过一段时间,downsampled_orders
表会自动聚合采样数据,时间为每个半小时的起始时间戳,精确到纳秒。
相同的RQ
、measurement
和tag set
形成series
;相同series
且相同timestamp
的field set
,形成point
。在一个series
里,point
的timestamp
是唯一的,无法写入相同timestamp
的point
。
总结
时序数据库的增删改查,只把技能点在了增和查。