现在国内对于数据库分库分表的开源方案,主要是mycat和sharding-sphere,本文主要是自己对于sharding-sphere使用的一些记录。
sharding-sphere简单介绍 Sharding-JDBC 采用在 JDBC 层扩展分库分表,支持读写分离,是一个以 jar 形式提供服务的轻量级组件,其核心思路是小而美地完成最核心的事情,基于 JDBC 层进行分片的好处是轻量、简单、兼容性好以及无需额外的运维工作。缺点是无法跨语言,目前仅支持 Java。
Sharding-Sphere的3个产品的数据分片主要流程是一致的。核心思想是:SQL解析 => 执行器优化 => SQL路由 => SQL改写 => SQL执行 => 结果归并的流程组成。(详情查看官网文档)
分库分表 开发环境: 项目搭建使用的是 Spring Boot + Sharding-Sphere + MyBatis。
注意:Sharding-Sphere 对于Spring-Boot 好像还不支持2.x版本以上,请选择1.x版本,详细源码,请查看相应的demo。
分别创建2个数据库,然后创建相应的表,创建数据库DDL如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE `t_order` ( `order_id` bigint (20 ) NOT NULL AUTO_INCREMENT, `status` varchar (255 ) DEFAULT NULL , `user_id` int (11 ) DEFAULT NULL , PRIMARY KEY (`order_id`) USING BTREE ) ENGINE= InnoDB AUTO_INCREMENT= 344805296301932545 DEFAULT CHARSET= utf8; CREATE TABLE `t_order_item` ( `order_item_id` bigint (20 ) NOT NULL , `order_id` bigint (20 ) DEFAULT NULL , `status` varchar (255 ) DEFAULT NULL , `user_id` int (11 ) DEFAULT NULL , PRIMARY KEY (`order_item_id`) ) ENGINE= InnoDB DEFAULT CHARSET= utf8;
核心Maven依赖(版本:4.0.0-RC1):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!-- for spring boot --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding-sphere.version} </version> </dependency> <!-- for spring namespace --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>${sharding-sphere.version} </version> </dependency>
集成sharding-sphere的核心配置文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 spring.shardingsphere.datasource.names=ds0,ds1 spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds0.jdbcUrl=jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false &useUnicode=true &characterEncoding=UTF-8 spring.shardingsphere.datasource.ds0.username=root spring.shardingsphere.datasource.ds0.password= spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds1.jdbcUrl=jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC&useSSL=false &useUnicode=true &characterEncoding=UTF-8 spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password= spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2} spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item spring.shardingsphere.sharding.tables.t_order_item.key-generator.column=order_item_id spring.shardingsphere.sharding.tables.t_order_item.key-generator.type=SNOWFLAKE
下面就是和平时一样搭建MyBatis部分了,这部分就不详细介绍了。
本人写了插入和查询测试样例,实现了数据库的分库分表功能。
Reference