天天看點

Opentsdb 2.3 Writing data(二)資料結構

我們接着上一篇文章的繼續=-=

上一篇大緻介紹了下Opentsdb的一些設計理念以及Opentsdb的一些好處呀,基本概念啥子的,接下來繼續深入介紹一下Opentsdb。

開始!

資料結構

每條時間序列都應該包含以下幾個屬性:

·點位名稱 - 其實就是對你的時間序列起一個響亮的名字!例如sys.cpu.user,stock.quote或者env.probe.temp。
·時間戳 - 以秒或者毫秒為機關的Unix/POSIX紀元時間戳。定義為自1970年1月1日 UTC時間以來的秒數。
·值 - 在時間序列當中某個時間節點上的某個值,這個值可能是整數或者是浮點小數。
·标簽(tags) - 由标簽鍵和标簽值組成的鍵值對兒。每個點位至少包含一對兒标簽。
           

時間戳

時間序列資料可以以秒或者毫秒級的機關來寫入到Opentsdb當中。時間戳必須是整數并且不能超過13位。毫秒級的時間戳必須被格式化為 1364410924250 這樣,最後三位表示毫秒是多少。 如果你的應用時間戳的位數超過13位,那你就必須在送出之前對時間戳就行取舍為13位,否則Opentsdb會報錯。

秒為機關的時間戳會以2位元組存儲,而以毫秒為機關的時間戳以4位元組存儲。是以,如果你不需要用毫秒級别的時間戳或者你所有的資料精度都在秒以上的時候,我們強烈建議您使用10位的秒級時間戳,這會讓你節省存儲空間。還有一條建議是,在給定的時間序列中,避免秒級别時間戳和毫秒級别時間戳的混用!如果在給定的時間序列當中混合存儲秒級别和毫秒級别的時間戳,這樣查詢的速率會比單一長度的時間戳級别要慢。Opentsdb會存儲任何上傳的資料。

注意!

當你使用telnet方式寫入資料的時候,你可以以1364410924.250這種方式來代表毫秒級時間戳,小數點後面的三位數就代表毫秒數。如果你是用HTTP協定/api/put方法來插入毫秒級别的時間戳,必須是整數并且不能有小數點。毫秒級别的資料查詢隻能通過/api/query或者指令行查詢。
           

注意!

Opentsdb提供毫秒級别的時間戳但是并不意味着Opentsdb支援許多的時間序列以毫秒級别寫入。雖然一個簡答的TSD服務可以支援每秒幾千次的寫請求,但是如果你的精度以毫秒級為機關的話,你其實每秒隻能存入很少的時間序列。相反,Opentsdb目标是提供更寬泛的精度。是以使用者應該盡量避免以毫秒級别的速率寫入資料,如果不可避免,要盡量避免長時間這麼寫入資料。
           

點位和标簽

針對點位名字和标簽,有如下幾個規則:

·不論是點位名字還是标簽名字,是區分大小寫的,大小寫敏感!
·不允許空格的存在
·隻有a-z,A-Z,0-9,-,_,.,/是被允許的
           

雖然點位名字和标簽沒有限制長度,但是我們應該讓長度盡可能的短一些。

整型

如果你通過put指令插入的數值沒有帶小數點符号”.”的話,這個數值将會被認為是一個有符号的整型。整型可以以一種可變長度的編碼方式進行存儲,一個資料點小到1位元組大到8位元組都是有可能的。這就意味着一個資料點最小值可以是-9,223,372,036,854,775,808到最大值9,223,372,036,854,775,807 (包含這個值),整型隻能有數字和破折号(代表負數)而不能有像逗号這樣的其它符号。舉個例子,你如果想存儲最大值9,223,372,036,854,775,807,你必須寫成9223372036854775807這個樣子而不能像上面一樣加上逗号。

float類型

如果你使用put指令插入帶”.”的數值的時候。這個值将會被認為是float類型。目前float類型被固定存在4位元組當中,單精度的,在2.4以後的版本将會支援8位元組雙精度類型。float以IEEE 754二進位浮點數算術标準,帶有正和負的支援。但是不支援無窮大和非數值,如果你傳給TSD,TSD将會給你抛出錯誤。

注意!

因為Opentsdb目前隻支援float這種類型的浮點數。是以Opentsdb不适合存儲精确值的度量,例如貨币,這就是為什麼我們存儲15.2,資料庫會傳回 15.199999809265137.
           

插入順序

不像其它的解決方案,Opentsdb允許你以任意順序寫入給定的時間序列資料。這使得在将資料寫入TSD時具有很大的靈活性,允許從您的系統中寫入實時資料,然後在稍後導入曆史資料。

重複資料點位

向Opentsdb寫入資料點通常在原始寫入的一小時内具有幂等的效果。這句話的意思是假設你在時間節點1356998400 寫入了值為42,如果你再一次在時間節點1356998400 寫入42,這是不會出錯的。但是,如果你啟用了Opentsdb的compaction的操作,在我們Hbase中rowkey已經被壓縮了之後(一個小時的資料壓縮),如果你寫入了同樣的資料點,那麼當您查詢這一行時,可能就會出現異常。如果您嘗試用相同的時間戳編寫兩個不同的值,那麼在查詢期間可能會抛出一個重複的資料點異常。這是因為整型有1,2,4,8位元組和浮點型不同的編碼方式所造成的。如果第一次插入的值是整數,第二個同一時間戳下你新插入的值是浮點數,那麼重複的錯誤總是會被抛出。但是,如果兩個值都是浮點數,或者它們都是可以在同一長度上編碼的整數,那麼如果在行中沒有發生壓縮,那麼原始值可能會被覆寫。

在許多場景下,如果寫入了重複的資料點位,通常表明你的資料來源可能有問題,例如你的程序從新啟動,或者腳本出了一些問題。Opentsdb很人性化的幫我們檢查了這一點,OpenTSDB會在查詢一行或多個副本時抛出異常,這樣就可以保證你資料來源的準确性,保證你的資料點精确一次的插入進來。

在Opentsdb 2.1 你可以将配置tsd.storage.fix_duplicates 的值改為true來傳回最新插入的資料(最後一次寫入)。使用了此配置項,在查詢的時候,将會傳回最新的值而不是一個異常。如果是這樣的話,一個警告級别的日志将會寫入來提示您一個重複的資料點被查詢。如果還啟用了壓縮,那麼原始的壓縮值将被最新的值覆寫。

寫入資料的方法

這裡主要是三種主要的方式寫入資料到Opentsdb:http api,telnet api,以及批量的從檔案中倒入。當然你也可以使用一些第三方工具(如tcollector),或者,如果你喜歡冒險,你可以直接用Opentsdb的sdk~(java庫)。

警告

不要試圖直接寫入底層的存儲系統,例如HBase。因為這會很快讓你的存儲變得淩亂不堪。
           

注意

如果你的 tsd.mode從讀寫(rw)模式設定為隻讀(ro)模式時候,TSD不會接受通過RPC調用的資料點。Telnet樣式調用将抛出一個異常,對HTTP端點的調用将傳回404錯誤。但是,當模式被設定為隻讀時,仍然可以通過JAVA API(Opentsdb的java庫直接寫入資料到hbase)進行編寫
           

Telnet

put metrics timestamp value tagk1=tagv1 [ tagk2=tagv2 tagk3=tagv3 ]

舉個例子:

put sys.cpu.user 1356998400 42.5 host=webserver01 cpu=0

每個put隻能發送一個資料點。不要忘記換行符,例如在指令結束時的回車

注意

由于沒有提供一種方法來确定哪些資料點由于格式或存儲錯誤而無法寫入,。如果想知道詳細的插入資料的正确與否,使用HTTP API。
           

HTTP API

在2.0版本中,資料可以通過HTTP以“序列化”插件支援的格式發送。多個不相關的資料點可以在單個HTTP POST請求中發送以節省帶寬。看./ api/http詳情。

Batch Import

如果您正在從另一個系統導入資料,或者您需要回填曆史資料,那麼您可以使用import CLI工具。有關詳細資訊,請參閱cli/import。

這一篇還是主要介紹了一些Opentsdb的需要注意的點,然後我下一篇中,我覺得是更加好玩的,就是如何提升你的Opentsdb寫入性能一些的事情,然後我實際業務中,也是借鑒了官網中的一些建議,是以下一篇會是重中之重。

接下來還會有許多内容,我也将會一一為大家呈現,如果我的語句不通或者觀點錯誤的話呢,歡迎大家的批評指正,謝謝大家。

歡迎大家批評的哦~

繼續閱讀