Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?
公司做了自己的分库分表组件,下面就自己的经验来看下分库分表的优点和碰到的问题!
何为分库分表?采取一定的策略将大量的表数据分布在不同的数据库,表中实现数据的均衡存储!
分库分表的背景:随着信息数据的急剧增长,单点数据库会有宕机,或者单库单表性能低下,查询和存储效率低的问题,使用分库分表实现数据的分布存储,性能更好,适合现在数据量多,用户需求高的特点!
分库分表的优点:数据分布在不同的数据库中,单表数据量低,查询速度快!可以在每个节点搭建集群防止数据丢失!
分库分表遇到的问题:
1,多库多表需要不重复的ID生成策略,但是数据重复!
解决方案:UUID,全局序列号等等!
2,如果是按照hash等方式实现的分库分表,可能难以扩展
解决方案:1,使用时间段或者ID等进行划分,可持续扩展(会带来别的问题),2,数据重新迁移!
3,连接查询,统计等出现困难:
解决方案:1,按照某个指定的分库分表字段(ID)(分布在同一个库中)进行连接查询!2,将主要字段进行冗余,方便统计和连接查询!
分库分表的组件有很多,mycat是最流行的一个!
怎么使用mycat进行分库分表?
1,下载安装mycat,配置环境变量!
2,配置文件(启动内存等),使用命令行启动和停止!
3,创建多库多表!
4,选择分库分表策略(水平和垂直),算法等!
5,配置server.xml,schema.xml,rule.xml用于配置映射,规则等!
6,连接测试!
具体的mycat应用不是几句话可以说的清的,最好是自己搭建环境,自己写Demo测试,方能掌握!
我的Demo还在写,到时候分享,需要的朋友,敬请关注。。。
分库/分表
顾名思义,分库分表就是按照一定的规则,对原有的数据库和表进行拆分,把一个数据库分成多个库,把一张表拆分成为多张表。
为什么要分库/分表
随着时间和业务的发展,数据库和表中的数据量会越来越多,对硬件特别是磁盘消耗是越来越大,磁盘寻址、IO操作、系统内存都有很大的开销,为了提升数据库操作的效率,因此以空间换时间。打个比方,你把五颜六色的玻璃球放到一个篮子里,如果去找各种颜色球的数量是不是很麻烦。如果按照颜色分开放,找绿色的球直接去绿色区,不用顾及其他颜色,是不是效率就高了很多。就是这个原理
垂直分库/分表
垂直划分数据库是根据业务进行划分,将一张表的几个字段分成几张表,把大表变成小表,把一个大库按照业务 拆分几个专门库,比如商品,按照商品类别,商品详情,订单详情,订单 ,划分到 商品库,订单库中 。通过降低单库(表)的大小来提高性能 放入不同的库中。
水平分库/分表
水平划分是根据一定规则,例如时间或hash值等进行数据的拆分。这种拆分都是行级别拆分,也就是所有拆分的都是完整的一条数据。比如把用户表按照年份拆分2018年注册的用户,2019年的用户,2018之前注册的用户。
MyCat
Mycat是一款开源的数据库中间件,主要是用作数据库代理,也就是消费数据库数据的消费方不直接接触数据库,通过mycat来代理访问。就像明星一样,你有商演想找明星,不会直接找到明星,会找到经纪人,经纪人来谈具体事宜,经纪人再告诉明星。
Mycat的原理中最重要是在sql执行前可以拦截处理一些逻辑,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。因此对于分库分表来说把分库分表的规则写入拦截器,拦截器通过分析来指向真实的地址获取数据,还可以将数据进行逻辑处理后返回消费方。这样就完成了分库分表的操作。这样就达成了对开发无感知的目的,避免分库分表造成了路由逻辑的编写。
以下就是网上找来的mycat分库分表的示意图,相信很容易看懂。
以上就是分库分表和mycat分库分表的简单介绍。如果深入了解可到mycat社区进一步学习。希望我的回答能够解决你的问题,如果有不同观点可留言讨论。点个赞关注一下吧。