javascript
SpringBoot + ShardingSphere 秒级分库分表!
Spring Boot 作為主流微服務框架,擁有成熟的社區生態。市場應用廣泛,為了方便大家,整理了一個基于spring boot的常用中間件快速集成入門系列手冊,涉及RPC、緩存、消息隊列、分庫分表、注冊中心、分布式配置等常用開源組件,大概有幾十篇文章,陸續會開放出來,感興趣同學請提前關注&收藏
互聯網高速發展,同時也帶來的海量數據存儲問題。傳統關系型數據庫的單庫單表已經很難支撐,如何高效存儲和訪問這些數據,成為業內急需解決的問題。解決思路有兩個方向:
NoSQL數據庫,非關系型數據庫,天然集成了類似分布式分片的功能,支持海量數據存儲,但是不具備事務管理
分庫分表,對多個單庫單表資源整合,并配備資源調度模塊,從而形成一個具有海量數據儲存的邏輯表。
今天我們主要介紹,如何基于Springboot快速集成分庫分表框架,盡量做到開箱即用
當然除了ShardingSphere之外,還有其他分庫分表框架,如:Cobar,MyCat等
ShardingSphere介紹
ShardingSphere 是一套開源的分布式數據庫中間件解決方案組成的生態圈,它由 3 款相互獨立,卻又能夠混合部署配合使用的產品組成。它們均提供標準化的數據分片、分布式事務和數據庫治理功能
ShardingSphere 由三個子項目組成,形成一個完整的數據庫解決方案。
1、ShardingSphere-JDBC:定位為輕量級 Java 框架,在 Java 的 JDBC 層提供額外服務。它使用客戶端直連數據庫,以 jar 包形式提供服務,無需額外部署和依賴,可理解為增強版的 JDBC 驅動,完全兼容 JDBC 和各種 ORM 框架。
適用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。基于任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。支持任意實現JDBC規范的數據庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL。
2、ShardingSphere-Proxy:定位為透明化的數據庫代理端,提供封裝了數據庫二進制協議的服務端版本,用于完成對異構語言的支持。目前提供 MySQL/PostgreSQL 版本,它可以使用任何兼容 MySQL/PostgreSQL 協議的訪問客戶端操作數據,對 DBA 更加友好。
3、ShardingSphere-Sidecar(規劃中):定位為 Kubernetes 的云原生數據庫代理,以 Sidecar 的形式代理所有對數據庫的訪問。通過無中心、零侵入的方案提供與數據庫交互的的嚙合層,即 Database Mesh,又可稱數據網格。
優勢:
解決方案完備性,它集客戶端分片、代理服務器,以及分布式數據庫的核心功能于一身。
開發友好性,提供了友好的集成方式,業務開發人員只需要引入一個 JAR 包就能在業務代碼中嵌入數據分片、讀寫分離、分布式事務、數據庫治理等一系列功能。
可插拔的系統擴展性:它的很多核心功能均通過插件的形式提供,供開發者排列組合來定制屬于自己的獨特系統。
項目示例
首先,新建一個工程spring-boot-bulking-sharding-sphere,在pom.xml 文件中添加分庫分表的 starter 依賴包
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version> </dependency>數據環境準備
分別創建兩個數據庫ds0、ds1,在ds0數據庫中創建 user_0、user_2兩張用戶表
CREATE?TABLE?`user_0`?(`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶名',`age`?int(11)?NOT?NULL??COMMENT?'年齡',`address`?varchar(128)?COMMENT?'地址',PRIMARY?KEY?(`id`) )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶表';CREATE?TABLE?`user_2`?(`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶名',`age`?int(11)?NOT?NULL??COMMENT?'年齡',`address`?varchar(128)?COMMENT?'地址',PRIMARY?KEY?(`id`) )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶表';在ds1數據庫中創建 user_1、user_3兩張用戶表
CREATE?TABLE?`user_1`?(`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶名',`age`?int(11)?NOT?NULL??COMMENT?'年齡',`address`?varchar(128)?COMMENT?'地址',PRIMARY?KEY?(`id`) )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶表';CREATE?TABLE?`user_3`?(`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶名',`age`?int(11)?NOT?NULL??COMMENT?'年齡',`address`?varchar(128)?COMMENT?'地址',PRIMARY?KEY?(`id`) )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶表';我們采用Mybatis作為ORM框架,遵循Mybatis的開發流程,首先需要定義業務實體類User,Mapper接口類文件,以及對應的sql語句的xml文件。
@Mapper public?interface?UserMapper?{Long?addUser(User?user);List<User>?queryAllUser();User?queryUserById(Long?id);Page<User>?querUserByPage(); }Spring boot 框架最為閃亮的設計就是約定勝于配置,廢棄了之前繁瑣的xml形式定義Bean實例,將一系列框架的配置項遷移到 application.properties 中,借助 EnableAutoConfiguration自動完成裝載,并實例化相應的Bean實例到 spring 容器中,IOC統一管理。
針對兩個數據庫初始化兩個DataSource對象,這兩個 DataSource 對象將組成一個 Map 并傳遞給ShardingDataSourceFactory 工廠類,application.properties 配置文件:
server.port=8090 application.name=spring-boot-bulking-sharding-sphere mybatis.config-location=classpath:config/mybatis-config.xml spring.shardingsphere.datasource.names=ds0,ds1#?數據源 spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0?characterEncoding=utf-8 spring.shardingsphere.datasource.ds0.username=root spring.shardingsphere.datasource.ds0.password=111111 spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1?characterEncoding=utf-8 spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=111111搞定數據源后,接下來我們需要設置分庫、分表策略。
#?不分表(application.properties沒有為表單獨配置),默認數據源策略 spring.shardingsphere.sharding.default-data-source-name=ds1#?user表的分表配置 spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user_$->{[0,2]},ds1.user_$->{[1,3]} #?user庫策略(也可以采用默認的) spring.shardingsphere.sharding.tables.user.database-strategy.inline.sharding-column=id spring.shardingsphere.sharding.tables.user.database-strategy.inline.algorithm-expression=ds$->{id?%?2} #?user表策略 spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id?%?4} #spring.shardingsphere.sharding.tables.user.key-generator.column=id #spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE在 ShardingSphere 中存在一組 ShardingStrategyConfiguration,這里使用的是基于行表達式的 InlineShardingStrategyConfiguration。
InlineShardingStrategyConfiguration包含兩個參數,一個是指定分片列名稱的 shardingColumn,另一個是指定分片算法行表達式的 algorithmExpression。上面的示例,將基于 id 列對 2 的取模值來確定數據應該存儲在哪一個數據庫中
我們對user表做了分庫分表,拆分成4個表,并分別歸屬到兩個庫中。分表鍵是id字段。
通過單元測試,插入 10條用戶記錄,驗收下數據的插入情況~
@Test public?void?addUser()?{for?(long?i?=?1;?i?<?11;?i++)?{User?user?=?User.builder().id(i).userName("TomGE").age(29).address("杭州").build();userMapper.addUser(user);System.out.println("插入用戶成功,uid="?+?user.getId());}}其中id=4,id=8 兩條記錄,插入到ds0庫的user_0表中。
項目源碼
https://github.com/aalansehaiyang/spring-boot-bulking??模塊:spring-boot-bulking-sharding-sphere熱衷于收集高并發、系統架構、微服務、消息中間件、 RPC框架、高性能緩存、搜索、分布式數據框架、分布式協同服務、分布式配置中心、中臺架構、領域驅動設計、系統監控、系統穩定性等技術知識。
總結
以上是生活随笔為你收集整理的SpringBoot + ShardingSphere 秒级分库分表!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ReentrantLock 中的 4 个
- 下一篇: observable_Java Obse