微博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個步驟:

  1. 根據視圖名稱、視圖維度名稱計算視圖維度值的最大時間戳(最新版本);
SELECT MAX(dtime) FROM %s WHERE topic = '%s' AND dimension = '%s'
  1. 根據視圖名稱、視圖維度名稱及視圖維度值的最大時間戳檢索維度值;
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 會定時掃描載入數據視圖表中所有處於 啟用 狀態的視圖,然後使用視圖名稱從其它幾類元數據表中掃描載入視圖相應的維度、指標、數據表等資訊。如果需要更新數據視圖,只需要增加或更新相應的元數據記錄,下一次掃描完成之後即可生效。