当前位置:   article > 正文

5分钟实现分库分表,SpringBoot+shardingsphere_springboot mybatis-plus sharding分库分表

springboot mybatis-plus sharding分库分表

1.分库分表的背景:

随着业务量的增大,不可避免的我们需要增加数据库节点或者增加表的数量,今天介绍一款轻量级,无侵入的分库分表框架shardingsphere-jdbc.

2.依赖

  1. <properties>
  2. <maven.compiler.source>8</maven.compiler.source>
  3. <maven.compiler.target>8</maven.compiler.target>
  4. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  5. <spring.boot.dependencies.version>2.6.2</spring.boot.dependencies.version>
  6. <lombok.version>1.18.24</lombok.version>
  7. <mysql.conenector.version>5.1.38</mysql.conenector.version>
  8. <mybatis.plus.boot.stater.version>3.4.1</mybatis.plus.boot.stater.version>
  9. <shardingsphere.version>5.1.0</shardingsphere.version>
  10. <atomikos.version>5.0.8</atomikos.version>
  11. </properties>
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-dependencies</artifactId>
  17. <version>${spring.boot.dependencies.version}</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.projectlombok</groupId>
  23. <artifactId>lombok</artifactId>
  24. <version>${lombok.version}</version>
  25. <scope>provided</scope>
  26. </dependency>
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>${mysql.conenector.version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>com.baomidou</groupId>
  34. <artifactId>mybatis-plus-boot-starter</artifactId>
  35. <version>${mybatis.plus.boot.stater.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.apache.shardingsphere</groupId>
  39. <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  40. <version>${shardingsphere.version}</version>
  41. </dependency>
  42. </dependencies>
  43. </dependencyManagement>
  44. <dependencies>
  45. <dependency>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-starter-web</artifactId>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-starter-test</artifactId>
  52. <scope>test</scope>
  53. </dependency>
  54. <!--lombok依赖-->
  55. <dependency>
  56. <groupId>org.projectlombok</groupId>
  57. <artifactId>lombok</artifactId>
  58. <scope>provided</scope>
  59. </dependency>
  60. <dependency>
  61. <groupId>mysql</groupId>
  62. <artifactId>mysql-connector-java</artifactId>
  63. </dependency>
  64. <dependency>
  65. <groupId>com.baomidou</groupId>
  66. <artifactId>mybatis-plus-boot-starter</artifactId>
  67. </dependency>
  68. <!-- 分库分表框架-->
  69. <dependency>
  70. <groupId>org.apache.shardingsphere</groupId>
  71. <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  72. <version>${shardingsphere.version}</version>
  73. </dependency>
  74. <!-- xa分布式事务依赖(用不到的可以删掉)-->
  75. <dependency>
  76. <groupId>org.apache.shardingsphere</groupId>
  77. <artifactId>shardingsphere-transaction-xa-core</artifactId>
  78. <version>${shardingsphere.version}</version>
  79. </dependency>
  80. </dependencies>

3.数据库实体

这里我们创建一个需要分库分表的表user_info

  1. create table user_info
  2. (
  3. ID bigint not null
  4. primary key,
  5. NICK_NAME varchar(64) charset latin1 default '' not null,
  6. MONEY bigint default 0 not null
  7. );

然后我在两个数据库中分别创建2张表(也可以同一个数据库创建不同的schema) 

4.主键生成策略

在我们往数据库插入数据的时候,需要生成组件,原来的单库单表我们可能会使用自增策略,但是分库分表之后这个表的自增策略就无法使用了.

框架内置了uuid和雪花算法

可能有的读者需要自定义算法,框架也给我们提供了方法

  1. public class RandomKeyGenerator implements KeyGenerateAlgorithm {
  2. @Override
  3. public Comparable<?> generateKey() {
  4. return ThreadLocalRandom.current().nextLong(100000) + 1;
  5. }
  6. @Override
  7. public void init() {
  8. }
  9. @Override
  10. public String getType() {
  11. return "RANDOM";
  12. }
  13. }

 通过实现KeyGenerateAlgorithm接口,我们可以自定义实现主键生成策略.

 然后在META-INF/services创建org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm文件,将类的全限定名添加进去

 这样我就可以实现自己的主键生成方法.

5.分片规则

在使用 ShardingSphere-JDBC 进行分片时,需要配置分片规则。分片规则决定了如何将数据分散到不同的数据节点上,以下是 ShardingSphere-JDBC 支持的几种分片规则:

标准分片规则:将数据按照某个键进行分片,具有相同键的数据会被分配到同一个数据节点上。

范围分片规则:将数据按照某个键的范围进行分片,例如按照时间范围进行分片,将某个时间段内的数据分配到同一个数据节点上。

模糊分片规则:将数据按照某个键的模糊匹配进行分片,例如按照某个关键字进行分片,将包含该关键字的数据分配到同一个数据节点上。

组合分片规则:将多个分片规则进行组合,按照多个键的组合进行分片。

本文实战将采取标准取余的方式,这也是大多数公司的实现方式.

详细配置参考数据分片 :: ShardingSphere

6.配置(yml)

  1. server:
  2. port: 9001
  3. mybatis-plus:
  4. mapper-locations: mapper/*.xml
  5. type-aliases-package: com.example.shardingtest.entity
  6. spring:
  7. shardingsphere:
  8. # 数据库配置
  9. datasource:
  10. names: ds0,ds1
  11. ds0:
  12. type: com.zaxxer.hikari.HikariDataSource
  13. driver-class-name: com.mysql.jdbc.Driver
  14. jdbc-url: jdbc:mysql://127.0.0.1:3306/ds0
  15. username: root
  16. password: root
  17. ds1:
  18. type: com.zaxxer.hikari.HikariDataSource
  19. driver-class-name: com.mysql.jdbc.Driver
  20. jdbc-url: jdbc:mysql://127.0.0.1:3308/ds1
  21. username: root
  22. password: root
  23. # 分片规则
  24. rules:
  25. sharding:
  26. tables:
  27. # 表配置
  28. user_info:
  29. # 0..1代表下标0-1都是该表的目标数据库
  30. actual-data-nodes: ds$->{0..1}.user_info
  31. # 数据库分片配置
  32. database-strategy:
  33. standard:
  34. # 对应下方的数据库分片配置
  35. sharding-algorithm-name: db-mod-inline
  36. # 根据哪个列名的数据分库
  37. sharding-column: id
  38. #主键生成策略
  39. key-generate-strategy:
  40. column: id
  41. key-generator-name: random
  42. key-generators:
  43. snowflake:
  44. type: SNOWFLAKE
  45. random:
  46. type: RANDOM
  47. sharding-algorithms:
  48. db-mod-inline:
  49. type: INLINE
  50. props:
  51. algorithm-expression: ds$->{id % 2}
  52. props:
  53. sql-show: true

自此就完成了分库分表配置了,本文只进行了分库,分表的配置与分库配置几乎一致,有兴趣的可以参考官网配置数据分片 :: ShardingSphere

下一次聊聊shardingsphere中的分布式事务

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/380953
推荐阅读
相关标签
  

闽ICP备14008679号