文档章节

whisper数据库

摩云菜
 摩云菜
发布于 2016/06/30 11:29
字数 1838
阅读 235
收藏 0

简介

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的不断地优化,实际上他们两者之间的速度差别已经很小了。

-----------------------------------------------------

欢迎关注我的微信公众号 ^_^

© 著作权归作者所有

共有 人打赏支持
摩云菜
粉丝 27
博文 34
码字总数 42147
作品 0
闵行
高级程序员
使用graphite和grafana进行应用程序监控

graphite+grafana 介绍 grafana,按照官方的说法是 。grafana 负责数据的展示,可以配置各种不同的数据源,其中包括 graphite。 graphite 包含多个模块,这里我们使用的模块包括: Whisper:...

ChanningBJ
2016/11/21
631
0
日志信息管理工具--Whisper

Whisper 是控制异常邮件变成垃圾邮件的一个工具。Whisper 作为一个过滤的 appender 来代替默认的 SMTP 邮件 appender。当消息的频率超过配置的阈值的时候,Whisper 就会开始压制。当启动压制...

叶秀兰
2014/10/10
474
0
json-whisper: 最简单的去中心的 json数据驱动的微博

https://gist.github.com/a-boy/6182058/raw/dccfdae600a9ac3a3f81a09ea2875bedbef2617e/a-boy.whisper.json {"JSON Whisper":"JSON Whisper is yet another twitter service driven by json......

a_boy
2013/08/08
105
0
Twitter开放Android安全应用TextSecure源码

北京时间12月21日消息,据国外媒体报道, TextSecure是一个对文本短信进行加密的Android应用,在很多国家的活动家中十分盛行。Twitter现在开放了这个应用的源码。 Twitter上个月收购了TextS...

红薯
2011/12/21
864
0
#研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案

郑昀 基于李丹和刘奎的文档 创建于2014/12/5 监控、dashboard、PHP、graphite、statsd、whisper、carbon、grafana、influxdb、Python 本文档适用人员:研发和运维员工 提纲: 监控平台要做到...

旁观者-郑昀
2015/01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀网站系统设计详解

最近总有一些朋友问高并发问题,后来就想自己把一个秒杀系统作为例子详细分解一下,也是一个学习过程。 首先假设场景,预计该活动可能有1万人参加,那最大并发数为1万。 主要面对的问题分析:...

小海bug
15分钟前
0
0
TypeScript基础入门之装饰器(一)

转发 TypeScript基础入门之装饰器(一) 介绍 随着TypeScript和ES6中Classes的引入,现在存在某些场景需要额外的功能来支持注释或修改类和类成员。 装饰器提供了一种为类声明和成员添加注释和元...

durban
25分钟前
0
0
sed命令扩展使用操作

打印某行到某行之间的内容 假若文件test.txt的内容是: ertfff**[abcfd]123324444[rty]**fgfgf 怎么能截取 [abcfd]123324444[rty] 这一部分出来呢? 操作命令: 知道开始行和结...

野雪球
41分钟前
1
0
JVM内存笔记

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原...

凌渡
47分钟前
1
0
284. Peeking Iterator

Description Tag: Design Difficulties: Medium Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the pee......

52iSilence7
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部