简介
Whisper是一个固定大小的数据库,在设计上类似于RRD(round-robin-database)。它可以为随时间不断变化的数值型数据提供快速,可靠的存储。Whisper还可以把高精度的指标数据转换成低精度的指标数据以满足存储长期的历史数据的需求。比如说把按秒采集的指标转换成按分钟采集的指标,以减少数据量,进行长期存储。
数据点
Whisper使用大端双精度浮点类型来存储数据。每个数据点包含一个时间戳和一个值。
采集和存储策略
每个whisper数据库可以包含一个或者多个针对不同数据的采集和存储策略的定义。这些定义保存在graphite安装路径下的conf/ storage-schemas.conf配置文件里面,如下图所示:
上图就定义了四个数据采集和存储的策略,策略的定义语法如下:
[name] pattern = regex retentions = timePerPoint:timeToStore, timePerPoint:timeToStore, ... |
name:策略名称,可随意指定
pattern:用来匹配具体指标名的正则表达式。如果配置文件里面定义了多个策略,那么收到一个指标数据的时候,会从上到下使用每个策略里面的pattern对指标名称进行正则表达式匹配,最先匹配到的策略将会被使用。
retentions:定义了数据采集精度和存储时长。timePerPoint就是多长时间采集一个数据点,timeToStore就是采集的数据最长存储多长时间。每个retentions后面可以定义多个timePerPoint:timeToStore对。每个timePerPoint:timeToStore对按高精度短时长到低精度长时长进行排序。比如:
retentions = 15s:7d,1m:21d,15m:5y |
上面的retentions包含了三个timePerPoint:timeToStore对,分别是15秒采集一个数据点,保存7天的数据,1分钟采集一个数据点,保存21天的数据和15分钟采集一个数据点,保存5年的数据。
为了能准确地从高精度数据转换到低精度数据,两个相邻的timePerPoint:timeToStore对定义必须满足低精度定义能被高精度定义整除这个条件。比如上面的1m:21d就能被15s:7d整除,因为1分钟能被15秒整除,而21天可以被7天整除。相反,每180秒采集一次数据的定义就不能被每300秒采集一次数据的定义整除,因为300不能被180整除。
Whisper数据库的最长存储时间由最长的时长定义来决定。比如上面的例子,数据库的最长存储时长就是5年。
数据聚合
当retentions里面包含多个timePerPoint:timeToStore对的时候,那么whisper必须使用一个策略来进行高精度数据到低精度数据的聚合操作。默认的策略是取平均值。可以使用的策略有一下几种:
1:average 取平均值
2:sum 求和
3:last 取最后一个值
4:max 取最大值
5:min 取最小值
数据聚合的规则定义在graphite的安装目录下的conf/ storage-aggregation.conf配置文件里面,如下图所示:
上图就定义了四个数据聚合规则,聚合规则定义的语法如下:
[name] pattern = <regex> xFilesFactor = <float between 0 and 1> aggregationMethod = <average|sum|last|max|min> |
name:规则的名称,可随意指定,但在这个配置文件里面必须唯一
pattern:用来匹配具体指标名的正则表达式。如果配置文件里面定义了多个聚合规则,那么收到一个指标数据的时候,会从上到下使用每个规则里面的pattern对指标名称进行正则表达式匹配,最先匹配到的规则将会被使用。
aggregationMethod:数据聚合策略(方法)
xFilesFactor:必须是一个0到1之间的浮点型数值。这个值规定了要把高精度的数据转换成一个低精度的数据,高精度的数据必须有几个。
以15s:7d,1m:21d这个定义为例子,高精度的定义是15秒采集一个数据,而低精度的定义是1分钟采集一个数据。那么在高低精度数据转换的时候,正常情况下就是把4个数据点转换成一个数据点。
但是实际可能存在这样的情况,就是1分钟内的数据点没有4个,只有一个,两个,或者三个,就是有的时间点他没有采集到数据。那么xFilesFactor的意思就是在这种数据缺少的情况下,数据点数必须满足多少百分比,才能做数据聚合操作。如果定义成0.5,那么就是说,至少要有2个点才能做数据聚合操作,如果定义成0.1,那就是说只要有1个点就可以做数据聚合操作。
这个值定义成多少,还跟具体的数据聚合策略有关系。如果数据聚合策略是sum(求和),这种策略下就算没有数据点,也是可以做求和操作的,那么xFilesFactor就可以定义成0。如果数据聚合策略是min(求最小值),这种策略下,没有数据点肯定就没法取最小值,那么xFilesFactor就可以定义成0.1,就是说至少要有一个数据点,才能做聚合操作,等等。
存储和检索行为
以retentions = 15s:7d,1m:21d,15m:5y这个多精度定义为例子,当数据写入这个数据库时,数据会被同时写多份。数据会首先被写入到最高精度的数据点中,然后当满足数据聚合条件后,再把多个高精度的数据聚合,写到低精度的数据点中。
获取数据的时候,会使用最符合当前时间段的精度的数据。
硬盘空间效率
在磁盘使用率上,whiper可以说是低效率的。表现在以下几个方面:
1:每个数据点不仅存储了值,还存储了时间戳
2:数据库文件生成时,就把所有的数据点都创建出来了。比如说1m:1d这个定义,在收到第一个数据点的时候,这个数据库文件就被创建了,数据库文件里面总共1440个数据点。不管这些数据点有没有收集到值,数据点都会提前创建好,如果没有值,就是None。
但是这样的数据文件是很小的,比如1m:1d这个定义生成的数据文件大小,才17K,如下所示:
可以使用whisper-info.py +数据库文件名,查看这个文件的一些信息,如下所示:
还可以使用whisper-dump.py + 数据库文件名查看里面的数据点,如下所示:
表现
对于很多应用来说,whiper已经够快了。它比RRD慢的主要原因是whisper是用python写的,而RRD是用C写的。但随着对whisper的不断地优化,实际上他们两者之间的速度差别已经很小了。
-----------------------------------------------------
欢迎关注我的微信公众号 ^_^
来源:oschina
链接:https://my.oschina.net/u/1263964/blog/703259