后台开发中的分库分表技术
Posted Sumslack团队
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后台开发中的分库分表技术相关的知识,希望对你有一定的参考价值。
在上一篇《》,我们收集到了来自各个业务系统的log4j日志,这个数据量很大,每天大概会收集到30w的请求量,一年下来大概会累计1.09亿的数据量,那么,海量的数据如何存放呢?
这篇文章将带你进入分库分表技术,目前市面上分库分表中间件比较多,我们这里选用Sharding-Sphere,这是官网的介绍:
Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款产品组成。3款产品提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
建立sharding_logging数据库两个,来自不同的物理机,分库;
每个sharding_logging数据库建立3个分区表t_logging0,t_logging1,t_logging2,分表;
订阅Redis频道,将收集到的所有log4j日志散列到这两个库,3个表,即每个表大概能拿到总数据量/6的数据量,按需你可以任意扩展库数量和表数量;
接下来,就开始动手吧,建立一个SpringBoot2的空项目,然后加入必要的依赖:
1<properties>
2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
4 <java.version>1.8</java.version>
5 <version.sharding.jdbc>3.0.0.M1</version.sharding.jdbc>
6 <version.druid>1.0.20</version.druid>
7 </properties>
8 <dependencies>
9 <dependency>
10 <groupId>org.springframework.boot</groupId>
11 <artifactId>spring-boot-starter-jdbc</artifactId>
12 </dependency>
13 <dependency>
14 <groupId>com.fasterxml.jackson.dataformat</groupId>
15 <artifactId>jackson-dataformat-yaml</artifactId>
16 </dependency>
17 <dependency>
18 <groupId>com.alibaba</groupId>
19 <artifactId>fastjson</artifactId>
20 <version>1.2.10</version>
21 </dependency>
22 <dependency>
23 <groupId>org.springframework.boot</groupId>
24 <artifactId>spring-boot-configuration-processor</artifactId>
25 <optional>true</optional>
26 </dependency>
27 <dependency>
28 <groupId>redis.clients</groupId>
29 <artifactId>jedis</artifactId>
30 <version>2.7.3</version>
31 </dependency>
32 <dependency>
33 <groupId>mysql</groupId>
34 <artifactId>mysql-connector-java</artifactId>
35 <scope>runtime</scope>
36 </dependency>
37 <dependency>
38 <groupId>org.springframework.boot</groupId>
39 <artifactId>spring-boot-configuration-processor</artifactId>
40 <optional>true</optional>
41 </dependency>
42 <dependency>
43 <groupId>io.shardingsphere</groupId>
44 <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
45 <version>${version.sharding.jdbc}</version>
46 </dependency>
47 <dependency>
48 <groupId>io.shardingsphere</groupId>
49 <artifactId>sharding-jdbc-spring-namespace</artifactId>
50 <version>${version.sharding.jdbc}</version>
51 </dependency>
52 <dependency>
53 <groupId>org.apache.commons</groupId>
54 <artifactId>commons-dbcp2</artifactId>
55 <version>2.5.0</version>
56 </dependency>
57 </dependencies>
配置application.properties,定义分库分表规则:
1sharding.jdbc.datasource.names=ds0,ds1
2#数据源定义:略
3#默认数据源
4sharding.jdbc.config.sharding.default-data-source-name=ds0
5#默认分表规则
6sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
7sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2}
8#t_logging分库分表规则
9sharding.jdbc.config.sharding.tables.t_logging.actual-data-nodes=ds$->{0..1}.t_logging$->{0..2}
10sharding.jdbc.config.sharding.tables.t_logging.table-strategy.inline.sharding-column=log_id
11#log_id取摸分表
12sharding.jdbc.config.sharding.tables.t_logging.table-strategy.inline.algorithm-expression=t_logging$->{log_id % 3}
13# database split by log_id
14sharding.jdbc.config.sharding.tables.t_logging.database-strategy.inline.sharding-column=log_id
15##log_id取摸分库
16sharding.jdbc.config.sharding.tables.t_logging.database-strategy.inline.algorithm-expression=ds$->{log_id % 2}
如果你采用读写分离,也是支持的,只要定义好数据源后,定义分离规则即可:
1sharding.jdbc.config.sharding.master-slave-rules.ds0.master-data-source-name=ds-master0
2sharding.jdbc.config.sharding.master-slave-rules.ds0.slave-data-source-names=ds-master0-slave0, ds-master0-slave1
3sharding.jdbc.config.sharding.master-slave-rules.ds1.master-data-source-name=ds-master1
4sharding.jdbc.config.sharding.master-slave-rules.ds1.slave-data-source-names=ds-master1-slave0, ds-master1-slave1
全部建立好后,通过依赖注入,将DataSource拿到即可,你可以定义一个Service:
最后程序输出:
可以看到,每条日志都会被散列到库和相应的分区表中,这样你再也不用担心某个表数据太多影响数据库性能和查询速度了,更牛逼的是不光支持MySQL,SQLServer和Oracle也是支持的,至于查询和插入,按标准的JDBC来写就可以了,比如INSERT你只需要使用逻辑表名(就是配置文件的逻辑表名,如下图红线框)就可以了:
中间件会自动散列到如ds0.t_logging2表中。
以上是关于后台开发中的分库分表技术的主要内容,如果未能解决你的问题,请参考以下文章
还在手动分库分表?快用 ShardingSphere 架构,真香!!