1. 程式人生 > 其它 >如何在 ShardingSphere 中開發自己的 DistSQL

如何在 ShardingSphere 中開發自己的 DistSQL

《DistSQL:像資料庫一樣使用 Apache ShardingSphere》《SCTL 涅槃重生:投入 RAL 的懷抱》中,已經為大家介紹了 DistSQL 的設計初衷和語法體系,並通過實戰操作展示了 DistSQL 建立分散式資料庫表的強大能力,展現了 Apache ShardingSphere 在新形態下的互動體驗。
為了讓大家對 DistSQL 有更深入的瞭解,同時能根據需要定製自己的 DistSQL 語法,本篇將為大家解析 DistSQL 的設計開發流程,同時通過實際的場景案例,帶領大家實現一個全新的 DistSQL 語法,完成從需求到設計、開發和測試的完整過程。

蘭城翔

SphereEx 中介軟體研發工程師,Apache ShardingSphere contributor,目前專注於 DistSQL 的設計和研發。

何為 DistSQL

DistSQL(Distributed SQL)是 Apache ShardingSphere 特有的操作語言,它與標準 SQL 的使用方式完全一致,用於提供增量功能的 SQL 級別操作能力,以此達到對資源和規則的管理的目的。關於 DistSQL 更多資訊參考《DistSQL:像資料庫一樣使用 Apache ShardingSphere》

DistSQL 的意義

DistSQL 設計的目的是打破中介軟體和資料庫之間的界限,讓開發者像使用資料庫一樣使用 Apache ShardingSphere。
因此 DistSQL 的設計會盡可能契合已有的資料庫語法,進而降低學習成本;此外 DistSQL 的作用是對資源和規則進行 SQL 級別的管理,完全替代配置檔案也是其優點之一。

開發 DistSQL

準備

* 在開發之前需要對以下工具有所瞭解 1. ANTRL4 作為解析工具是開發 DistSQL 的基礎,關於 ANTLR 4 的使用可以參考 【ANTRL4簡明教程】:https://wizardforcel.gitbooks.io/antlr4-short-course/content/ 2. 在 IntelliJ IDEA 開發時還需要使用到外掛 ANTLR v4, (https://plugins.jetbrains.com/plugin/7358-antlr-v4
)作用是對 ANTRL4 定義的語法規則進行測試,使用方式如下:
a. 在對應的規則上選擇 Test Rule b. 在 ANTLR preview 中輸入需要校驗的語句 在瞭解語法和外掛的基礎之上,還需要對 DistSQL 執行流程有一定認識。但 DistSQL 完整的執行流程較為繁瑣,而 ShardingSphere 的良好的架構使得開發者不用關注整個流程也能完成 DistSQL 功能的開發。 開發 DistSQL 需要關注的核心流程如下,此處以分片功能為例,不同的功能對應的 Visitor 不同:

實戰

在瞭解 DistSQL 執行流程之後,接下來將實戰演示如何開發一條自己的 DistSQL。 《DistSQL:像資料庫一樣使用 Apache ShardingSphere》一文中實戰演示了使用 DistSQL 建立分片規則,同時使用 show sharding table rules 對分片規則進行了展示。 現在,讓我們提出一個新的需求:通過 DistSQL 快速查詢各個分片表的分片數量。設計語法如下:
show sharding tables count [from schema] ;
  • 環境準備
  • MySQL 服務,包含用於分片的資料庫和表
  • Zookeeper 服務,作為註冊中心
  • ShardingSphere-Proxy 5.0.0
  • 實戰演示
1. 建立語法定義 src/main/antlr4/imports/sharding/RQLStatement.g4 檔案中新增如下的語法定義,新增完成後可以使用 ANTLR v4 對語法定義進行測試。 在新增語法定義時需要考慮該語法中的關鍵字是否已經定義,此處的 COUNT 為未定義的關鍵字,需要在 src/main/antlr4/imports/sharding/Keyword.g4 中定義。 在語法定義之後還需將其新增到 ShardingDistSQLStatement.g4 檔案中,該檔案可以理解為解析的路由。 在完成以上步驟之後,對 shardingsphere-sharding-distsql-parser 進行編譯生成語法對應的上下文物件。 2. 完成對語法定義的解析 在處理語法之前還需要在 shardingsphere-distsql-statement 新增一個與該語法定義對應的 DistSQLStatement 物件用於儲存語句中的變數屬性,例如當前語法定義中的 schemaName 需要儲存至 DistSQLStatement 物件中。 在 ShardingSphere 中使用的是 ANTLR 的 Visitor 模式,因此對語法定義的處理需要在 ShardingDistSQLStatementVisitor 中重寫 visitShowShardingTableCount 方法,該方法的目的為建立 ShowShardingTablesCountStatement 物件,並將語法中的變數屬性儲存到 DistSQLStatement 物件中。 shardingsphere-distsql-statement 存在 shardingsphere-sharding-distsql-parser 依賴關係,因此需要對 shardingsphere-distsql-statement 進行編譯。 3. 資料處理以及結果返回 資料的處理主要由 Handler 或者 Executor 中的 execute 方法處理,結果主要由 getRowData 方法返回,但是對應不同型別的語法定義在側重點上可能有所差異。其中結果返回的語法定義使用 DistSQLResultSet 作為結果儲存的物件,會在 execute 方法中對結果資料進行組裝。 本示例便是這種處理方式,以下為該示例對應的 DistSQLResultSet ShardingTablesCountResultSetinit 方法負責資料的獲取與組裝,getRowData 方法負責對行資料的返回。此外不難發現該類中還有 getType 方法,該方法屬於 TypedSPI 介面,所以 ShardingTablesCountResultSet 還需要在當前模組的 src/main/resources/META-INF/services 目錄下增加 org.apache.shardingsphere.infra.distsql.query.DistSQLResultSet 檔案來完成 SPI 的注入才能使用,路徑與內容如下: 至此該語法定義的功能開發已基本完成。 4. 單元測試以及解析測試 在完成基本的功能開發之後為了保證其持續的可用性需要對新增的類或者方法新增測試用例,對新增的語法新增解析測試,以下為 ShardingTablesCountResultSet 的單元測試。 除了單元測試以外還需要在 shardingsphere-parser-test 中新增對語法定義的解析測試,將輸入的 DistSQL 解析成 DistSQLStatement 然後與預期的 TestCase 物件進行比較, 步驟如下。 a. 在 src/main/resources/sql/supported/rql/show.xml 中新增測試的 SQL; b. 在 src/main/resources/case/rql/show.xml 新增測試的 case; c. 新增 TestCase 物件用於儲存 case 中定義的預期結果; d. 使用 SQLParserTestCases 類將 TestCase 進行載入; e. 新增對應的 Assert 物件 ,並將其加入到 ShowRulesStatementAssert 判斷中; f. 執行 DistSQLParserParameterizedTest 中的測試方法,至此測試告一段落。 最後可以在命令列工具中去執行開發完成的 DistSQL 檢驗功能。

結語

DistSQL 作為 5.0.0 版本釋出的新特性之一,將會在此版本基礎上持續發力,也希望更多的社群夥伴加入,構造更加完善的語法體系,提供更強大的功能,真正打破中介軟體與資料庫之間的界限。 最後,DistSQL SIG 近日已成立,致力於 DistSQL 特性持續優化,拓展新的使用場景以及宣傳答疑,歡迎大家點選這裡連結關注,瞭解 DistSQL 以及 ShardingSphere 專案最新進展。 歡迎新增社群經理微信(ss_assistant_1)進入交流群,與眾多 ShardingSphere 愛好者一同交流進步