1、
Whisper簡介:
Whisper是使用python實作的一個固定大小的資料庫,在設計上類似于RRD(round-robin-database)。它可以為随時間不斷變化的數值型資料提供快速,可靠的存儲。
Whisper還可以把高精度的名額資料轉換成低精度的名額資料以滿足存儲長期的曆史資料的需求
。比如說把按秒采集的名額轉換成按分鐘采集的名額,以減少資料量,進行長期存儲。
1)Whisper使用大端雙精度浮點類型來存儲資料。每個資料點包含一個時間戳和一個值。
2)
補充:
A、時間序列資料庫(tsdb):用來存儲海量的、嚴格按照時間遞增的的、結構簡單的資料庫;
B、環型資料庫(RDD——
Round Robin Database
):
是一種循環使用存儲空間的資料庫,适用于存儲和時間序列相關的資料。
對于很多應用來說,whiper已經夠快了。它比RRD慢的主要原因是whisper是用python寫的,而RRD是用C寫的。但随着對whisper的不斷地優化,實際上他們兩者之間的速度差别已經很小了。
2、資料采集、存儲政策:
1)每個whisper資料庫可以包含一個或者多個針對不同資料的采集和存儲政策的定義。這些定義儲存在graphite安裝路徑下的conf/ storage-schemas.conf配置檔案裡面,如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN3gzM3EzN3gTO4UDZ3kTYyYzXwADNzQTM1EzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
上圖就定義了四個資料采集和存儲的政策,政策的定義文法如下:
[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年的資料。
2)
為了能準确地從高精度資料轉換到低精度資料,兩個相鄰的timePerPoint:timeToStore對定義必須滿足低精度定義能被高精度定義整除這個條件
。比如上面的1m:21d就能被15s:7d整除,因為1分鐘能被15秒整除,而21天可以被7天整除。相反,每180秒采集一次資料的定義就不能被每300秒采集一次資料的定義整除,因為300不能被180整除。
Whisper資料庫的最長存儲時間由最長的時長定義來決定。比如上面的例子,資料庫的最長存儲時長就是5年。
3、資料聚合:
當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,就是說至少要有一個資料點,才能做聚合操作,等等。
4、存儲和檢索行為:
1)以retentions = 15s:7d,1m:21d,15m:5y這個多精度定義為例子,當資料寫入這個資料庫時,資料會被同時寫多份。
資料會首先被寫入到最高精度的資料點中,然後當滿足資料聚合條件後,再把多個高精度的資料聚合,寫到低精度的資料點中
。
2)擷取資料的時候,會使用最符合目前時間段的精度的資料。
5、硬碟空間效率:
在磁盤使用率上,whiper可以說是低效率的。表現在以下幾個方面:
1)每個資料點不僅存儲了值,還存儲了時間戳
2)
資料庫檔案生成時,就把所有的資料點都建立出來了
。比如說1m:1d這個定義,在收到第一個資料點的時候,這個資料庫檔案就被建立了,資料庫檔案裡面總共1440個資料點。
不管這些資料點有沒有收集到值,資料點都會提前建立好,如果沒有值,就是None
。
但是這樣的資料檔案是很小的,比如1m:1d這個定義生成的資料檔案大小,才17K,如下所示:
可以使用
whisper-info.py +資料庫檔案名
,檢視這個檔案的一些資訊,如下所:
還可以使用
whisper-dump.py + 資料庫檔案名
,檢視裡面的資料點,如下所示: