后台开发中的分库分表技术

Posted Sumslack团队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后台开发中的分库分表技术相关的知识,希望对你有一定的参考价值。

在上一篇《》,我们收集到了来自各个业务系统的log4j日志,这个数据量很大,每天大概会收集到30w的请求量,一年下来大概会累计1.09亿的数据量,那么,海量的数据如何存放呢?


这篇文章将带你进入分库分表技术,目前市面上分库分表中间件比较多,我们这里选用Sharding-Sphere,这是官网的介绍:


Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款产品组成。3款产品提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。



  1. 建立sharding_logging数据库两个,来自不同的物理机,分库;

  2. 每个sharding_logging数据库建立3个分区表t_logging0,t_logging1,t_logging2,分表;

  3. 订阅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 架构,真香!!

还在手动分库分表?快用 ShardingSphere 架构,真香!!

担心数据库性能,念念不忘分库分表怎么办?

老大批评我不要为了“分库分表”而“分库分表”

分库分表技术方案

Mycat——分表分库组件