開源一個教學型分庫分表示例專案 shardingsphere-jdbc-demo

勇哥编程游记發表於2024-03-21

在筆者心中,訊息佇列快取分庫分表是高併發解決方案三劍客。

分庫分表之所以被廣泛使用,因為工程相對簡單,但分庫分表並不僅僅是分片,還是需要考慮如何擴縮容(全量同步、增量同步、資料校驗等)。

分庫分表技術思維導圖

因此筆者做了一個教學型分庫分表示例專案 ,計劃將分庫分表的技術體系都實際演示一遍。

https://github.com/makemyownlife/shardingsphere-jdbc-demo

當前專案包含三個模組 :

  • shardingjdbc4-spring:使用 shardingsphere-JDBC 4.X 實現分庫分表功能
  • shardingjdbc5-spring:使用 shardingsphere-JDBC 5.X 實現分庫分表功能
  • idgenerator: 基於 grpc 實現一個簡單的服務端 ID 生成器

下面我們展示如何執行 shardingjdbc4-spring 模組,shardingsphere JDBC 4.x 如何整合 spring 實現分庫分表功能。

1 業務分析

筆者曾經為武漢一家 O2O 公司訂單服務做過分庫分表架構設計 ,當企業使用者建立一條採購訂單 , 會生成如下記錄:

  • 訂單基礎表 t_ent_order :單條記錄

  • 訂單詳情表 t_ent_order_detail :單條記錄

  • 訂單明細表 t_ent_order_item:N 條記錄

訂單每年預估生成記錄 1 億條,資料量不大也不小,筆者參考原來神州專車的分庫分表方式,制定瞭如下的分庫分表策略:

  • 訂單基礎表按照 ent_id (企業使用者編號) 分庫(四個分庫),訂單詳情表保持一致。
  • 訂單明細表按照 ent_id (企業使用者編號) 分庫 (四個分庫),同時也要按照 ent_id (企業編號) 分表(八個分表)。

2 環境準備

建立 4 個庫,分別是:ds_0、ds_1、ds_2、ds_3 。

然後這四個分庫分別執行 doc 目錄下的 shardingjdbc-spring.sql 檔案。

執行結果如下圖所示,每個分庫都包含訂單基礎表 , 訂單詳情表 ,訂單明細表 。但是因為明細表需要分表,所以包含多張表。

3 專案結構

開啟專案,如下圖所示:

這是一個典型的 springboot 專案,包含控制器層、實體層、服務層 。

1、pom 檔案配置依賴

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>

2、分片配置 application-test.yml

  • 配置資料來源,上面配置資料來源是: ds0、ds1、ds2、ds3 ;
  • 配置列印日誌,也就是:sql.show ,在測試環境建議開啟 ,便於除錯;
  • 配置哪些表需要分庫分表 ,在 shardingsphere.datasource.sharding.tables 節點下面配置:

上圖中我們看到配置分片規則包含如下兩點:

1.真實節點

​ 對於我們的應用來講,我們查詢的邏輯表是:t_ent_order_item 。

​ 它們在資料庫中的真實形態是:t_ent_order_item_0t_ent_order_item_7

​ 真實資料節點是指資料分片的最小單元,由資料來源名稱和資料表組成。

​ 訂單明細表的真實節點是:ds$->{0..3}.t_ent_order_item_$->{0..7}

2.分庫分表演算法

分別配置分庫策略和分表策略 , 每種策略都需要配置分片欄位( sharding-columns )和分片演算法

4 測試介面

修改配置檔案 application-test.yml ,配置好 MySQL 資料庫 和 Redis 服務 。

啟動 Main 函式:

啟動過程中,會列印 shardingsphere jdbc 日誌 。

啟動成功之後,訪問 swagger ui 地址:

http://localhost:9793/shardingsphere-jdbc-server/doc.html#/home

接下來,我們進行兩個測試:新增訂單和按照訂單 ID 查詢

1、測試儲存訂單

點選傳送按鈕,介面響應成功。

我們插入1 條訂單記錄、1 條訂單詳情表進入 ds3 分片,並且 2 條訂單條目表進入 ds3 分片的 t_ent_order_item_7 表。

2、測試儲存訂單

引數名稱是 orderId , 引數值:609335823493160961 ,點選傳送按鈕,介面響應成功 , 返回訂單資訊。

相關文章