1. 程式人生 > >citus調研(三)- 優勢與限制

citus調研(三)- 優勢與限制

當前調研基於citus7.5

開源協議

citus的開源協議是GPL v3, 意味著修改和使用其程式碼都需要開源,但是這是建立在軟體分發的基礎上,如果使用程式碼作為服務提供,而不分發軟體,則不需要開源。

功能優勢

  • 只是PostgreSQL的一個extension;基本相容PostgreSQL的sql處理能力、管理工具、效能優化和功能擴充套件等
  • 支援分散式事務;citus使用2pc保證資料的最終一致性
  • 支援兩種執行器;real-time(預設)和task-tracker執行器,可根據實際應用場景選擇執行器
  • 橫向擴充套件方便;citus增加worker節點非常方便,只需要簡單的幾步操作即可完成擴充套件
  • 分片表管理簡單;分片表刪改與普通表差別不大,且citus提供了大量的函式檢視分片表的狀態,管理分片
  • 支援並行查詢;citus在接收到分散式請求之後,會生成分散式執行計劃,並將各個子任務下發到相應的worker節點執行
  • 支援聚合下推; citus執行聚合時先在涉及到的worker節點進行初步處理,再在coordinator節點彙總計算。
  • 成功案例較多;蘇寧、cisco等
  • 支援批量資料載入;
  • 支援實時增刪改查;
  • 支援常用DDL;

real-time執行器是coordinator節點直接與worker節點互動,容易造成併發大,可能導致資源瞬間增長

task-tracker執行器是coordinator節點與worker節點上的task-tracker程序互動,由task-tracker程序負責worker上的任務排程,支援資料重分佈,併發數可控

功能限制

  • 不能保證全域性的一致性讀;2pc的最後一步,一部分子事務還未提交時,讀取資料庫可能會得到不正確的結果
  • 社群版不支援平滑擴容;citus新增新的worker節點後,現有的分片表和參考表卻不會自動分佈到新加的worker上。
  • 社群版CN可能成為效能瓶頸;社群版只支援一個coordinator
  • 本地表不能與分片表、參考表混用;
  • 分片列不支援更新;
  • SQL限制;

【平滑擴容問題】

如果要手工處理,需要以下幾步:

  1. 新增節點;
  2. 複製分片;將原有的worker上的分片移動一部分到新節點上(邏輯複製)
  3. 切換元資料;分片資料同步完成後,鎖表,修改元資料中的分片資訊
  4. 清理原有worker上已被複制的分片和publication,清理新節點上的subscription

注意:citus的分片表之間存在親和性關係,具有親和性的所有分片表的同一範圍的分片其所在位置必須相同。因此移動某個分片時,必須將這些親和分片捆綁移動。

企業版可以利用master_move_shard_placement()函式遷移分片,我們可以也實現一個介面類似的函式(未進行嚴格測試,且不支援多CN架構)來實現分片遷移

【CN效能瓶頸問題】

citus的架構中正常只有1個CN節點,有時候CN會成為效能瓶頸。在citus的具體實現中,CN和worker的區別就在於是否儲存了相關的元資料,如果把CN的元資料拷貝一份到worker上,那麼worker也可以向CN一樣工作,這個多CN的模式早期被稱做masterless。當前的citus版本,有一個開關,開啟後,會自動拷貝CN的元資料到Worker上,讓worker也可以當CN用。 這個功能官方稱做Citus MX,社群版雖然沒有公開說支援,但也沒有從程式碼上限制這個功能,也可以用(已驗證)

SQL限制

查詢

  • Join限制(已驗證)
  1. 不支援2個非親和分片表的outer join
  2. 僅task-tracker執行器只是2個非親和分片表的inner join
  3. 分片表和參考表outer join時,參考表只能再left join的右邊或者right join的左邊
  • 子查詢限制
  1. 不能出現order by ,limit,offset
  • 不支援的特性
  1. CTE
  2. 視窗函式
  3. 集合操作,比如union
  4. 非分片列的count(distinct)

更新

  • 不支援跨分片的更新SQL (有疑問)
  • 不支援跨分片的事務(有疑問)
  • insert into ... select from ...的支援有限制
  1. 源和目標表必須是親和分片表
  2. 不允許出現Stable and volatile函式
  3. 不支援LIMIT,OFFSET,視窗函式,集合操作,Grouping sets, DISTINCT

DDL

ALTER TABLE只支援以下子命令 Only ADD|DROP COLUMN, SET|NOT NULL, DEFAULT, CONSTRAINT Only ADD|DROP COLUMN, SET|NOT NULL, DEFAULT, CONSTRAINT FOREIGN KEY and TYPE subcommands are supported.

效能

官方資料

citus與原生PostgreSQL效能對比:

citus PostgreSQL(9.6.4)
測試資料 114萬行(表結構未知)
測試環境

coordinator(4 vcpus/7.5G/1T)  (+1HA)

worker(8 vcpus/61G/1T)*4  (+4HA)

未知
copy寫入 94秒/88秒 454秒/109秒
建立索引 109秒 8秒
查詢效能 941毫秒 68毫秒
查詢延時 2毫秒 37毫秒

第三方資料

citus與原生PostgreSQL效能對比

環境配置:(ECS 32核,128G記憶體,2TB 雲盤) * 9 

環境 test case TPS coordinator 節點CPU資源消耗 worker節點CPU資源消耗
citus(1+8) shard=8 1億 tpc-b 只讀 16.3萬 (0% IDLE) (92% IDLE)
citus(1+8) shard=128 1億 tpc-b 只讀 16.4萬 (0% IDLE) (91% IDLE)
local PG 1億 tpc-b 只讀 49萬 - (0% IDLE)
citus(1+8) shard=8 1億 tpc-b 讀寫 1.28萬 (45% IDLE) (91% IDLE)
citus(1+8) shard=128 1億 tpc-b 讀寫 1.11萬 (36% IDLE) (91% IDLE)
local PG 1億 tpc-b 讀寫 3.98萬 - (0% IDLE)

citus與原生PostgreSQL隨機更新效能對比

環境配置:未知,citus 8 worker

部署方式 TPS 備註
單機PostgreSQL 134030
citus 55717 coordinator是效能瓶頸
citus(不解析SQL) 75973 改citus程式碼
citus(masterless) 20W+

注:把coordinator的元資料拷貝一份到worker上,那麼worker也可以向CN一樣工作,這個多CN的模式早期被稱做masterless。上述測試資料中masterless場景CN的個數未知。

citus與Deepgreen效能對比

環境配置:(ECS 32核,128G記憶體,2TB 雲盤) * 9 

【TPC-B】

citus DeepGeen
TPC-B(只讀) 16.4萬 tps 187 tps
TPC-B(讀寫) 1.11萬 tps 17 tps

【TPC-H】

query序號 citus(秒 ) DeepGreen(秒 )
1 12 3
3 77 4
4 2 7
5 234 2
6 1 0
7 465 23
8 415 5
9 837 12
10 116 4
14 67 5
15 232 6
19 76 3