SQL計算能力是指根據業務SQL生成最優執行計劃,通過算子下推、并行執行和RDA等技術,提升分布式執行效率。
-
算子下推:
- 在Sharding的單節點執行或當增刪改查等不需要DN節點間數據交互的場景下,CN節點將SQL直接下發至DN跨節點執行。
- 在關聯查詢等需要DN節點間數據交互的場景下,CN將執行計劃下發給DN,DN間通過RDA網絡框架完成數據重分布。
-
并行執行:節點間支持DDL、DML等SQL語句并行執行;節點內支持基于數據頁的并行查詢。
-
RDA( Remote Data Access ):RDA模塊實現的重分布邏輯分為三個模塊,分別是RDA算子模塊,Backend和Forwarder模塊之間通信的內存管理模塊,網絡通信模塊Forwarder。
- RDA(Remote Data Access)算子是指進行遠程數據訪問的數據庫算子。其生命周期中包括RDAInit、RDAExec和RDAEnd。
- RDAInit:在RDAInit階段,初始化RDA算子所需的資源,包括數據緩沖區和共享內存文件,把共享內存文件名通過Socket發送給本節點forwarder進程。
- RDAExec:在RDAExec階段,RDA算子需要完成兩方面的工作:1.數據在集群范圍內的分發,每掃到數據,則按重分布鍵計算Dest節點,確定相應共享內存對象和緩沖區;先嘗試把數據寫共享內存,供forwarder進程讀取;若寫失敗,則寫緩沖區。2.算子拉取遠端數據進行本地計算,根據Src節點,確定相應共享內存對象和緩沖區;從共享內存讀取數據并寫入緩沖區,從緩沖區讀取一行數據進行計算。
- RDAEnd:在RDAEnd階段,關閉RDA算子資源,包括通知本地forwarder進程結束共享內存數據監聽、清理算子使用的緩沖區、關閉共享內存文件,然后結束算子運行。使用64位的全局sequence作為RDA算子的名字,sequence名字為rda_id。該sequence在系統初始化階段創建,需要考慮多個節點創建。
-
Backend和Forwarder模塊之間通過共享內存進行通信。 每個RDA對應一個共享內存塊,包含發送通道、接收通道共享內存,每個通道包含基本的通道信息和一個通信用的循環隊列。每個共享內存塊對應一個mmap文件,RDA開始通信時創建文件,通信結束關閉,對應的文件在ResourceOwner中管理,在事務結束時一起刪除。常發生時有可能導致對應的文件不能刪除,startup日志重放結束后清空該目錄。
-
網絡通信模塊Forwarder通過Socket在不同RDA之間傳輸數據。數據在集群范圍內的分發,下層算子的掃描數據tuple,計算重分布,若是本地處理的則保留,可返回給上層算子;若不是本地處理的,則根據dest_node_id寫入到共享內存或緩存tuplestore,供forwarder進程讀取。算子拉取遠端數據進行本地計算,根據Src節點,確定相應共享內存對象和緩沖區;從共享內存讀取數據并寫入緩沖區,從緩沖區讀取一行數據進行計算。
RDA主要用于解決重分布場景的進程數暴增問題,DN節點間數據傳輸走RPC,每個Datanode只會有1個會話進程。
SQL計算具體執行過程如下:
-
業務應用下發SQL給CN節點 ,其中SQL可以包含對數據的增(insert)、刪(delete/drop)、改(update)、查(select)。
-
CN節點利用數據庫的優化器生成執行計劃,每個DN節點會按照執行計劃的要求去處理數據。
-
為確保數據均勻分布在每個DN節點,DN節點之間需進行數據傳遞。
說明因為數據是通過一致性Hash技術均勻分布在每個節點,因此DN節點在處理數據的過程中,可能需要從其他DN節點獲取數據。同時,TeleDB可通過RDA網絡框架降低數據重分布的資源消耗。
-
DN節點將結果集返回給CN節點進行匯總。
-
CN節點將匯總后的結果返回給業務應用。