Sharding-JDBC 核心之路由引擎

騎驢的小牧童發表於2020-10-15

路由引擎

       無論是分庫分表、還是讀寫分離,一個SQL在DB上執行前都需要經過特定規則運算獲得執行的目標庫表資訊。路由引擎的職責定位就是計算SQL應該在哪個資料庫、哪個表上執行。前者結果會傳給後續執行引擎,然後根據其資料庫標識獲取對應的資料庫連線;後者結果則會傳給改寫引擎在SQL執行前進行表名的改寫,即替換為正確的物理表名。計算哪個資料庫依據的演算法是要使用者配置的庫路由規則,計算哪個表依據的演算法是使用者配置的表路由規則。目前在ShardingSphere中需要進行路由的功能模組有兩個:先處理分庫分表sharding再處理讀寫分離master-slave。

       根據解析上下文匹配資料庫和表的分片策略,並生成路由路徑。 對於攜帶分片鍵的SQL,根據分片鍵的不同可以劃分為單片路由(分片鍵的操作符是等號)、多片路由(分片鍵的操作符是IN)和範圍路由(分片鍵的操作符是BETWEEN)。不攜帶分片鍵的SQL則採用廣播路由。

路由引擎的整體結構劃分如下圖。


在這裡插入圖片描述

一、分片路由

       用於根據分片鍵進行路由的場景,又細分為直接路由、標準路由和笛卡爾積路由這3種型別。

1.1 直接路由

       滿足直接路由的條件相對苛刻,它需要通過Hint(使用HintAPI直接指定路由至庫表)方式分片,並且是隻分庫不分表的前提下,則可以避免SQL解析和之後的結果歸併。 因此它的相容性最好,可以執行包括子查詢、自定義函式等複雜情況的任意SQL。直接路由還可以用於分片鍵不在SQL中的場景。例如,設定用於資料庫分片的鍵為3
	hintManager.setDatabaseShardingValue(3);
       假如路由演算法為value % 2,當一個邏輯庫t_order對應2個真實庫t_order_0和t_order_1時,路由後SQL將在t_order_1上執行。下方是使用API的程式碼樣例:
	String sql = "SELECT * FROM t_order";
	try (
	        HintManager hintManager = HintManager.getInstance();
	        Connection conn = dataSource.getConnection();
	        PreparedStatement pstmt = conn.prepareStatement(sql)) {
	    hintManager.setDatabaseShardingValue(3);
	    try (ResultSet rs = pstmt.executeQuery()) {
	        while (rs.next()) {
	            //...
	        }
	    }
	}

1.2 標準路由

       標準路由是ShardingSphere最為推薦使用的分片方式,它的適用範圍是不包含關聯查詢或僅包含繫結表之間關聯查詢的SQL。 當分片運算子是等於號時,路由結果將落入單庫(表),當分片運算子是BETWEEN或IN時,則路由結果不一定落入唯一的庫(表),因此一條邏輯SQL最終可能被拆分為多條用於執行的真實SQL。 舉例說明,如果按照order_id的奇數和偶數進行資料分片,一個單表查詢的SQL如下:
	SELECT * FROM t_order WHERE order_id IN (1, 2);

二、廣播路由

相關文章