《Citus插件實現原理解讀(27頁).pdf》由會員分享,可在線閱讀,更多相關《Citus插件實現原理解讀(27頁).pdf(27頁珍藏版)》請在三個皮匠報告上搜索。
1、Citus插件實現原理解讀阿里云PolarDB PG數據庫團隊|陳佳昕(步真)什什么么是是CitusuCitus是一款基于PostgreSQL數據庫的開源插件,用于將單集群的PG數據庫橫向擴展為多集群的分布式PG數據庫。其提供了分布式數據庫常用的兩種表類型:u分布表u復制表u主要作用:u通過分布式多路路由,提升數據庫事務處理能力(OLTP)u通過并行化處理機制,提升數據庫分析處理能力(OLAP)u來源:由CitusData公司研發,后被微軟公司收購,保持跟進最新的開源PostgreSQL社區分支功能特性。Citus的的4種種目目標標業業務務場場景景u多租戶場景(Multi-tenant)背景:
2、傳統的基于SaaS云服務應用場景下,應用程序可能根據不同的租戶數據,存放在不同的數據庫下,從而實現租戶間數據隔離。問題:成千上萬的庫之間的跨庫訪問,以及多個庫基礎設施組件的維護會帶來極大的成本問題和管理問題。Citus的的4種種目目標標業業務務場場景景u多租戶場景(Multi-tenant)Citus應對方案:基于租戶id進行分片,相同分片的數據可以定向到同一節點上,絕大部分SQL都可以路由到指定單節點執行,能夠繼承PostgreSQL的查詢能力,擴展性強。Citus的的4種種目目標標業業務務場場景景u實時分析(Real-time Analytics)背景:大數據量下毫秒級響應需求查詢,額外伴
3、隨數據表的更新(TP+AP場景)。PG數據庫的優勢:特有的堆表格式+MVCC機制保證了多并發讀寫的高性能 支持COPY,可實現數據批量寫特有的數據類型和索引類型(array,json和自定義數據類型)PG數據庫的不足:單庫承載的數據容量有限早期不支持并行查詢,查詢只能單進程進行。Citus應對方案:Parallel Bulk Insert,Parallel Insert.Select,Parallel Select等并行功能Citus的的4種種目目標標業業務務場場景景u高性能數據處理(High Performance CRUD)PG數據庫的不足:缺乏undo機制使得數據更新會帶來數據膨脹,au
4、to vacuum使得高并發下數據庫壓力大大量連接會話引入內存過多,極易打滿單庫機器內存上限Citus應對方案:數據分片打散,提高硬件資源利用率。支持并行化auto vacuum。Citus的的4種種目目標標業業務務場場景景u數據倉庫(Data warehouse)Citus應對方案:支持并行分布式查詢支持列存引擎。Citus的的實實現現架架構構uSQL ObjectsCREATE TABLE pg_dist_node();CREATE TABLE pg_dist_partition();CREATE FUNCTION citus_add_node()RETURNS void LANGUAGE
5、 cAS$libdir/citus,$function$citus_add_node$function$;CREATE FUNCTION create_distributed_table()RETURNS void LANGUAGE cAS$libdir/citus,$function$create_distributed_table$function$;uShared Library#include“postgres.h”Datum citus_add_node()Datum create_distributed_table()Citus的的實實現現架架構構u集群部署結構 Citus的的實實
6、現現架架構構表類型u分布表(co-location)SELECT create_distributed_table(items,user_id);SELECT create_distributed_table(users,user_id,colocate_with=items);u復制表SELECT create_reference_table(categories);u本地表CREATE TABLE sessions();Citus的的實實現現架架構構元數據管理 Citus的的實實現現架架構構元數據管理 Citus的的實實現現架架構構PostgreSQL插件APIu自定義SQL函數:插件的S
7、QL函數以及對應的C函數。更新與管理citus元數據uPlanner/executor hook:分布式計劃與分布式執行uCustomScan節點:分發與執行分布式計劃u事務回調:分布式事務,兩階段事務管理。uUtility hook:分布式DDL、COPY。uCitus Daemon進程:后臺常駐守護進程。節點探活、全局死鎖檢測、crash recovery狀態恢復。Citus的的實實現現架架構構SQL Demo:跨節點的數據表查詢Citus的的實實現現架架構構upostgres.cplanner_hook_type planner_hook=NULL;PlannedStmt*planner
8、(Query*parse,.)PlannedStmt*result;if(planner_hook)result=(*planner_hook)(parse,.);else result=standard_planner(parse,.);return result;ucitus.cvoid _PG_init(void).planner_hook=distributed_planner;.PlannedStmt*distributed_planner(Query*parse,.).Citus的的實實現現架架構構u分布式計劃PlannedStmt*distributed_planner(Quer
9、y*parse,.)bool needsDistributedPlanning=false;/1.預校驗是否產生分布式計劃產生 List*rangeTableList=ExtractRangeTableEntryList(parse);/遞歸遍歷查詢樹與子查詢樹 needsDistributedPlanning=ListContainsDistributedTableRTE(rangeTableList);/2.滿足fast path規則,通過FastPathPlanner產生計劃樹 if(needsDistributedPlanning&FastPathRouterQuery(parse)r
10、esult=FastPathPlanner(parse,.);/3.不滿足fast path規則,通過standard_planner產生計劃樹 else result=standard_planner(parse,.);/4.產生分布式計劃 if(needsDistributedPlanning)result=CreateDistributedPlannedStmt(result,parse,.)return result;Citus的的實實現現架架構構分布式計劃uCreateDistributedPlannedStmt單表,SELECT查詢,帶分布鍵的過濾條件。select*from te
11、st where key=100;Citus的的實實現現架架構構分布式計劃節點CustomScanuCustomScan:PG提供的一個自定義掃描節點??蓪崿F一系列執行器的Begin,Exec,End,Re-scan等回調函數處理邏輯。uCitus使用了該節點用于擴展實現分布式計劃。uCustomScan存儲了分布式計劃DistributedPlan。uDistributedPlan中的workerJob,存儲了每個DN 節點的執行任務Citus的的實實現現架架構構JobTaskTaskTaskTasktasklistCitus的的實實現現架架構構uTask是如何產生的queryString:
12、Task執行的sql語句taskPlacementList:Task需要發往的DN節點路由relationShardList:Task包含的shard idCitus的的實實現現架架構構u分布式計劃執行Citus的的實實現現架架構構u事務管理(單節點事務)Citus的的實實現現架架構構u事務管理(跨節點分布式事務)Citus的的實實現現架架構構u事務管理(全局死鎖檢測)總總結結Citus節點主要分為CN和DN,CN不存儲真實數據,只存儲數據分布的元信息,實際的數據被分成若干分片,打散到不同DN上,應用連接CN,CN進行SQL解析,生成分布式執行計劃,下發到DN執行,CN將結果匯總返回客戶端。u 有兩種表類型:分布表和復制表,復制表每個DN節點都有一份完整的副本,分布表則會打散分布到不同DN節點中。u 可以通過增加多個CN讀節點增加集群讀的能力,實現讀寫分離,寫CN和讀CN之間使用流復制進行元數據同步。u 支持MX模式,可以將元數據也存在某些DN中,這樣使得DN能夠直接提供寫的能力,增加集群寫的能力。u DN節點之間可以通過流復制來實現數據高可用。u 沒有全局事務管理,故不能保證數據的實時讀一致性。數據寫一致性使用2PC來保證。THANKS謝謝觀看