天天看點

PolarDB-X 私有協定:提升叢集的性能和穩定性私有協定是什麼?私有協定的設計和實作性能對比展望參考文檔【相關閱讀】

作者:辰宇

私有協定是什麼?

PolarDB-X作為阿裡巴巴自主研發的雲原生分布式資料庫,通過将資料拆分到多個基于MySQL發展而來的存儲節點DN,每個存儲節點DN承擔合适的并發、資料存儲和計算負載,計算節點處理分布式邏輯,最終得到一個具有穩定可靠、高度擴充性的分布式關系型資料庫系統。計算節點和存儲節點之間的通信協定,即叢集内部通信協定,是系統的重要組成部分。

PolarDB-X 私有協定:提升叢集的性能和穩定性私有協定是什麼?私有協定的設計和實作性能對比展望參考文檔【相關閱讀】

PolarDB-X的前身為TDDL中間件,通過在應用端上采用 Sharding 技術,應對高速增長的資料量,由于後端統一為 MySQL,中間的通信協定為傳統 MySQL 的查詢協定。1.0時代的 DRDS+RDS 的組合也延續了之前中間件的技術路線,同樣采用 MySQL 的 SQL 查詢協定作為計算節點和存儲節點的資料傳輸協定。

雖然 SQL 表示查詢具有簡潔易讀,不用關心後端存儲的實體實作等優點,但對于進入2.0時代(雲原生分布式資料庫)的PolarDB-X來說,計算節點和存儲節點存在更多的資料互動,存儲節點也不僅僅承擔存儲和處理普通SQL查詢的功能,這時傳統的SQL查詢協定便顯得力不從心了。

傳統的SQL協定基于一問一答的阻塞式模型,是針對C/S模式的應用而設計的,沒有考慮兩個節點間承載大量會話的需要。而目前常見的分布式系統,特别是分布式資料庫,為了保證事務性,節點間需要維持多條處于不同僚物的會話。是以分布式資料庫在叢集内部往往都會實作一套自己的通信協定,通常都會選擇RPC方式實作。例如OceanBase基于 Libeasy 庫,實作了ObRPC,實作了叢集内異步化通信。TiDB則直接使用了gRPC作為和TiKV的通信協定。為了充分發揮PolarDB-X底層存儲的進階特性,同時解決傳統SQL協定作為内部通信協定的局限性,私有協定應運而生。基于私有協定的加持,可以繞過傳統的MySQL Server層的解析和優化開銷,直接和底下的InnoDB/X-Engine存儲引擎進行高效互動,同時擴充并支援了全局時鐘協定互動、Plan計算下推等能力,這也使得PolarDB-X逐漸脫離原有中間件的範疇,演變為雲原生的分布式資料庫。

PolarDB-X的私有協定作為計算節點和存儲節點之間的橋梁,主要實作查詢下發和結果回傳等基礎功能,同時針對一些常用的場景進行了特殊優化。私有協定不僅具備傳統SQL接口執行SQL查詢的功能,還能直接執行自定義的執行計劃,使得計算節點和存儲節點之間的互動更加靈活可控。同時為了提升網絡互動性能,改善高并發多連接配接場景下穩定性,私有協定設計時也借鑒了RPC的處理思路,采用了異步化協定設計、會話連接配接解耦、執行個體級連接配接池、流量控制等機制,解決了大部分使用傳統連接配接池遇到的問題,使得PolarDB-X的性能和穩定性都有所提升。

私有協定的設計和實作

相容性 & 擴充性

聊到網絡通信協定,首先需要考慮的就是協定相容性。作為分布式系統,整個系統的變更都不可能是一步完成的,在更新或變配過程中,都可能出現多個不同版本的用戶端或服務端。特别是在PolarDB-X中,存在計算節點和存儲節點,在進行更新時,每個節點都可能存在更新前後兩個版本,若通信協定發生了更新,則需要協定具備向前向後相容的能力。

PolarDB-X私有協定在設計時充分考慮了這種情況,除了定長的協定頭,所有通信協定消息均使用protobuf進行序列化,即使新增了額外的字段,舊版本的節點也能正常工作。考慮到系統的演進,私有協定支援基于SQL語句的查詢,實作對SQL接口的完全替換,這部分擴充了MySQL官方的MySQL X protocol的實作,提供最大的相容性。如下展示了PolarDB-X私有協定中SQL執行的message定義,在原有StmtExecute基礎上,增加了一些額外字段,提升了會話上下文恢複速度,可避免通過額外SQL進行設定。

message StmtExecute {
  optional string namespace = 3 [ default = "sql" ];
  required bytes stmt = 1;
  repeated Polarx.Datatypes.Any args = 2;
  optional bool compact_metadata = 4 [ default = false ];

  // Extended fields for fast context restore.
  optional string schema_name = 5;
  repeated Polarx.Datatypes.SessionVariable session_variables = 6;
  optional string encoding = 7;
  optional int32 token = 8;

  optional bool reset_error = 9;
  optional uint64 snapshot_seq = 10;
  optional uint64 commit_seq = 11;
}           

會話連接配接解耦 & 異步化 & 流量控制

在傳統SQL接口中,一個TCP連接配接隻能運作一個SQL會話,考慮到傳統單機MySQL是作為一個服務端對外提供服務的,這個設計是非常合理的。但在PolarDB-X内部,MySQL被作為内部存儲,在分布式系統中,存在多個計算節點和存儲節點,在多連接配接複雜查詢的場景下,後端會話數會因為資料分片的情況被成倍的放大,這時一個TCP連接配接對應一個SQL會話這種實作反而會帶來局限性。因為TCP連接配接存在三層握手、核心TCP協定棧開銷、連接配接鑒權等原因,使得動态擴容連接配接數是非常重的操作,而保留大量連接配接不僅耗費了大量系統資源同時增加了維護連接配接可靠的成本。

針對傳統SQL接口連接配接池的局限性,PolarDB-X私有協定采用了會話連接配接解耦的政策,即采用在協定標頭中添加SessionId字段,标記會話ID,實作在同一個TCP連接配接上并行運作多個SQL會話。

struct {
  uint64 sid; // Session id. Default -1.
  uint32 length;
  uint8 message_type;
  opaque message_payload[Message.length - 1];
} Message;           
PolarDB-X 私有協定:提升叢集的性能和穩定性私有協定是什麼?私有協定的設計和實作性能對比展望參考文檔【相關閱讀】

在PolarDB-X的存儲節點上,使用一個獨立的排程線程處理TCP上收到的消息,該線程負責會話的建立及生命周期管理,同時将解碼後的消息放到對應的會話FIFO隊列中,由MySQL的任務執行線程進行執行,指令執行完成後,由session所在TCP的socket傳回執行結果。

PolarDB-X 私有協定:提升叢集的性能和穩定性私有協定是什麼?私有協定的設計和實作性能對比展望參考文檔【相關閱讀】

基于PolarDB-X存儲節點請求處理的FIFO特性,PolarDB-X計算節點使用異步調用和請求流水線的方式,最大化降低多指令的延遲。

多會話複用TCP連接配接,雖然降低了會話開銷,但帶來的額外的局限,最典型的問題則是多個session對于TCP通道的争搶。舉個簡單例子,一個TCP連接配接上,有一個點查和一個全表掃描的請求,計算節點全表掃描的消費速度沒有發送快,導緻該TCP通道被全表掃描的資料占據,點查結果無法及時發送過濾。針對這種場景,PolarDB-X私有協定設計了令牌機制,通過令牌對存儲節點的生産者進行背壓,而不是通過TCP的滑動視窗,進而保證短查詢的時效性。同時在連接配接使用政策上,優先使用空閑連接配接,而不是優先複用,盡可能避免争搶的情況。

執行計劃傳輸

SQL雖然能精簡地描述一個查詢,但這是需要額外使用解析器和優化器為代價的,在PolarDB-X中,計算節點和存儲節點之間的資料傳輸指令也是用SQL實作的。但是在點查等簡單的查詢場景下,SQL的解析優化也成為制約存儲節點吞吐量的一個瓶頸。PolarDB-X私有協定結合計算節點的特性,在優化階段将下推執行的查詢直接轉換為特殊的執行計劃。存儲節點通過私有協定收到執行計劃後,不用進行SQL解析和優化,直接進行資料的讀取和處理。在實際測試中,同樣吞吐量下,使用執行計劃相對于使用SQL查詢,存儲節點的CPU的降低了50%,查詢平均延遲也有近30%的下降。

進階查詢特性支援

在OLAP任務中,常需要從存儲節點拉取大量資料到計算節點進行處理,這對傳輸協定也是很大的挑戰。PolarDB-X計算節點在記憶體中使用緊湊的列式資料存儲結構,并借助向量化提升資料處理速度。PolarDB-X私有協定針對這種應用場景,通過自定義的傳輸格式的方式,可以直接以列式方式傳輸結果集,繞過傳統傳輸協定行式傳輸帶來的計算節點行轉列的損失。同時針對列式資料格式的特性,後續也将具備壓縮及壓縮後計算的能力,進一步優化網絡和記憶體的開銷。

在複雜查詢中,不僅傳輸的資料量大,同時複雜join也是非常常見的情況。通過添加runtime filter是一種有效的優化方法,但是在基于傳統MySQL作為存儲單元的情況下,這種進階過濾難以通過SQL進行表示。PolarDB-X中使用私有協定實作了bloom filter的傳遞,直接在存儲節點上對資料進行過濾,極大減少了網絡傳輸的壓力。更多有用的進階查詢特性,例如存儲節點資料按規則主動分發、狀态推送等也将逐漸增加到PolarDB-X私有協定之中。

性能對比

使用私有協定後,最直接效果則是性能的提升,在點查場景下,私有協定相對于走SQL協定能極大降低後端存儲的壓力,同時提升吞吐量。

sysbench-select

  • 1.6億行資料
  • 300并發
  • 計算節點和存儲節點規格均為16c64g
  • +39%
PolarDB-X 私有協定:提升叢集的性能和穩定性私有協定是什麼?私有協定的設計和實作性能對比展望參考文檔【相關閱讀】

sysbench-oltp

  • 150并發
  • +14.4%
PolarDB-X 私有協定:提升叢集的性能和穩定性私有協定是什麼?私有協定的設計和實作性能對比展望參考文檔【相關閱讀】

展望

PolarDB-X私有協定實作了對MySQL傳統SQL查詢協定的替換,并針對分布式資料庫的特殊場景進行了擴充和改造。未來将在查詢性能、網絡開銷和功能擴充上進一步優化和改造,提升PolarDB-X計算節點和存儲節點的互動效率,為高性能PolarDB-X奠定堅實的基礎。

參考文檔

TiKV 源碼解析系列文章(一)序 一文詳解OceanBase通信協定層 Introduction to gRPC Core concepts, architecture and lifecycle

【相關閱讀】

技術解讀 | PolarDB-X 分布式事務的實作 技術解讀 | PolarDB-X 強一緻分布式事務 PolarDB-X 一緻性共識協定 (X-Paxos)