關于 OLTP 系統和 OLAP 系統的核心設計思想
數據存儲系統的關于查詢的典型操作:
-- 第一種需求: 根據 key(1) 找 value(name,age), 單點查詢
select name, age from student where id = 1; student:map id=1, value=(name,age)
-- 第二種需求: 根據 department 統計平均年齡, 全表查詢
select name, age from student where age > 30; 全表掃描
select department, avg(age) from student group by department; 全表掃描
對于第一種需求來說:
- 如果數據量小,并且數據是結構化的,使用 MySQL 去存儲即可
- 如果數據量大,不管是不是結構化的,可以轉成 key-value 的存儲,使用 HBase,Cassandra 等來解決, OLTP 系統 KV 系統 來滿足
對于第二種需求來說:
- 如果數據量小,并且數據是結構化的,使用 MySQL 去存儲即可
- 如果數據量大,不管是不是結構化的,設計一個專門用來做分析的存儲計算引擎解決分析的低效率問題, 設計一個 OLAP 系統
OLTP存儲系統核心設計思想
OLTP 存儲系統,核心需求是 實現海量數據集中的低延時隨機讀寫操作
- 01、數據排序:在海量數據中要想保證低延時的隨機讀寫操作,數據最好是排序的
- 02、范圍分區:當數據排序之后,可以進行范圍分區,來平攤負載,讓多臺服務器聯合起來對外提供服務
- 03、內存 + 磁盤:保證處理效率,也保證數據安全
- 04、內存:必須經過設計,內存具備優秀的數據結構,保證基本的讀寫高效,甚至為了不同的需求,可以讓讀寫效率傾斜。
- 05、寫緩存:將為了實現數據有序而進行的低效率隨機寫轉換為內存隨機寫+磁盤順序寫的方式
- 06、讀緩存:將經常查詢的熱點數據緩存在內存中,提高查詢效率
- 07、磁盤:數據必須存放在磁盤,保證數據安全。磁盤數據文件必須經過精心設計,保證掃描磁盤數據文件的高效率
- 08、跳表:基于數據排序+范圍分區構建索引表,形成跳表的拓撲結構,方便用戶操作時快速定位數據分區的位置
- 09、LSM-Tree 存儲引擎:把隨機寫變成順序追加,在通過定期合并的方式來合并數據,去除無效數據,從而實現數據的刪除和修改。
- 10、布隆過濾器:快速判斷一個元素(1)是否存在于一個龐大集合內/文件中(100E),常數級別的執行效率
海量數據中,如果進行高效率的查詢的核心思想:設計一種架構,能夠快速把待搜尋的數據范圍降低到原來的 1/n,然后再結合索引或者熱點數據放在內存等思路,就能實現高效率的查詢了。
OLAP存儲系統核心設計思想
核心需求是 實現海量數據集中的高性能低延遲查詢分析功能
- 01、數據排序
- 02、數據分區分片 + 分布式查詢
- 03、列式存儲 + 字段類型統一
- 04、列裁剪
- 05、預聚合(搜索引擎: 輸入關鍵詞,搜索引擎根據關鍵詞到 數據庫 找到這個 關鍵詞對應的所有的 URL:這些 URL 就是提前計算出來的 )
- 06、利用CPU特性:向量化引擎,操作系統必須支持
- 07、主鍵索引 + 二級索引 + 位圖索引 + 布隆索引 等等各種索引技術
- 08、支持近似計算, pv 一個電商平臺的 sku 總數
- 09、定制引擎:多樣化的存儲引擎滿足不同場景的特定需要
- 10、多樣化算法選擇:Volnitsky高效字符串搜索算法 和 HyperLogLog基于概率高效去重算法
單條記錄的增刪改等操作,通過數據的橫向劃分,做到數據操作的快速定位,在海量數據查詢分析中,一般就是針對大量行少量列做分析,既然并不是全部列,那么把數據做縱向切分把表中的數據按照列來單獨存儲,那么在做分析的時候,同樣可以快速把待查詢分析的數據總量降低到原來表的1/n,同樣提高效率。而且對于常用的聚合邏輯的結果,也可以提前算出來緩存起來用來提供效率,這就是預聚合技術。
Kylin 是一個把預聚合技術發揮到極致的一個 OLAP 技術,詳細見:OLAP引擎——Kylin介紹
它的缺點如下: - 1、預聚合只支持固定的分析場景,無法滿足自定義分析場景,所以預聚合只能作為一種可選方案
- 2、維度組合爆炸會導致數據膨脹,這樣會造成不必要的計算和存儲開銷。無必要的維度組合的計算就屬于浪費資源
- 3、大概率數據都是增量生成,預聚合不能進行數據更新。所以會產生大量的重算。