微博AnalysisQl動態數據視圖元數據設計
- 2020 年 8 月 11 日
- 筆記
- AnalysisQL
前言
目前,AnalysisQl 數據視圖的元數據(維度、指標、指標計算器)需要通過程式碼(API)或資源文件的形式硬編碼,應用啟動時,按照聲明的順序依次註冊。這種模式下,數據視圖是 靜態 的,任何一項變更都需要重新升級發布應用服務,不利於服務快速迭代。
考慮到這種情況,AnalysisQl 在保留原有 靜態 視圖的前提下,擴展出 動態 視圖方案,基於資料庫實現元數據的存儲,通過更新相應的資料庫記錄,即可 實時動態 地更新數據視圖。
AnalysisQl 項目主頁://github.com/weibodip/analysisql。
元數據
數據視圖元數據有 7 類:
- 數據視圖資訊
- 數據視圖維度
- 數據視圖維度值
- 數據視圖指標
- 數據表資訊
- 數據表維度
- 數據表指標計算器
每一類元數據對應著資料庫的一張數據表,我們分別介紹。
注:資料庫以 MySQL 為例進行介紹。
數據視圖資訊
數據視圖資訊表(aql_view_info),用於存儲多個數據視圖(即:主題)資訊,包括:名稱、別名、描述及狀態資訊。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
avi_topic | VARCHAR | 視圖名稱,通常使用英文表示。 |
avi_alias | VARCHAR | 視圖別名,通常使用中文表示,與 avi_topic(英文名稱)相對應。 |
avi_desc | VARCHAR | 視圖描述,通常用於說明主題附加資訊。 |
avi_state | INT | 視圖狀態,數值 0 表示視圖處於 禁用 狀態;數值 1 表示視圖處於 啟用 狀態,其餘數值無效。 |
注:視圖名稱(avi_topic)全局唯一。
數據視圖維度
數據視圖維度表(aql_view_dimension),用於存儲數據視圖支援的維度(多個)資訊,包括:名稱、別名、描述。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
avd_topic | VARCHAR | 視圖名稱。 |
avd_name | VARCHAR | 視圖維度名稱,通常使用英文表示。 |
avd_alias | VARCHAR | 視圖維度別名,通常使用中文表示,與 avd_name(英文名稱)相對應。 |
avd_desc | VARCHAR | 視圖維度描述,通常用於說明維度附加資訊。 |
注:視圖名稱(avd_topic)與視圖維度名稱(avd_name)組合全局唯一。
數據視圖維度值
數據視圖維度值表(aql_view_dimension_value),用於存儲數據視圖中各個維度對應的維度值(多個)。每一個維度的維度值支援多個版本(版本使用時間戳表示),通常使用最新版本(即時間戳最大)的維度值數據。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
topic | VARCHAR | 視圖名稱。 |
dimension | VARCHAR | 視圖維度名稱。 |
dtime | TIMESTAMP | 視圖維度值時間戳,默認當前時間(CURRENT_TIMESTAMP)。 |
dvalue | VARCHAR | 視圖維度值。 |
寫入維度值
數據視圖維度值表中的維度值數據需要藉助外部應用程式寫入,可以使用定時或不定時的方式。注意,寫入指定視圖維度的維度值時,這些維度值的時間戳(dtime)需要保持一致,表示這些維度值歸屬於同一個版本。
讀取維度值
讀取指定視圖維度的維度值時,需要經過以下2個步驟:
- 根據視圖名稱、視圖維度名稱計算視圖維度值的最大時間戳(最新版本);
SELECT MAX(dtime) FROM %s WHERE topic = '%s' AND dimension = '%s'
- 根據視圖名稱、視圖維度名稱及視圖維度值的最大時間戳檢索維度值;
SELECT DISTINCT(dvalue) FROM %s WHERE topic = '%s' AND dimension = '%s' AND dtime = '%s'
注:視圖名稱(topic)、視圖維度名稱(dimension)與視圖維度值時間戳(dtime)組成聯合索引。
數據視圖指標
數據視圖指標表(aql_view_metric),用於存儲數據視圖支援的指標(多個)資訊,包括:名稱、別名、描述。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
avm_topic | VARCHAR | 視圖名稱。 |
avm_name | VARCHAR | 視圖指標名稱,通常使用英文表示。 |
avm_alias | VARCHAR | 視圖指標別名,通常使用中文表示,與 avm_name(英文名稱)相對應。 |
avm_desc | VARCHAR | 視圖指標描述,通常用於說明指標附加資訊。 |
注:視圖名稱(avm_topic)與視圖指標名稱(avm_name)組合全局唯一。
數據表資訊
數據表資訊表(aql_view_table_info),用於存儲數據視圖支援的數據表(多個)資訊,包括:名稱、時間粒度大小、時間粒度單位、保存周期、時間延遲及狀態資訊。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
avti_topic | VARCHAR | 視圖名稱。 |
avti_name | VARCHAR | 數據表名稱,通常使用英文表示。 |
avti_data | INT | 數據表數據時間粒度大小。 |
avti_unit | VARCHAR | 數據表數據時間粒度單位,支援「s」(秒)、「m」(分鐘)、「h」(小時)、「d」(天)、「w」(周)、「M」(月)、「q」(季度)、「y」(年)。 |
avti_period | INT | 數據表數據保存周期,使用數據表時間粒度為計算單位,詳情見後。 |
avti_delay | INT | 數據表數據時間延遲,使用數據表時間粒度為計算單位,詳情見後。 |
avti_state | INT | 數據表狀態,數值 0 表示數據表處於 禁用 狀態;數值 1 表示數據表處於 啟用 狀態,其餘數值無效。 |
假設,時間粒度大小(avti_data)為 5,時間粒度單位(avti_unit)為 m,表示數據表數據時間粒度為 5分鐘。
假設,時間粒度為 5分鐘,保存周期(avti_period)為 288,表示數據表數據保存周期為 1天。
假設,時間粒度為 5分鐘,時間延遲(avti_delay)為 12,表示數據表數據時間延遲為 1小時;
注:視圖名稱(avti_topic)、數據表名稱(avti_name)全局唯一;
數據表維度
數據表維度表(aql_view_table_dimension),用於存儲數據視圖/數據表支援的維度(多個)。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
avtd_topic | VARCHAR | 視圖名稱。 |
avtd_table | VARCHAR | 數據表名稱。 |
avtd_name | VARCHAR | 數據表維度名稱。 |
注:視圖名稱(avtd_topic)、數據表名稱(avtd_table)及數據表維度名稱(avtd_name)組合全局唯一。
數據表指標計算器
數據表指標計算器表(aql_view_table_calculator),用於存儲數據視圖/數據表支援的指標計算資訊,包括:名稱、指標計算查詢引擎(類型、鏈接、用戶名、密碼)、指標計算規則(SQL查詢語句)。
欄位名稱 | 欄位類型 | 欄位含義 |
---|---|---|
id | INT | 主鍵ID |
avtc_topic | VARCHAR | 視圖名稱。 |
avtc_table | VARCHAR | 數據表名稱。 |
avtc_metric | VARCHAR | 數據表指標名稱。 |
avtc_type | VARCHAR | 數據表指標計算時使用的查詢引擎類型,支援「clickhouse」、「mysql」、「presto」。 |
avtc_url | VARCHAR | 數據表指標計算時連接查詢引擎的JDBC URL。 |
avtc_user | VARCHAR | 數據表指標計算時連接查詢引擎的用戶名。 |
avtc_passwd | VARCHAR | 數據表指標計算時連接查詢引擎的密碼。 |
avtc_sql | VARCHAR | 數據表指標計算時使用的SQL查詢語句,不同的查詢引擎需要使用不同的SQL查詢語法。 |
注:視圖名稱(avtc_topic)、數據表名稱(avtc_table)及數據表指標名稱(avtc_metric)組合全局唯一。
結語
AnalysisQl 會定時掃描載入數據視圖表中所有處於 啟用 狀態的視圖,然後使用視圖名稱從其它幾類元數據表中掃描載入視圖相應的維度、指標、數據表等資訊。如果需要更新數據視圖,只需要增加或更新相應的元數據記錄,下一次掃描完成之後即可生效。