時序數(shù)據庫連載系列: RISElab的大殺器Confluo
來源:轉載
發(fā)布時間:2019-02-23 16:57:29
閱讀量:1235
挑戰(zhàn)
隨著越來越多的應用達到每秒千萬級的數(shù)據點采集能力,比如終端IoT網絡監(jiān)控,智能家居,數(shù)據中心等等。 并且這些數(shù)據被應用于在線查詢展示,監(jiān)控,離線根因分析和系統(tǒng)優(yōu)化。 這些場景要求系統(tǒng)具備高速寫入,低延遲的在線查詢以及低開銷的離線查詢的能力。 然而已有的數(shù)據結構很難滿足這些要求。有些數(shù)據結構側重與高速的寫入和簡單的查詢, 有些則側重于復雜的查詢,比如即席查詢,離線查詢,霧化視圖等等,增加了維護開銷,犧牲了寫入的性能。 為了解決這些挑戰(zhàn),Confluo應運而生。
前提和典型應用場景
Confluo之所以可以同時實現(xiàn)幾個挑戰(zhàn)目標,是因為在一些場景上做了取舍。一個典型的場景是遙感數(shù)據
這些遙測數(shù)據有以下幾個非常重要的特點:
write-once: 數(shù)據追加寫,無更新和刪除
針對這些數(shù)據特點,Confluo實現(xiàn)了一個創(chuàng)新型數(shù)據結構來實現(xiàn)高吞吐,在線/離線查詢。
特性
Confluo面向實時監(jiān)控和數(shù)據流分析場景,比如網絡監(jiān)控和診斷框架,時序數(shù)據庫,pub-sub的消息系統(tǒng),主要特性包括:
實現(xiàn)概要
Confluo的基本存儲抽象是新型的數(shù)據結構”Atomic MultiLog“,后面文章簡稱“AM”, AM依賴于2個關鍵性技術:
AM是無鎖并發(fā)日志集合,可以用來存儲原始數(shù)據,聚合統(tǒng)計,霧化視圖。每一個日志記錄writeTail和readTail并發(fā)讀寫。
日志更新采用現(xiàn)代CPU硬件支持的原子指令集:AtomicLoad,AtomicStore,F(xiàn)etchAndAdd,CompareAndSwap
AM在接口方面同數(shù)據庫的表類似,所以應用在使用時首先創(chuàng)建一個固定schema的AM對象。然后按照這個schema寫入數(shù)據流。并且創(chuàng)建索引(index),過濾器(filter),聚合器(aggregate)以及觸發(fā)器(trigger)等等用于監(jiān)控和診斷。
Confluo 數(shù)據模型
原生數(shù)據類型:BOOL, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE, STRING.
{
timestamp: ULONG,
op_latency_ms: DOUBLE,
cpu_util: DOUBLE,
mem_avail: DOUBLE,
log_msg: STRING(100)
}
時間戳8個字節(jié),如果應用沒有寫入時間戳,Confluo會內置添加時間戳。
指標數(shù)據包含double類型以及string類型。
自定義類型。自定義類型通過實現(xiàn)屬性字段,注冊接口,類型獲取接口后,就可以作為schema的成員建立數(shù)據模型,追加數(shù)據以及執(zhí)行filter,trigger等操作。
寫入
創(chuàng)建存儲數(shù)據的Store File
創(chuàng)建具有固定Schema的AM AM有3種存儲模式:IN_MEMORY, DURABLE, DURABLE_RELAXED
IN_MEMORY:所有的數(shù)據存儲在內存中。
DURABLE:類似寫穿的方式,數(shù)據持久化到磁盤
DURABLE_RELAXED:數(shù)據在內存中緩存,周期性持久化。
執(zhí)行AM基本操作。 AM定義了Index,F(xiàn)ilter, Aggregate, trigger
添加Index, 應用層可以為每一個指標建立K叉樹索引.
添加Filter, filter 由關系和布爾運算符組成,應用于指標的過濾.
| |
| |
| |
| |
| |
| transport_protocol != TCP |
添加Aggregate:適用于filter之后的記錄聚合,比如: SUM,MIN,MAX,COUNT,AVG
添加Trigger:是一個布爾條件,適用于結果集上的操作 比如:MAX(latency_ms) > 100
查詢
Confluo既可以離線查詢也可以實時查詢,區(qū)別在于是否要預定義規(guī)則。
離線查詢主要面向診斷分析,如果fExpressio已經定義,增直接查看FilterLog,否則通過IndexLog方式查詢原始數(shù)據。
實時流式查詢主要面向實時監(jiān)控和報警,需要預定義規(guī)則。比如通過定義triggers實現(xiàn)報警能力,類似SUM(pktSize)>1GB的報警規(guī)則定義。
解析器:語法解析的實現(xiàn)采用了spirit.對于這類小型符合EBNF語法規(guī)范的數(shù)據模型,spirit還是比較靈活。Confluo定義了exp,term,factor,predicate,identificate, value, quoted_string等幾種語法規(guī)則.
執(zhí)行計劃:解析器生成表達式后,通過查詢計劃器生成執(zhí)行計劃為agg->filter->index。Confluo內置了一個簡單的評估器,根據近似count計算cost判斷走index或者full scan。
數(shù)據歸檔和壓縮
Confluo除了存儲原始數(shù)據,同時需要存儲索引,預定義的過濾,聚合等等,因此這些數(shù)據帶來了存儲開銷的膨脹。通過引入歸檔方式把部分數(shù)據存儲到冷設備,從而解決這一問題。目前支持3種數(shù)據歸檔方式:周期性的歸檔,強制性的歸檔,基于內存的歸檔。
周期性的歸檔。 默認情況下,每5分鐘數(shù)據會歸檔一次。后臺歸檔管理任務周期性檢測AM日志配置的大小,一旦超過限制DataLog,IndexLog,F(xiàn)ilterLog會歸檔到冷設備存儲。
強制性的歸檔 無論歸檔是否開啟,用戶都可以調用接口強制性歸檔。 接口上既支持全量歸檔,也支持基于偏移量的增量歸檔。
基于內存的歸檔 當周期性歸檔持續(xù)低于高速寫入的數(shù)據量時內存會溢出,為避免這種情況,引入基于內存大小的歸檔機制。當系統(tǒng)內存達到自定義的閾值時,內存分配被阻塞,直到所有的AM歸檔到冷數(shù)據。
編碼 歸檔時HeaderLog默認采用LZ4壓縮,IndexLog和FilterLog采用Delta壓縮。 解壓在讀取的時候由底層引擎完成,通過引用計數(shù)避免歸檔線程與讀取線程之間的并發(fā)性訪問。
核心技術點
Atomic MultiLog
Atomic MultiLog是整個系統(tǒng)的核心技術點。主要包括DataLog,IndexLog, FilterLog, AggregateLog以及如何原子性的操作這些日志。
DataLog 分為2部分offset和原始數(shù)據點,offset是原始數(shù)據的唯一標識。
IndexLog 是datalog的索引部分,采用radix樹組織索引,radix樹是通用的字典類型數(shù)據結構,比如在監(jiān)控場景中的IP地址,網絡地址有大量的prefix是可以共享的。
FilterLog 存儲了基于時間窗口切分的原始數(shù)據offset,按照radix樹索引filter和窗口。
AggregateLog 同其它日志相似,也是基于時間分片的索引數(shù)據方式。由于聚合日志需要讀后寫,設計了thread-local的集合來保證安全訪問。
集成方式:
Confluo是一個開源C++項目。有2種集成模式:
總結
大名鼎鼎的riseLab新鮮出爐的Confluo,核心創(chuàng)新在于數(shù)據結構Atomic MultiLog,可以支持高速并發(fā)讀寫,單核可以運行1000個trigger,10個Filter。非常好的一個閃光點,找到某個特定業(yè)務場景,采用新硬件的原子操作和無鎖日志做到了實時,離線,高速寫入的統(tǒng)一。