前 言
OpenTSDB 是一個分散式、可伸縮的時間序列資料庫,其底層儲存以HBase 為主(這也是筆者使用的儲存),目前版本也支援Cassandra等儲存。正因為其底層儲存依賴於HBase,其寫入效能和可擴充性都獲得了保障。OpenTSDB 支援多tag 維度查詢,支援毫秒級的時序資料。OpenTSDB 主要實現了時序資料的儲存和查詢功能,其附帶的前端介面比較簡單,筆者推薦使用強大的前端展示工具Grafana。另外,OpenTSDB 也提供了豐富的外掛程式介面,可以幫助開發人員擴充,在本書中也會進行詳細介紹。
✤ 如何閱讀本書
由於篇幅限制,本書並沒有詳細介紹Java 語言的基礎知識,但為便於讀者了解OpenTSDB 的設計思想和實現細節,筆者希望讀者對Java 語言的基本語法有一定的了解。
本書共8 章,主要從原始程式角度深入剖析OpenTSDB 的原理和實現。各章之間的內容相對獨立,對OpenTSDB 有一定了解的讀者可以有目標地選擇合適的章節開始閱讀,當然也可以從第1 章開始向後逐章閱讀。
本書主要以OpenTSDB 的最新版本(2.3.1 版本)為基礎介紹。
第1 章介紹時序資料庫的基本特徵,並列舉了比較熱門的開放原始碼時序資料庫產品及一些雲廠商的時序資料庫產品。接下來介紹了OpenTSDB 的基礎知識,以及OpenTSDB 中最常用的API,其中重點分析了put 和query 這兩個核心介面。最後分析了OpenTSDB 原始程式中提供的AddDataExample 和QueryExample 兩個範例。
第2 章深入分析OpenTSDB 的網路層實現,其中介紹了Netty 3 的基礎知識,以及OpenTSDB 網路層如何使用Netty。另外,本章介紹了OpenTSDB 網路層中所有的HttpRpc 實現,重點介紹了PutDataPointRpc和QueryRpc 兩個HttpRpc 實現。
第3 章簡略說明了OpenTSDB 使用HBase 儲存時序資料的大致設計,尤其介紹了RowKey 的設計中UID 的原理和作用。本章實際分析了HBase 中tsdb-uid 表的設計,以及UniqueId 元件管理UID 的功能。
第4 章主要介紹了OpenTSDB 儲存時序資料的相關元件及其實作方式。首先分析了OpenTSDB 中儲存時序資料的TSDB 表的設計,其中有關RowKey 的設計、列名稱的格式及不同格式的列名稱對應的資料類型。之後又簡單介紹了OpenTSDB 中的壓縮最佳化、追加模式及Annotation儲存相關的內容。接下來,深入分析了TSDB 這一核心類別的關鍵欄位、初始化過程,以及寫入時序資料的實作方式。最後深入分析了OpenTSDB 中壓縮最佳化方面的實作方式,其中有關Compaction 和CompactionQueue 兩個元件的實作方式。
第5 章主要介紹了OpenTSDB 查詢時序資料的相關元件。首先,介紹了OpenTSDB 查詢時有關的一些基本介面類別和實現類別。然後,深入分析了OpenTSDB 在查詢過程中對時序資料的抽象,其中有關RowSeq、Span 及SpanGroup 等元件。接下來,繼續分析了OpenTSDB 在查詢時序資料的過程中有關的其他元件。最後,分析了TSQuery、TSSubQuery等核心查詢元件的實作方式。
第6 章主要介紹了OpenTSDB 中中繼資料的相關內容。首先,介紹了儲存TSMeta 中繼資料的tsdb-meta 表的RowKey 設計及整張tsdb-meta 表的結構。然後,分析了TSMeta 類別的核心欄位、增刪改查TSMeta 中繼資料的實作方式。
第7 章主要介紹了OpenTSDB 中Tree(樹狀結構)相關的實現。首先,簡單介紹了Tree 中關鍵組成部分的概念及tsdb-tree 表的結構。然後,深入剖析了OpenTSD 二元樹狀結構中核心元件的實現。最後,深入分析了建置一個完整Tree 的過程。
第8 章主要介紹了OpenTSDB 提供的外掛程式系統和常用工具類別的實現原理。首先,介紹了OpenTSDB 外掛程式的公共設定及一些共通性特徵。然後,針對OpenTSDB 常用的外掛程式介面進行了介紹。接著,分析了OpenTSDB 載入外掛程式的大致流程。最後,詳細分析了OpenTSDB 中常用的三個工具類別的實現,分別是TextImporter、DumpSeries 及Fsck。此外,還簡單介紹了其他幾個工具類別的功能。
如果讀者在閱讀本書的過程中,發現任何不妥之處,請將您寶貴的意見和建議發送到電子郵件shen_baili @163.com,也歡迎讀者朋友透過此電子郵件與筆者進行交流。
✤ 致謝
感謝電子工業出版社博文視點的陳曉猛老師,還有許多我不知道名字的工作人員為本書付出的努力!
感謝三十在技術上提供的幫助。
感謝小魚同學,是你讓我看到了星辰大海。
感謝我的母親,謝謝您的付出和犧牲!