摘要:本文選自高級工程師劉斌博客。劉斌,一個才思敏捷的程序員,第一本書入門與實踐等書籍譯者,入門與實踐課程主講人。時間序列數據庫,實現對性能指標進行聚合分組過濾所采取的解決方案。
本文選自 OneAPM Cloud Insight 高級工程師劉斌博客 。
?
劉斌,一個才思敏捷的程序員,《第一本 Docker 書》、《GitHub 入門與實踐》等書籍譯者,Docker入門與實踐課程主講人。
?
?
時間序列數據庫,Cloud Insight 實現對性能指標進行聚合、分組、過濾所采取的解決方案。
?
由于工作上的關系,最近看了一些關于時序列數據庫的東西,當然,我所看的也都是以開源方案為主。趁著這股熱勁還沒退,希望能整理一些資料出來。如果正好你也有這方面的需求,那么希望這一系列的介紹能夠幫助到你。
1. 什么是時序列數據庫(Time series database)?一聽到時序列數據庫,如果只是稍有耳聞的人,可能立刻會聯想到運維和監控系統。
沒錯,確實是很多運維、監控系統都采用了 TSDB 作為數據庫系統來存儲海量的、嚴格按時間遞增的、在一定程度來說結構非常簡單的各種指標(英文可能為 metric、measurement 或者類似的其他單詞)數據。
1.1 給TSDB一個定義這是維基百科上的解釋:
A time series database (TSDB) is a software system that is optimized for handling time series data, arrays of numbers indexed by time (a datetime or a datetime range).
翻譯過來就是“時序列數據庫用來存儲時序列(time-series)數據并以時間(點或區間)建立索引的軟件。”
其中,時序列數據可以定義如下:
?
可以唯一標識的序列名/ID(比如 cpu.load.1)及 meta-data;
?
?
一組數據點{timestamp, value}。timestamp 是一個 Unix 時間戳,一般精度會比較高,比如 influxdb 里面是 nano 秒。一般來說這個精度都會在秒以上。
?
一般時序列數據都具備如下兩個特點:
?
數據結構簡單
?
?
數據量大
?
所謂的結構簡單,可以理解為某一度量指標在某一時間點只會有一個值,沒有復雜的結構(嵌套、層次等)和關系(關聯、主外鍵等)。
數據量大則是另一個重要特點,這是由于時序列數據由所監控的大量數據源來產生、收集和發送,比如主機、IoT設備、終端或App等。
2. TSDB數據庫特點TSDB 作為一種專為時序列數據優化而設計的數據庫,在很多方面都和傳統的 RDBMS 和 NoSQL 數據庫不太一樣,比如它不關心范式和事務。
其他方面 TSDB 的特點主要有以下幾點,這里簡單羅列了一下。
2.1 數據寫入TSDB 在數據寫入方面,具有如下特點:
?
寫多于讀:95%-99%的操作都是寫操作
?
?
順序寫:由于是時間序列數據,因此數據多為追加式寫入,而且幾乎都是實時寫入,很少會寫入幾天前的數據。
?
?
很少更新:數據寫入之后,不會更新
?
?
區塊(bulk)刪除:基本沒有隨機刪除,多數是從一個時間點開始到某一時間點結束的整段數據刪除。比如刪除上個月,或者7天前的數據。很少出現刪除多帶帶某個指標的數據,或者跳躍時間段的數據。
?
區塊刪除很容易進行優化,比如可以按區塊來分開存儲到不同的文件,這樣刪除一個區塊只需要刪除一個文件就可以了,成本會比較低。
2.2 數據讀取(查詢)相對于寫入操作,TSDB 的讀取操作特點如下:
?
順序讀:基本都是按照時間順序讀取一段時間內的數據。
?
?
基數大:基本數據大,超過內存大小,要選取的只是其一小部分,且沒有規律,緩存幾乎不起任何作用。
?
即使讀取操作相對寫來說較少,但是讀操作的響應時間要求很高,除非你是只做后臺報表生成,否則一旦有交互性操作,必須要求快速響應。
為了提高讀取的響應時間,有兩種策略:
?
一是以寫性能優先,不為讀取做存儲優化,但是通過分布式和并發讀,來提高讀取的速度。
?
?
二就是在寫入的時候就考慮到讀的性能問題,將統一指標、時間段的數據寫入到同一數據塊中,為讀取進行寫入優化。
?
2.3 分布式(集群)TSDB 應該天生就要考慮到分布式和分區等特性,將存儲和查詢分發到不同的服務器,以支撐大規模的數據采集和查詢請求。
同時,它也應該是能擴展和自動失敗切換(Fault-tolerant)的。隨著數據量的增長,所需服務器的臺數也會增加,能動態的增減服務器則是一個基本要求。同時,隨著服務器的增多,各種服務器軟件或者網絡故障發生的概率也會增大,這時候失敗切換也顯得很重要,不能因為一臺機器的失效而導致整個集群不可工作。
2.4 基本數據分析支持TSDB 的數據是用來分析的,所以 TSDB 還會提供做數據分析所必須的各種運算、變換函數。比如可以方便的對時序列數據進行求和、求平均值等操作,就像傳統的 RDBMS 一樣。
3. 如何去選擇開源時序列數據庫雖然每個人的場景不太一樣,不過我覺得以下的大部分因素,都值得大家好好考量一下。除了功能上能滿足、性能上撐得住,運(售)維(后)等也是我們準備長期使用所必須面臨的問題。
我自己總結的評價因素主要有如下幾點:
3.1 性能主要就是讀和寫的性能,在前面 TSDB 的特點中我們已經講過了。
通過前面的說明,我們也知道 TSDB 99.9% 都是讀少寫多,因此寫入性能必須能跟得上、無延時,并且不能阻塞讀操作,且讀操作能快速返回最新的數據。
還有一點必須注意的是,現在很多用戶的數據都跑在云主機上,那么 IOPS 則是一個你必須要注意的因素,超了 Plan 限制的話很難找出問題原因。
3.2 存儲方案(或引擎)存儲方案主要會影響到讀寫性能、集群擴展容易程度、以及運維的復雜度。典型的存儲方案有 HDFS、HBase、Cassandra、LevelDB等。
3.3 集群功能一般來說,集群主要集中為存儲和查詢的集群功能,也代表其可擴展性,因為時序列數據庫的數據量很可能很大,并且增長趨勢不可預測,尤其是隨著大數據和物聯網的興起,GB 已經算入門,TB 也是剛起步。
3.4 API(HTTP API 和 Client Library)如果你需要定制,或者只是使用 TSDB 做存儲,自己寫入數據并通過查詢接口進行數據展示,那么 API 的完善程度將是一個很重要的評判因素。
還好大部分 TSDB 都提供了 HTTP API,除了簡單的文本格式,有很多還支持 JSON 格式的輸入、輸出。
Client Library 也是一個加分項,有一個好用的、你熟悉的語言的SDK包的話應該會更方便你做開發。
3.5 SQL-like Query Language如果能通過類似傳統 SQL 的 來查詢 metric 的話,是不是剛接觸到 TSDB 的人更容易上手和理解呢?
select mean(value) from metric where role="user" and time >= xxx and time <= yyy group by dc
可能這看起來比較酷,不過對我來說這只能算是個加分項而已。因為我們只會通過 API 來讀寫數據,而且查詢模式非常固定、數量不多。
但是很多經常出報表的人,可能更喜歡這一特點了,因為老板、運營可能會定期或者隨時找他們出統計數據。
3.6 部署體驗即是否容易部署,特別是作為產品的話,很多企業級產品在安裝部署或者升級所耗費的時間絕對是占了大頭的。所以是否容易部署就成了一個重要的指標,比如是否能一鍵部署、單機部署?是否有額外依賴組件等。
同時,部署的容易程度也幾乎等于以后運維的復雜程度。
3.7 成熟度成熟度包括軟件本身的成熟度和生態系統的成熟度。
生態系統主要是指圍繞該軟件的周邊工具、插件的豐富程度,以及相應的社區的活躍程度。
一個軟件的生態系統,跟它的開放機制、插件(擴展)機制關系很大,直接決定第三方是否能很方便的對系統進行擴展。
這個可以從 TSDB 項目的提交記錄(比如從 GitHub 上能看到開發狀況)、ISSUE 的解決情況,Pull Request的merge 情況、以及 Release 的頻率來確認。
有一些 TSDB 項目甚至提供了 ROADMAP,我們還可以通過路線圖來了解該軟件未來發展方向、特性支持。
主要是文檔的豐富性等,可以在 Google 搜索一下,看看相關的 Blog 是否足夠多,也可以在 StackOverFlow 上看一下相關討論內容。
最重要的評論觀點就是在專業社區(比如在 Ops 相關討論組或社區)中該 TSDB 出現的頻次、大家的關注程度等。
是否有大規模、大公司真正的生產環境的部署案例?規模有多大,性能如何,有無問題等,都是重要考察因素。有大公司的信任背書,你在選擇上也就多了份安心,少了些糾結。
比如,Druid 就在主頁列出了很多使用了 Druid 的公司: http://druid.io/druid-powered.html
3.8 可視化和報警功能說到 TSDB,容易聯想到的兩個功能就是可視化和報警。如果 TSDB 自帶了功能強大的可視化組件和報警支持,則可能會省去很多開發的成本,更容易吸引用戶。即使開發,也能方便開發過程中進行調試和驗證。
ELK 這么流行,跟其一攬子方案關系很大。除了強大的功能之外,部署簡單、功能齊全是其吸引人的地方。
3.9 所采用技術棧主要是該方案采用了什么編程語言,有哪些第三方模塊。比如有的用 Java 編寫,有的用 Golang;有的用 HBase,有的用自己的存儲方案;有的自帶豐富的 UI,有的則只提供了簡單的調試界面。
技術棧為什么也是一個選型時需要考慮的因素呢,這是因為 TSDB 所采用的技術,會影響你們開發和運維的復雜程度,此外還會受到既有資產的影響。比如你們沒有人熟悉 HBase,又不熟悉 Java 語言,那么可能 Influxdb 就更適合你們了。
3.10 保留策略(Retention Policies,或自動刪除、壓縮)自動刪除就是為數據設置 TTL,過了指定的 TTL 則自動刪除相關數據,以節省存儲空間同時提高查詢性能。
如果不刪除數據,也可以對數據進行壓縮,或者再采樣(Resampling),比如對最近 1 天的數據我們可能需要精確到秒,而查詢 1 年的數據時,我們只需要精確到天,這時候,海量的數據一年只需要 365 個點來存儲,大大節省了存儲空間。
3.11 背后主導公司有商業公司專職開發,可能是個雙刃劍。
好處是其持續性可期,不用擔心過兩天項目沒有人維護了,有了 bug 也有人會專門解決。
敝處就是你可能上了賊船下來需要成本較高。比如 ElasticSearch,搭建起 ELK 比較簡單,但是一涉及到具體的生產環境部署時需要考慮的權限等問題,要么自己去 hack,要么就得買他們的產品,這是成本上需要考慮的。
3.12 License這可能是影響最弱的一個因素了,但是如果你想拿來商業化的話,則又是一個非常重要甚至致命的因素。
3.13 多租戶支持這部分需求可能會比較少,但是如果想基于 TSDB 為用戶提供服務,比如 SaaS 類應用,能從物理上隔離當然是最理想的了,不過很遺憾目前好像還沒有這方面的方案。要想支持多租戶,只能從應用自身來設計,類似傳統 RDBMS 那樣,為每個實體加入 user_id=xxx 類似的屬性。
3.14 安全性比如:權限管理、訪問控制等。
關于安全性最基本的需求就是不要像 ELK 那樣,暴露在公網上如果不設防火墻的話,誰都能使用,這就帶來了很大的安全隱患。
所以說,安全上的最小實現就是支持基本的用戶密碼認證功能,而且是在兩個層次支持,一是 UI 層,即管理界面或者控制面板等,另一方面就是 API 級別的用戶認證。
4. 參考文獻?
Time-Series Database Requirements
?
?
Thoughts on Time-series Databases
?
?
DB-Engines Ranking of Time Series DBMS(January 2016)
?
請期待本系列文章的其他部分:
?
時序列數據庫武斗大會之TSDB名錄 Part 1
?
?
時序列數據庫武斗大會之TSDB名錄 Part 2
?
?
時序列數據庫武斗大會之 OpenTSDB 篇
?
Cloud Insight 集監控、管理、計算、協作、可視化于一身,幫助所有 IT 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。
本文轉自 OneAPM 官方博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7958.html
摘要:本文所闡述的時間序列數據庫,系筆者所負責產品對性能指標進行聚合分組過濾過程中的梳理和總結。而帶有標志的,則是數據采集源,將數據發給服務。左面的則是的特點之一,其規則為以上屬性值均為對應名稱的。 【編者按】 劉斌,OneAPM后端研發工程師,擁有10多年編程經驗,參與過大型金融、通信以及Android手機操作系的開發,熟悉Linux及后臺開發技術。曾參與翻譯過《第一本Docker書》、《...
摘要:在前面時序列數據庫武斗大會之名錄我們已經介紹了一些常見的,這里我們再對剩余的一些做些簡單介紹。是一個多租戶的時間序列和資源數據庫。是基于的時序列數據庫。 【編者按】劉斌,OneAPM后端研發工程師,擁有10多年編程經驗,參與過大型金融、通信以及Android手機操作系的開發,熟悉Linux及后臺開發技術。曾參與翻譯過《第一本Docker書》、《GitHub入門與實踐》、《Web應用安全...
閱讀 661·2021-10-09 09:41
閱讀 641·2019-08-30 15:53
閱讀 1071·2019-08-30 15:53
閱讀 1207·2019-08-30 11:01
閱讀 1562·2019-08-29 17:31
閱讀 983·2019-08-29 14:05
閱讀 1712·2019-08-29 12:49
閱讀 409·2019-08-28 18:17