天天看點

【優質技術文章推薦】TiDB for PostgreSQL—牛刀小試

作者:alexshen​

【目錄】

一、誕生背景

二、開發目的

三、開發進度

四、預期功能

五、結語

【正文】

  作為資料庫領域國際頂級開源項目,TiDB 以其分布式高可用、高度彈性擴縮容、高性能并行叢集處理能力等特性獲得越來越多客戶的使用,其中不僅僅有網際網路、遊戲領域的企業,還有金融、大型企業等。因為 TiDB 高度相容 MySQL 協定,使這些企業原本基于 MySQL 資料庫建構的上層業務系統能夠以較低的代價快速遷移到TiDB上。TiDB for PostgreSQL 是我們基于 TiDB 源碼修改的一款滿足 PostgreSQL 協定的資料庫。我們的理念就是為了讓基于 PostgreSQL 的系統能夠在不修改本身業務代碼的前提下,快速的遷移到分布式資料庫上。

一、 誕生背景

  2020年的疫情對中國整個社會都産生了巨大的影響,尤其是在疫情的暴風眼城市–武漢,而神州數位武漢雲基地就在這座城市。當時我們參與的疫情相關的項目中,有些曆史業務系統基于PostgreSQL搭建的,在資料量和并發量激增的情況下,增加了資料庫運維的難度,于是我們開始着手向可擴充、高可用的分布式資料庫遷移。

  PostgreSQL依靠加利福尼亞大學的支援,擁有許多資料庫前沿實驗性功能,其學術性之強、功能面之廣使其收到許多企業和工程師的青睐。PostgreSQL的協定更接近大型企業常用的Oracle資料庫,是以在企業中的應用廣泛。它的多表關聯、多列關聯的文法特性是許多應用系統正常運作所必須依賴的。當我們遷移到TiDB遇到種種問題時,我們萌生了一個想法——基于TiDB源碼修改以相容PostgreSQL協定。

  神州數位在2017年開始接觸TiDB,不僅在企業内部宣傳分布式資料庫的概念以及前景,而且更加注重TiDB的實施與實踐,想讓更多公司的内部系統用上TiDB,享受分布式資料庫帶來的便利。TiDB 擁有分布式處理和存儲資料特性、無限擴容和高并發并行處理等一系列優點。在實踐過程中,TiDB确實沒有讓我們失望,尤其是在高可用上,雖然發生過因為硬體導緻的單一節點故障問題,但是整個叢集從未下線,業務未受影響。另外TiDB也是中國資料庫領域開源的先鋒, 我們不斷學習TiDB、TiKV、PD的源碼,甚至用Golang對TiKV進行部分功能模拟重寫,雖然隻模拟了 1% 的主要功能,但我們對 TiDB 的優缺點有了更為深刻和細緻的了解。

  針對 TiDB目前隻支援MySQL協定這個問題,在2021年1月,我們開始進行深入的調研工作,對比了MySQL 與 PostgreSQL 兩種資料庫協定的差異。在參考二者官方文檔的同時,也進行頻繁的抓包來分析二者通信封包的差別。在這個過程中,我們總結經驗,将二者協定上的差別組織成文章分享到知乎等平台,感興趣的小夥伴可以通過連結( ​​https://zhuanlan.zhihu.com/p/366275680​​ ) 檢視這篇文章。

  MySQL 與 PostgreSQL 都是市面上非常流行的資料庫産品。根據資料庫排行網站 DB-Engines(​​https://db-engines.com/en/ranking)​​ 最新資料庫流行程度排行榜(如下圖),我們可以看到,在開源資料庫領域,PostgreSQL 流行程度緊跟在 MySQL 身後。

【優質技術文章推薦】TiDB for PostgreSQL—牛刀小試

  随着資訊時代資訊量爆炸式增長,資料庫逐漸成為限制系統性能的最大瓶頸。對于資料庫擴容的解決方案,正常的都是分庫分表。PostgreSQL 對于分庫分表也有插件可以支援,但是存在諸多問題,例如自行維護主庫和各個從庫之間的資料同步、備份與容災具有較高的運維技術門檻以及較大的成本支出等等,這些也是分布式資料庫想要解決的問題。目前TiDB支援MySQL協定,在PG協定上我們暫時還沒找到解決方案。而在我們公司内部許多曆史系統,都是以PostgreSQL作為資料庫來運作。如今想要用分布式資料庫進行優化,雖然市面上有一些基于PostgreSQL的分布式資料庫,例如YugabyteDB或是 CockroachDB,但經過實際測試,這些資料庫很難完全相容基于PostgreSQL的業務系統。針對基于PostgreSQL資料庫的系統遷移到分布式資料庫的難題,我們想到在TiDB源碼的基礎上進行重構,使其相容PostgreSQL,為一些想要遷移到分布式資料庫的系統提供便捷,增加TiDB的覆寫範圍,是以有了 TiDB for PostgreSQL 的嘗試。

  為了更深入的了解TiDB for PostgreSQL的工作,我們特意拜訪了武漢大學PostgreSQL資料庫專家——彭煜玮教授,多次共同讨論TiDB支援PostgreSQL協定的改造方案及可行性,這裡也感謝彭老師給我們提供的建議。在他的幫助下,我們從PostgreSQL和TiDB兩個資料庫中同時下手,正式開始了TiDB for PostgreSQL的研發。

二、 開發目的

  重構 TiDB 源碼,使其相容原本并不支援的 PostgreSQL 協定,讓基于 PostgreSQL 的系統也能順利遷移到分布式資料庫上,這是我們一直在努力嘗試的事情。在資料庫方面,老系統遷移往往會遇到這樣一些問題,比如不同資料庫文法和功能上有較大差別,而老業務系統剛好使用了該文法特性;再比如 PostgreSQL 的 Inherit 文法、Returning句式等都是MySQL所不支援的。而 TiDB 高度相容MySQL協定,是以一些基于 PostgreSQL 資料庫建構的業務系統在遷移到 TiDB 的時候将可能遇到文法或者是功能不相容的問題。此時如果必須上TiDB ,那麼将不得不面臨龐大的代碼修改量以及功能測試的工作量。這些工作需要耗費大量的資源,過程緩慢且需要考慮的細節繁多,不利于客戶遷移到 TiDB 上。而開發 TiDB for PostgreSQL 就是為了彌補TiDB在 PostgreSQL 系統領域的空白,通過相容PostgreSQL協定,實作其特有文法和功能,滿足業務系統的需求,減輕系統遷移的代價。

  對于神州數位内部系統的技術規劃,在未來我們希望通過雲原生的理念,基于容器技術去建構上層應用服務,下層基于一個可以支援各種SQL協定的分布式資料庫。在這個統一的分布式資料庫平台上,結合低代碼開發平台,整個架構應該可以解決80%的企業業務系統需求,給各業務部門提供統一的資料庫PaaS平台和應用系統SaaS平台。

三、 開發進度

  TiDB for PostgreSQL 基于 TiDB 源碼改造以相容 PostgreSQL 主要有兩個方面的工作。

  一方面,我們在 TiDB 中實作了基本的 PostgreSQL 通信協定。 常見的PostgreSQL用戶端能夠連接配接到 TiDB for PostgreSQL。例如psql、PgAdmin、還有Navicat,都可以連接配接到TiDB for PostgreSQL。這個過程中除了實作基本通信協定外,還需要相容部分系統表和系統函數。

  Psql 連接配接:

【優質技術文章推薦】TiDB for PostgreSQL—牛刀小試

Navicat 連接配接:

【優質技術文章推薦】TiDB for PostgreSQL—牛刀小試

   另外一方面,相容 PostgreSQL 特有文法。 PostgreSQL 是一個學術性非常強的開源資料庫,其許多功能和文法都是 MySQL 等資料庫沒有的,是以這一方面的工作就十分龐大且艱巨。要在 TiDB 源碼基礎上實作新的文法支援要修改的子產品甚多,涉及的資料庫底層理論知識深度非一般人所想。就以目前我們團隊對 RETURNING 子句的實作來說,其修改的子產品就包括 Parser SQL解析子產品、計劃建構、計劃優化、執行計劃等子產品。這一方面的工作我們暫時沒有太大進展,需要在開源之後通過社群的力量來完成。

  下圖是TiDB for PostgreSQL執行RETURNING句式的示例:

【優質技術文章推薦】TiDB for PostgreSQL—牛刀小試

  早期在内部系統從PostgreSQL遷移到TiDB上來時,第一個方案是業務系統改造,進行了初步成本和工時預估,整個系統的遷移需要修改的PostgreSQL特性超過11種,SQL語句接近600多條,修改的同時還需要不斷測試,保證系統的正常運作,整個過程的成本和耗時都是非常高的。并且這僅僅隻是一個系統,那麼每一個系統在遷移時可能都需要進行重複的勞動,于是我們想要一個更好的方案,那就是TiDB for PostgreSQL。

  進行改造時,為驗證改造TiDB的可行性和實作難度,我們選擇現在使用較多且文法更為簡單的Sysbench。跑通Sysbench中PostgreSQL協定測試就成為了我們的首要目标。Sysbench在腳本中主要使用擴充查詢協定,由于PostgreSQL與MySQL協定有較大的差別,在具體實作上需要增加額外的通信步驟。MySQL的預處理查詢封包分兩個階段。第一個是Parse 階段,負責解析SQL,構造計劃。第二個是Execute階段,負責執行計劃,資料寫回。PostgreSQL與其功能類似的叫做擴充查詢,這個過程中可能存在五次封包通信, Parse(解析SQL)、Bind(綁定參數)、Description(參數描述)、Execute(執行)、Sync(同步)。

  我們花費一段時間對TiDB進行改造後成功實作了TiDB for PostgreSQL的擴充查詢功能。于是部署叢集,分别對相同硬體資源部署的TiDB for MySQL和TiDB for PostgreSQL進行Sysbench性能測試。Sysbench所有自帶測試腳本都能夠在其上面跑通。下圖是部分腳本的性能對比測試結果。藍色柱體代表TiDB for PostgreSQL,綠色代表TiDB for MySQL。(此測試僅用于對比同樣環境下兩者的性能差距,并不代表兩者的最優性能)

【優質技術文章推薦】TiDB for PostgreSQL—牛刀小試

  橫坐标代表延時情況,可以發現在多數情況下,比如删除、點查這些腳本測試時,二者性能相差不大。而少部分測試,比如插入、索引更新這些還存在一定的性能差距,這也是在意料之中的情況。大部分腳本測試性能差距不大,這說明不同的協定造成的性能影響較小。部分差距較大的情況可能是修改後的邏輯存在瑕疵導緻性能消耗較大,也有可能是偶然的實驗誤差。這些問題都可以在後續的開發測試中進行修複和完善。

  此外,PostgreSQL還有許多地方是需要我們去實作的,例如PostgreSQL系統庫、系統表、Schema結構、各種文法特性支援、部署運維的生态工具等等,每一個都是非常困難的。

  目前,我們内部正在整理相關文檔并開源,準備與大家分享更詳細的内容。

四、 預期功能

  目前我們修改了接近5000行TiDB源碼,基本實作了以下功能:

  • 基本協定(普通查詢和擴充查詢)
  • 部分錯誤資訊的相容
  • 使用者登入認證(MD5加密)
  • 部分系統表和系統函數

  但這僅僅隻是TiDB for PostgreSQL中的一小部分,我們仍然有以下的功能需要努力去實作:

  • PostgreSQL 關鍵字和文法
  • PostgreSQL 資料庫結構
  • PostgreSQL 系統表和系統函數
  • PostgreSQL 權限管理
  • 部署運維相關的工具

五、 結語

  • ​​https://github.com/DigitalChinaOpenSource/TiDB-for-PostgreSQL​​
  • ​​https://github.com/DigitalChinaOpenSource/DCParser​​