Greenplum能做什么?
- 數倉 / OLAP / 即席查詢
- 混合負載 / HTAP
- 流數據
- 集成數據分析
- 數據庫內嵌機器學習
- 現代 SQL
核心架構
-
架構圖
-
Master Host:
- 主節點, 負責協調整個集群
- 沒有數據, 只有用戶的元數據
-
Standby Master: 備份主
-
Segment Host:
- 每個Segment都是一個單節點的PostgreSQL數據庫。
- 包含用戶的實際數據, 會等待master給它分配實際任務, 然后進行相互協調執行。
- 每個Segment對應在另外一個節點上會有一個鏡像(mirror), 當這台Segment掛了之后, 它的鏡像就會自動提升為primary, 從而實現高可用。
-
可以隨着業務的擴充進行線性擴展
-
每台機器都是獨立的, 機器之間通過Interconnect進行網絡通訊, 因為又被稱為MPP無共享架構。
數據分布
-
多種分布策略:
- Hash, 隨機, 復制表等
-
最重要的策略和目標是均勻分布: 每個節點 1/n 數據
多級分區
多模存儲 / 多態存儲
- 通常情況下, 數據價值隨着時間越來越低, 所以會有不同的對應處理模式。
- 就比如說一張銷售表:
- 最近3個月的數據, 我們可能要做的是對數據的完善及更新。
- 距今3個月到1年的數據, 我們可能做的最多的是做一些查詢, 聚集, 報表。
- 1年前+數據, 訪問較少。
- 對應存儲模式:
- 1年前+數據:
- 采用外部表技術, 數據不放在Greenplum中, 比如hdfs, amazon S3中。
- 無縫查詢所有數據:
- Text, CSV, Binary, Avro, Parquet, ORC格式
- 距今3個月到1年的數據:
- 使用列存儲, 更適合壓縮(不同列可以使用不同壓縮方式: gzip, quickz, delta, RLE, zstd), 查詢列子集時速度快。
- 最近3個月的數據:
- 使用行存儲, 適合OLTP業務, 適合頻繁更新或者訪問大部分字段的場景。
- 1年前+數據:
查詢支持
-
Apache ORCA: 專為復雜查詢而生的優化器
- 可以做到比較好的動態分區裁剪
- 處理比較復雜的子查詢, 或CTE(是一個命名的臨時結果集,僅在單個SQL語句(例如SELECT,INSERT或DELETE)的執行范圍內存在)
-
數據shuffle
-
其他技術:
- 高效壓縮算法
- 多階段聚集
- 復制表
- Unlogged table
- 物化視圖
- 一致性hash
- 在線擴容
- 安全性
混合負載 / HTAP
-
OLTP 優化技術
- 全局死鎖檢測 (GDD): 6版本之前用表鎖, 優化有使用行鎖。
- 鎖優化: 有一個鎖競爭比較嚴重, 優化。
- 事務優化
- 復制表
- 多模存儲
- 靈活索引
- OLTP 友好的優化器
- 內核升級: PostgreSQL 9.4
-
資源管理
特性 資源組(Resource Group) 資源隊列(Resource Queue) 並發控制 事務級別 語句級別 死鎖 無 極端情況下會出現 CPU管理 基於比例、基於cgroup 基於粗粒度的優先級 CPU 空閑利用率 可以充分利用空閑CPU 部分利用 內存限制 精細 粗粒度 組內內存共享 T F 動態修改資源配置 T 部分 排隊 無並發槽位或者內存配額時 無並發槽位時 管理DDL、Utility語句 T F Segment級別監控管理 T F 基於規則的資源管理 T F
細粒度多級內存管理
企業案例
- 如果對TP業務不是追求極致, 可以考慮Greenplum。
流數據(准實時)
-
Greenplum Kafka Connector
- 該組件的目的是將Kafka Topic中 partition的數據高效導入到Greenplum中。
- 可以看到最終gpss會將數據並行地導入到每個Segment中而不需要通過master, 效率較高。
集成數據分析
-
各種數據類型: 結構化、半結構化、非結構化
數據融合
- 數據全都放到Greenplum中的話代價還是很大的。
- 過去會將全部數據從別的平台拉取到Greenplum, 涉及比較復雜的etl過程
- 4版本后的數據融合功能, 不需要拉取數據到Greenplum, 只要在Greenplum上寫SQL就可以查詢存儲在不同數據中的數據。
PXF 架構
- 可以在Greenplum中定義一個外部表, 此外部表通過PXF協議指定到hadoop, hive, hbase, 數據庫s3等。
- 我們只需要在Greenplum上寫一個SQL, 底層就會自動去對應的存儲系統中拿取數據。
- 如果底層是Hive的話, PXF還可以做到謂詞下推。
基於 SQL 的數據庫內嵌機器學習
-
數據量越大, 模型精度越大。
-
SAS: 需要對數據進行抽樣后再訓練, 會損失部分精度, 只能用一個節點進行訓練。
-
希望對全量數據進行運算, 將算法內嵌到數據庫中, 可以使用數據庫的並行計算能力。
-
apache madlib
- 在每個Segment上集成成成Keras或者tensorFlow, 可以使用每個節點上的GPU資源。