在上一篇《
基于Netty的日志采集中心设计与实现
》,我们收集到了来自各个业务系统的log4j日志,这个数据量很大,每天大概会收集到30w的请求量,一年下来大概会累计1.09亿的数据量,那么,海量的数据如何存放呢?
这篇文章将带你进入分库分表技术,目前市面上分库分表中间件比较多,我们这里选用Sharding-Sphere,这是官网的介绍:
Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款产品组成。3款产品提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
我们这里只使用Sharding-JDBC,结合SpringBoot最新版整合,官网并没有针对SpringBoot如何整合有个详细的demo地址,以下我们会给出,以下是我们的具体需求:
建立sharding_logging数据库两个,来自不同的物理机,分库;
每个sharding_logging数据库建立3个分区表t_logging0,t_logging1,t_logging2,分表;
订阅Redis频道,将收集到的所有log4j日志散列到这两个库,3个表,即每个表大概能拿到总数据量/6的数据量,按需你可以任意扩展库数量和表数量;
接下来,就开始动手吧,建立一个SpringBoot2的空项目,然后加入必要的依赖:
配置application.properties,定义分库分表规则:
如果你采用读写分离,也是支持的,只要定义好数据源后,定义分离规则即可:
全部建立好后,通过依赖注入,将DataSource拿到即可,你可以定义一个Service:
最后程序输出:
可以看到,每条日志都会被散列到库和相应的分区表中,这样你再也不用担心某个表数据太多影响数据库性能和查询速度了,更牛逼的是不光支持MySQL,SQLServer和Oracle也是支持的,至于查询和插入,按标准的JDBC来写就可以了,比如INSERT你只需要使用逻辑表名(就是配置文件的逻辑表名,如下图红线框)就可以了:
中间件会自动散列到如ds0.t_logging2表中。
领取专属 10元无门槛券
私享最新 技术干货