Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离

原创
2019/06/30 14:22
阅读数 0


点击上方“方志朋”,选择“置顶公众号”

技术文章第一时间送达!



在上一篇文章介绍了如何使用Sharding-jdbc进行分库+读写分离,这篇文章将讲述如何使用Sharding-jdbc进行分库分表+读写分离。

架构回顾

在数据量不是很多的情况下,我们可以将数据库进行读写分离,以应对高并发的需求,通过水平扩展从库,来缓解查询的压力。如下:

在数据量达到500万的时候,这时数据量预估千万级别,我们可以将数据进行分表存储。

在数据量继续扩大,这时可以考虑分库分表,将数据存储在不同数据库的不同表中,如下:

案例详解

本案例有6个数据库,两个主库,四个从库,信息如下:

数据库类型 数据库 ip
cool 10.0.0.3
cool 10.0.0.13
cool 10.0.0.17
cool2 10.0.0.3
cool2 10.0.0.13
cool2 10.0.0.17

在主库主机的Mysql执行以下脚本,分别为数据库cool和cool2创建5个表,这5个表分别为user0、user1、user2、user3、user_4。 执行的脚本如下:

  
  
  1. USE `cool`;



  2. /*Table structure for table `user_0` */


  3. DROP TABLE IF EXISTS `user_0`;


  4. CREATE TABLE `user_0` (

  5. `id` int(12) NOT NULL AUTO_INCREMENT,

  6. `username` varchar(12) NOT NULL,

  7. `password` varchar(30) NOT NULL,

  8. PRIMARY KEY (`id`),

  9. KEY `idx-username` (`username`)

  10. ) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8;


  11. /*Table structure for table `user_1` */


  12. DROP TABLE IF EXISTS `user_1`;


  13. CREATE TABLE `user_1` (

  14. `id` int(12) NOT NULL AUTO_INCREMENT,

  15. `username` varchar(12) NOT NULL,

  16. `password` varchar(30) NOT NULL,

  17. PRIMARY KEY (`id`),

  18. KEY `idx-username` (`username`)

  19. ) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=utf8;


  20. /*Table structure for table `user_2` */


  21. DROP TABLE IF EXISTS `user_2`;


  22. CREATE TABLE `user_2` (

  23. `id` int(12) NOT NULL AUTO_INCREMENT,

  24. `username` varchar(12) NOT NULL,

  25. `password` varchar(30) NOT NULL,

  26. PRIMARY KEY (`id`),

  27. KEY `idx-username` (`username`)

  28. ) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8;


  29. /*Table structure for table `user_3` */


  30. DROP TABLE IF EXISTS `user_3`;


  31. CREATE TABLE `user_3` (

  32. `id` int(12) NOT NULL AUTO_INCREMENT,

  33. `username` varchar(12) NOT NULL,

  34. `password` varchar(30) NOT NULL,

  35. PRIMARY KEY (`id`),

  36. KEY `idx-username` (`username`)

  37. ) ENGINE=InnoDB AUTO_INCREMENT=148 DEFAULT CHARSET=utf8;

  38. CREATE TABLE `user_4` (

  39. `id` INT(12) NOT NULL AUTO_INCREMENT,

  40. `username` VARCHAR(12) NOT NULL,

  41. `password` VARCHAR(30) NOT NULL,

  42. PRIMARY KEY (`id`),

  43. KEY `idx-username` (`username`)

  44. ) ENGINE=INNODB AUTO_INCREMENT=148 DEFAULT CHARSET=utf8;



  45. USE `cool2`;



  46. /*Table structure for table `user_0` */


  47. DROP TABLE IF EXISTS `user_0`;


  48. CREATE TABLE `user_0` (

  49. `id` int(12) NOT NULL AUTO_INCREMENT,

  50. `username` varchar(12) NOT NULL,

  51. `password` varchar(30) NOT NULL,

  52. PRIMARY KEY (`id`),

  53. KEY `idx-username` (`username`)

  54. ) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8;


  55. /*Table structure for table `user_1` */


  56. DROP TABLE IF EXISTS `user_1`;


  57. CREATE TABLE `user_1` (

  58. `id` int(12) NOT NULL AUTO_INCREMENT,

  59. `username` varchar(12) NOT NULL,

  60. `password` varchar(30) NOT NULL,

  61. PRIMARY KEY (`id`),

  62. KEY `idx-username` (`username`)

  63. ) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=utf8;


  64. /*Table structure for table `user_2` */


  65. DROP TABLE IF EXISTS `user_2`;


  66. CREATE TABLE `user_2` (

  67. `id` int(12) NOT NULL AUTO_INCREMENT,

  68. `username` varchar(12) NOT NULL,

  69. `password` varchar(30) NOT NULL,

  70. PRIMARY KEY (`id`),

  71. KEY `idx-username` (`username`)

  72. ) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8;


  73. /*Table structure for table `user_3` */


  74. DROP TABLE IF EXISTS `user_3`;


  75. CREATE TABLE `user_3` (

  76. `id` int(12) NOT NULL AUTO_INCREMENT,

  77. `username` varchar(12) NOT NULL,

  78. `password` varchar(30) NOT NULL,

  79. PRIMARY KEY (`id`),

  80. KEY `idx-username` (`username`)

  81. ) ENGINE=InnoDB AUTO_INCREMENT=148 DEFAULT CHARSET=utf8;


  82. CREATE TABLE `user_4` (

  83. `id` INT(12) NOT NULL AUTO_INCREMENT,

  84. `username` VARCHAR(12) NOT NULL,

  85. `password` VARCHAR(30) NOT NULL,

  86. PRIMARY KEY (`id`),

  87. KEY `idx-username` (`username`)

  88. ) ENGINE=INNODB AUTO_INCREMENT=148 DEFAULT CHARSET=utf8;

案例的工程是在上一篇文章的工程基础上进行改造,其中pom文件的依赖包不变,详情可见源码。

在工程的application中做sharding-jdbc的分库分表配置,代码如下:

  
  
  1. sharding.jdbc.datasource.names=ds-master-0,ds-master-1,ds-master-0-slave-0,ds-master-0-slave-1,ds-master-1-slave-0,ds-master-1-slave-1


  2. sharding.jdbc.datasource.ds-master-0.type=com.alibaba.druid.pool.DruidDataSource

  3. sharding.jdbc.datasource.ds-master-0.driver-class-name=com.mysql.jdbc.Driver

  4. sharding.jdbc.datasource.ds-master-0.url=jdbc:mysql://10.0.0.3:3306/cool?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT

  5. sharding.jdbc.datasource.ds-master-0.username=root

  6. sharding.jdbc.datasource.ds-master-0.password=


  7. sharding.jdbc.datasource.ds-master-0-slave-0.type=com.alibaba.druid.pool.DruidDataSource

  8. sharding.jdbc.datasource.ds-master-0-slave-0.driver-class-name=com.mysql.jdbc.Driver

  9. sharding.jdbc.datasource.ds-master-0-slave-0.url=jdbc:mysql://10.0.0.13:3306/cool?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT

  10. sharding.jdbc.datasource.ds-master-0-slave-0.username=root

  11. sharding.jdbc.datasource.ds-master-0-slave-0.password=

  12. sharding.jdbc.datasource.ds-master-0-slave-1.type=com.alibaba.druid.pool.DruidDataSource

  13. sharding.jdbc.datasource.ds-master-0-slave-1.driver-class-name=com.mysql.jdbc.Driver

  14. sharding.jdbc.datasource.ds-master-0-slave-1.url=jdbc:mysql://10.0.0.17:3306/cool?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT

  15. sharding.jdbc.datasource.ds-master-0-slave-1.username=root

  16. sharding.jdbc.datasource.ds-master-0-slave-1.password=


  17. sharding.jdbc.datasource.ds-master-1.type=com.alibaba.druid.pool.DruidDataSource

  18. sharding.jdbc.datasource.ds-master-1.driver-class-name=com.mysql.jdbc.Driver

  19. sharding.jdbc.datasource.ds-master-1.url=jdbc:mysql://10.0.0.3:3306/cool2?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT

  20. sharding.jdbc.datasource.ds-master-1.username=root

  21. sharding.jdbc.datasource.ds-master-1.password=


  22. sharding.jdbc.datasource.ds-master-1-slave-0.type=com.alibaba.druid.pool.DruidDataSource

  23. sharding.jdbc.datasource.ds-master-1-slave-0.driver-class-name=com.mysql.jdbc.Driver

  24. sharding.jdbc.datasource.ds-master-1-slave-0.url=jdbc:mysql://10.0.0.13:3306/cool2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT

  25. sharding.jdbc.datasource.ds-master-1-slave-0.username=root

  26. sharding.jdbc.datasource.ds-master-1-slave-0.password=

  27. sharding.jdbc.datasource.ds-master-1-slave-1.type=com.alibaba.druid.pool.DruidDataSource

  28. sharding.jdbc.datasource.ds-master-1-slave-1.driver-class-name=com.mysql.jdbc.Driver

  29. sharding.jdbc.datasource.ds-master-1-slave-1.url=jdbc:mysql://10.0.0.17:3306/cool2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT

  30. sharding.jdbc.datasource.ds-master-1-slave-1.username=root

  31. sharding.jdbc.datasource.ds-master-1-slave-1.password=


  32. sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id

  33. sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds_$->{id % 2}


  34. sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds_$->{0..1}.user_$->{0..4}

  35. sharding.jdbc.config.sharding.tables.user.table-strategy.inline.sharding-column=id

  36. sharding.jdbc.config.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id % 5}

  37. sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id


  38. sharding.jdbc.config.sharding.master-slave-rules.ds_0.master-data-source-name=ds-master-0

  39. sharding.jdbc.config.sharding.master-slave-rules.ds_0.slave-data-source-names=ds-master-0-slave-0, ds-master-0-slave-1

  40. sharding.jdbc.config.sharding.master-slave-rules.ds_1.master-data-source-name=ds-master-1

  41. sharding.jdbc.config.sharding.master-slave-rules.ds_1.slave-data-source-names=ds-master-1-slave-0, ds-master-1-slave-1

  • 在上面的配置中,其中sharding.jdbc.datasource部分是配置数据库的信息,配置了6个数据库。

  • sharding.jdbc.config.sharding.master-slave-rules.ds0.master-data-source-name配置的是ds0区的的主库名称,同理ds_1。

  • sharding.jdbc.config.sharding.master-slave-rules.ds0.slave-data-source-names配置的是ds0区的的从库名称,同理ds_1。

  • sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column配置的分库的字段,本案例是根据id进行分。

  • sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression配置的分库的逻辑,根据id%2进行分。

  • sharding.jdbc.config.sharding.tables.user.actual-data-nodes配置的是user表在真实数据库中的位置,ds$->{0..1}.user$->{0..4}表示 数据在ds0和ds1中的user0、user1、user2、user3、user_4中。

  • sharding.jdbc.config.sharding.tables.user.table-strategy.inline.sharding-column,配置user表数据切分的字段

  • sharding.jdbc.config.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id % 5},配置user表数据切分的策略。

  • sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id 自动生成id。

然后在Spring Boot启动类的注解@SpringBootApplication,加上exclude={DataSourceAutoConfiguration.class},代码如下:

  
  
  1. @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

  2. @EnableConfigurationProperties

  3. public class ShardingJdbcDbMsTblApplication {


  4. public static void main(String[] args) {

  5. SpringApplication.run(ShardingJdbcDbMsTblApplication.class, args);

  6. }


  7. }

测试

测试同上一篇文章,这里不在重复。

源码下载

https://github.com/forezp/SpringBootLearning/tree/master/sharding-jdbc-example/sharding-jdbc-db-ms-tbl

资料参考

https://github.com/apache/incubator-shardingsphere-example/releases/tag/3.1.0.M1

https://shardingsphere.apache.org/document/current/cn/overview/

https://github.com/apache/incubator-shardingsphere


热门内容:


感谢搓一下“在看

本文分享自微信公众号 - 方志朋(walkingstory)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部