从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧
距離最后一個 4.x 版本的發布時間已半年有余,在此期間, Apache ShardingSphere 社區對產品不斷的打磨和優化,并在剛剛過去的雙十一前夕發布了其 5.x 的首個版本—— 5.0.0-alpha。
它是 Apache ShardingSphere 從分庫分表中間件向分布式數據庫生態轉化的里程碑。從 4.x 版本后期伊始打磨的可插拔架構在 5.x 版本終見雛型,項目的設計理念和 API 都隨之大幅革新。
本文將向讀者闡述其新一代分布式數據庫生態圈的設計理念和產品變革精髓。
?
導讀
?
在 Apache ShardingSphere 全新發布的 5.0.0-alpha 中,除去例行的功能優化、缺陷修復以及代碼重構外,其里程碑更新是可插拔架構、獨立化的 SQL 解析引擎以及全新 DistSQL 的支持。
可插拔架構是內核層面的重大提升,工程師能夠通過可插拔的方式自由定制所需功能。
經過長年累月打磨而成的 SQL 解析引擎,在獨立化之后,能夠為開發者提供 JSqlParser等同類開源項目之外的另一個選擇。
DistSQL 的出現,使 Apache ShardingSphere 的所有操作均可通過 SQL 完成。它的存在意義是讓 Apache ShardingSphere 從數據庫中間件的預先配置的工作流程,轉向分布式數據庫的動態操作的工作流程。
下文我將詳細闡述 Apache ShardingSphere 5.x 的重要革新點,主要包括三個部分:
-
日月之行,若出其中。星漢燦爛,若出其里——可插拔架構
-
不受百煉,難以成鋼——獨立化 SQL 解析引擎
-
萬物之始,大道至簡,衍化至繁——DistSQL支持
?
日月之行,若出其中。星漢燦爛,若出其里——可插拔架構
?
可插拔架構是 Apache ShardingSphere 長期以來一直致力于打造的“微內核,強生態”架構模式。它追求各個模塊的相互獨立和互無感知,并且通過一個高靈活度,可插拔和可擴展內核,以疊加的方式將各種功能組合使用。
目前,數據分片、讀寫分離、數據加密、影子庫等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 與協議的支持,均通過插件的方式織入項目。開發者能夠像使用積木一樣定制屬于自己獨特的數據庫系統。
可插拔架構的完善,使 Apache ShardingSphere 從分庫分表中間件蛻變成為分布式數據庫的生態系統。項目從提供功能,轉化為提供基礎設施(積木)和最佳實踐(功能)。Apache ShardingSphere 完全遵循開閉原則(OCP),真正的做到了面向修改關閉,面向擴展開放。開發者通過實現系統所提供的擴展點進行擴展,而無需改寫項目已有代碼。
擴展點劃分為技術擴展點和功能擴展點兩大類。
?
技術擴展點
?
包括 SQL 方言解析、數據庫協議、分布式事務、注冊中心等。開發者可以通過技術擴展點將更多技術組件融入 Apache ShardingSphere 生態圈。
SQL 解析
主要包括 SQL 語法樹解析和SQL 語法樹遍歷的擴展點。
SQL 語法樹解析器內置提供了 MySQL、PostgreSQL、SQLServer、Oracle 和 SQL92 的實現。開發者可以通過實現 SQL 解析擴展點自行實現 Apache ShardingSphere 還未支持的 SQL 方言,如:DB2。
SQL 語法樹遍歷器內置提供了轉化為 Apache ShardingSphere 內核所需的 SQLStatement 提取器,目前正在完善 SQL 格式化的默認實現。開發者同樣可以通過擴展點自行實現未支持的功能,如:SQL 審計。
數據庫協議
主要包括數據庫協議層和數據源 URL 識別的擴展點。
目前對 MySQL 協議支持比較完善,也支持 PostgreSQL 協議。
分布式事務
主要包括事務管理器的擴展點。
事務管理器支持 XA 事務和柔性事務,其中 XA 事務還支持基于多種不同類型的事務管理器實現。京東內部的分布式事務引擎 JDTX 也是事務管理器擴展點的一個實現。
?注冊中心?
主要包括注冊中心支持的擴展點。
目前比較完善的支持 ZooKeeper 和 ETCD 作為注冊中心的實現,也簡單支持 Apollo 和 Nacos 作為配置中心的實現。
?
功能擴展點
?
包括內核級擴展點和細化功能級擴展點。
內核級擴展點包括元數據加載、路由引擎、改寫引擎、執行引擎、歸并引擎和配置等。
開發者可以通過實現內核級擴展點完成定制化功能的開發。
目前,Apache ShardingSphere 基于內核擴展點實現了數據分片、讀寫分離、數據加密和影子庫的功能,高可用功能正在開發中,我所在的公司內部也正在基于這些擴展點實現其他高階功能。
配置是用戶與 Apache ShardingSphere 交互的橋梁,是添加新功能所必須實現的擴展點。它具體包括規則創建、YAML 轉換和快捷方式定義、Spring 自定義命名空間和 Spring Boot Starter 配置等。
其他擴展點的使用,需要根據具體的功能需求來確定。
-
數據分片實現了元數據加載、路由引擎、改寫引擎、執行引擎和歸并引擎的全部擴展點;
-
讀寫分離則只需實現路由引擎擴展點即可;
-
數據加密實現了元數據加載、改寫引擎和歸并引擎擴展點;
-
影子庫實現了路由引擎和改寫引擎擴展點;
每個功能又可劃分各自細化的功能級擴展點。
-
數據分片功能提供分片算法、分布式主鍵生成策略和時間服務擴展點。
-
讀寫分離功能提供從庫負載均衡擴展點。
-
數據加密功能提供加解密算法擴展點。
-
影子庫功能暫無擴展點。
功能擴展點的發布,一改 Apache ShardingSphere 以數據分片為核心的原產品形態,新架構將數據分片從項目內核中抽離,并沉淀為一個與讀寫分離、數據加密和影子庫相同的可選功能。功能之間相互隔離,互無感知,但能夠以疊加的方式組合使用。
原架構模型的數據分片(必須) +?讀寫分離(可選) +?數據加密(可選)固定的組合方式,在新架構中能夠以數據分片(可選) +?讀寫分離(可選) +?數據加密(可選)+?其他(可選)的方式自由組合使用。
技術擴展點和功能擴展點以相乘的方式排列組合,加之用戶可以自行定制化所需擴展點來完成的個性化功能,形成了龐大 的Apache ShardingSphere 生態圈。它成為連接異構數據庫和統一化增量功能的橋梁。
功能的可擴展空間十分多,除了社區正在開發中的高可用之外,多租戶、SQL 旁路審計、異構索引優化、TTL 等功能,都能夠通過擴展點無縫的加入到生態之中。未來社區也會提供更多的任務,歡迎感興趣的同學一起貢獻。功能之間的相互隔離和互無感知,降低了開發者實現新擴展點的難度,他們無需關注其他擴展點的細節,只要將精力集中在當前實現的功能需求即可。
Apache ShardingSphere 目前已提供數十個 SPI (Service Provider Interface)作為系統的擴展點,仍在不斷增加中。
詳情請參考:
https://shardingsphere.apache.org/document/current/cn/dev-manual/。
在本部分結束之際,解釋一下標題中出自曹操所著四言樂府詩《觀滄海》中名句:日月之行,若出其中。星漢燦爛,若出其里。這首詩是曹操在登碣石山觀海時,所描述出的大海吞吐日月、包蘊萬千的景象。
可插拔架構讓 Apache ShardingSphere 的關注點從排他性轉變為融合性。用戶無需再考慮 MySQL 和 PostgreSQL 誰更優越,也無需關注分布式事務應該使用 XA 還是柔性事務的解決方案。這些技術方案,在 Apache ShardingSphere 生態圈中都占有一席之地,并可以共存與協作。希望 Apache ShardingSphere 在未來能夠支持更多的數據庫以及融入更多的功能,打造成為像大海一樣可容納一切的平臺級生態體系,并構建屬于自己的行業標準。
?
不受百煉,難以成鋼——獨立化?SQL 解析引擎
?
在 Apache ShardingSphere 開源的五年的發展歷程中,SQL 解析引擎是不可或缺的基石,也是項目中最穩定的基礎設施。在本次發布中,我們將它與主項目完全剝離,讓它能夠為開發者獨立的提供 SQL 處理相關服務。
目前 Apache ShardingSphere 的 SQL 解析引擎提供了 MySQL、PostgreSQL、SQLServer、Oracle 和 SQL 92 這 5 種 SQL 方言支持,其中 MySQL 目前已基本具備 100% 的兼容能力, PostgreSQL 的兼容性也已相當可觀。
SQL 解析引擎采用 ANTLR 作為語法解析器,它的優點是語法文件采用 BNF(巴科斯范式)風格完成描述聲明,語法風格簡單易讀且易于維護,為開發者擴展其他數據庫方言提供了便利條件。除了標準語法樹的解析和生成,Apache ShardingSphere 將語法樹訪問器以 SPI 的方式向外提供擴展,并計劃提供大量的內置訪問器已滿足對 SQL 操作的各種需求。Apache ShardingSphere 直接使用的 SQLStatement 解析結果,也是經由 SPI 的語法樹訪問器提供而來。
了解 Apache ShardingSphere 歷史的人可能知道,當前的 SQL 解析引擎已是第三代。經過了前兩代 SQL 解析引擎的摸索,第三代解析引擎繼承了前代的穩定性。雖然采用 ANTLR 的代碼生成的方式,降低了 SQL 解析引擎的性能,但卻提升了可維護性和可擴展性,對于一個開放的社區來說,這種權衡是值得的。在Apache ShardingSphere 中,SQL 解析的性能并非是決定系統性能的瓶頸,它通過緩存將 SQL 解析的性能損耗降至最低。
不受百煉,難以成鋼,是歷經了五年三代的 SQL 解析引擎的真實寫照。在承載 Apache ShardingSphere 的全部需求之后,它成功的邁出獨立的一步。雖然與 JSqlParser 等老牌 SQL 解析引擎相比,它還略顯稚嫩,但易于擴展和更完善的 SQL 方言支持,足以讓其成為開源界中的另一選擇。希望它能夠隨著社區的發展不斷完善,成為數據庫生態中不可或缺的利器。
?
萬物之始,大道至簡,衍化至繁——DistSQL 支持
?
一直以來,Apache ShardingSphere 的項目定位都是數據庫中間件。數據庫中間件通常是搭建在數據庫之上的代理層,對已有的數據庫進行增強。因此,大部分使用者都采用先部署數據庫并創建數據庫表結構,再通過 Apache ShardingSphere 配置數據庫分片策略的使用流程。數據庫與中間件之間是相互割裂的,數據庫采用 SQL 進行操作,中間件則通過 YAML 的方式進行配置。若采用集群模式,通過 YAML 的配置則不能滿足分布式的需求,用戶還需要將配置存儲至注冊中心。SQL、YAML 和注冊中心的多點輸入,使中間件模式難于被習慣了 SQL 操作便捷性的 DBA 所接納。
數據庫通常使用 SQL 完成全部操作。為了讓 Apache ShardingSphere 向分布式數據庫方向全面轉化,DistSQL 是重要的戰略轉折點之一。它提供了僅通過 SQL 即可完成對 Apache ShardingSphere 的全部操作能力。
當前版本的 DistSQL 還剛剛起步,僅包含了RDL 類型的語句。RDL 即 Rule Definition Language,是用于定義規則的語句,規則目前僅包括數據分片,未來會不斷擴充讀寫分離、數據加密和影子表等規則。除了規則定義,RDL 還提供了資源定義,即管理能夠被 Apache ShardingSphere 所使用的數據源。
RDL 語法使用下列語句創建資源:
CREATE datasources (ds0=127.0.0.1:3306:demo_ds_0:root:pwd,ds1=127.0.0.2:3306:demo_ds_1:root:pwd);使用下列語句創建規則:
CREATE shardingrules (t_order=hash_mod(order_id, 4),t_item=mod(item_id, 2));為了搭配與 RDL 一起使用,原有的允許用戶通過自定義 Java 類或行表達式的分片算法的自由定制化模式,也在保留其基礎的情況下增加了自動分片模式。自動分片模式提供了取模、哈希取模、范圍、時間等各種維度的簡化分片算法。示例中 的RDL語句描述了對 t_order 表采用哈希取模的算法分為4片,分片鍵是 order_id,以及對 t_order_item 表采用取模的算法分為 2 片,分片鍵是 item_id 的規則配置。
除了 RDL,未來會將更多類型的針對Apache ShardingSphere 的分布式相關操作加入到 DistSQL 中,如:Hint、SCTL 等。
DistSQL 是 Apache ShardingSphere 邁向分布式數據庫的準入門檻。正如標題所言,萬物之始,大道至簡,衍化至繁。對于數據庫來說,命令行 + SQL 是它的根源。由 SQL 衍化而來的各項分布式功能,才是分布式數據庫被開發者和 DBA 所接受的路徑。DistSQL 打通了 Apache ShardingSphere 從數據庫中間件向分布式數據庫邁進的脈絡,為未來承載更多的數據庫內核層和存儲層的功能提供了有效而統一的入口。
時代一直在前行,變革從來不是一蹴而就。期望當未來的Apache ShardingSphere生態圈深入人心之后,同社區一路走過來的朋友們,能夠在回溯變革的萌芽時,能依稀回憶起當前版本。
項目首頁:?
https://shardingsphere.apache.org
?
?
?
?
?
由于版本剛剛發布,文檔比較潦草,未來會進一步完善。基于可插拔架構搭建的 Apache ShardingSphere 結構見下圖:
總結
以上是生活随笔為你收集整理的从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python自动解压各种压缩文件
- 下一篇: 审计 Linux 系统的操作行为的 5