说起来我最开始在使用InfluxDB数据库的时候,因为没有仔细阅读文档,数据结构设计不是很合理,好在数据量不大,影响也就不大。
InfluxDB在存储的时候有个series的概念,也就是将相同的measurement、tag值组成一个集合,并且物理存储上,相同series的数据也是存储在一起的,总之series的数量不能太多,很多资料都提到单机不要超过100万个。
一、series的数量问题
如何计算series的数量呢?简单计算就是 measurement数量、各tag的值的个数相乘。不过这个计算方法是按排列组合计算理论最大数量,实际情况有的组合不一定会存在,比如官网举例:
status | |
lorr@influxdata.com | start |
lorr@influxdata.com | finish |
marv@influxdata.com | start |
marv@influxdata.com | finish |
cliff@influxdata.com | start |
cliff@influxdata.com | finish |
上面的例子有email和status两个tag,其中email有3个不同的值,status有2个不同的值,然后他们的任意一个组合都存在,所以series达到了理论最大数量2*3=6个。
官网还举了个例子,如果再增加一给tag,比如增加一个firstname。
status | firstname | |
lorr@influxdata.com | start | lorraine |
lorr@influxdata.com | finish | lorraine |
marv@influxdata.com | start | marvin |
marv@influxdata.com | finish | marvin |
cliff@influxdata.com | start | clifford |
cliff@influxdata.com | finish | clifford |
firstname有3个不同的值,所以理论上series的数量是2*3*3=18个,但是实际上,上面email、status、firstname的不同组合还是6个,所以series的数量还是6。
二、结构设计
虽然series的实际数量并不会达到理论最大值,但是我们设计数据结构的时候,按照理论最大数量来考虑是合理的。
官网文档专门有一篇关于大量series的文章:Resolve high series cardinality。总结一下注意以下几点:
1、不要太长,比如tag中包含一些时间戳、唯一ID等很长的字符串。
2、不要直接用时间戳。
3、未来会大量增长的数据,比如用户ID之类的。
我就疏忽了第3点,将ID用到tag里面了,这在只有几百上千个ID的时候没啥影响,未来一旦到了几万、几十万个ID,那分分钟数据库就要挂掉。