Whisper是一个固定大小的数据库,在设计上相似于RRD(round-robin-database)。它能够为随时间不断变化的数值型数据提供快速,可靠的存储。Whisper还能够把高精度的指标数据转换成低精度的指标数据以知足存储长期的历史数据的需求。好比说把按秒采集的指标转换成按分钟采集的指标,以减小数据量,进行长期存储。python
Whisper使用大端双精度浮点类型来存储数据。每一个数据点包含一个时间戳和一个值。正则表达式
每一个whisper数据库能够包含一个或者多个针对不一样数据的采集和存储策略的定义。这些定义保存在graphite安装路径下的conf/ storage-schemas.conf配置文件里面,以下图所示:数据库
上图就定义了四个数据采集和存储的策略,策略的定义语法以下:微信
[name]优化 pattern = regexspa retentions = timePerPoint:timeToStore, timePerPoint:timeToStore, ...设计 |
name:策略名称,可随意指定排序
pattern:用来匹配具体指标名的正则表达式。若是配置文件里面定义了多个策略,那么收到一个指标数据的时候,会从上到下使用每一个策略里面的pattern对指标名称进行正则表达式匹配,最早匹配到的策略将会被使用。ip
retentions:定义了数据采集精度和存储时长。timePerPoint就是多长时间采集一个数据点,timeToStore就是采集的数据最长存储多长时间。每一个retentions后面能够定义多个timePerPoint:timeToStore对。每一个timePerPoint:timeToStore对按高精度短时长到低精度长时长进行排序。好比:ci
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的不断地优化,实际上他们二者之间的速度差异已经很小了。
-----------------------------------------------------
欢迎关注个人微信公众号 ^_^