Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?


公司做了自己的分库分表组件 。下面就自己的经验来看下分库分表的优点和碰到的问题!

Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
分库分表的背景:随着信息数据的急剧增长 。单点数据库会有宕机 。或者单库单表性能低下 。查询和存储效率低的问题 。使用分库分表实现数据的分布存储 。性能更好 。适合现在数据量多 。用户需求高的特点!
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用于配置映射 。规则等!
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
具体的mycat应用不是几句话可以说的清的 。最好是自己搭建环境 。自己写Demo测试 。方能掌握!
我的Demo还在写 。到时候分享 。需要的朋友 。敬请关注 。。。
其他观点:
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
分库/分表
顾名思义 。分库分表就是按照一定的规则 。对原有的数据库和表进行拆分 。把一个数据库分成多个库 。把一张表拆分成为多张表 。
为什么要分库/分表
随着时间和业务的发展 。数据库和表中的数据量会越来越多 。对硬件特别是磁盘消耗是越来越大 。磁盘寻址、IO操作、系统内存都有很大的开销 。为了提升数据库操作的效率 。因此以空间换时间 。打个比方 。你把五颜六色的玻璃球放到一个篮子里 。如果去找各种颜色球的数量是不是很麻烦 。如果按照颜色分开放 。找绿色的球直接去绿色区 。不用顾及其他颜色 。是不是效率就高了很多 。就是这个原理
垂直分库/分表
垂直划分数据库是根据业务进行划分 。将一张表的几个字段分成几张表 。把大表变成小表 。把一个大库按照业务 拆分几个专门库 。比如商品 。按照商品类别 。商品详情 。订单详情 。订单。划分到 商品库 。订单库中。通过降低单库(表)的大小来提高性能 放入不同的库中 。
水平分库/分表
水平划分是根据一定规则 。例如时间或hash值等进行数据的拆分 。这种拆分都是行级别拆分 。也就是所有拆分的都是完整的一条数据 。比如把用户表按照年份拆分2018年注册的用户 。2019年的用户 。2018之前注册的用户 。
MyCat
Mycat是一款开源的数据库中间件 。主要是用作数据库代理 。也就是消费数据库数据的消费方不直接接触数据库 。通过mycat来代理访问 。就像明星一样 。你有商演想找明星 。不会直接找到明星 。会找到经纪人 。经纪人来谈具体事宜 。经纪人再告诉明星 。
Mycat的原理中最重要是在sql执行前可以拦截处理一些逻辑 。它拦截了用户发送过来的SQL语句 。首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等 。然后将此SQL发往后端的真实数据库 。并将返回的结果做适当的处理 。最终再返回给用户 。因此对于分库分表来说把分库分表的规则写入拦截器 。拦截器通过分析来指向真实的地址获取数据 。还可以将数据进行逻辑处理后返回消费方 。这样就完成了分库分表的操作 。这样就达成了对开发无感知的目的 。避免分库分表造成了路由逻辑的编写 。
以下就是网上找来的mycat分库分表的示意图 。相信很容易看懂 。
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
以上就是分库分表和mycat分库分表的简单介绍 。如果深入了解可到mycat社区进一步学习 。希望我的回答能够解决你的问题 。如果有不同观点可留言讨论 。点个赞关注一下吧 。

推荐阅读