{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

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

BicycleWarriorBicycleWarrior 回答0 收藏1
收藏问题

2条回答

susheng

susheng

回答于2022-06-28 14:38

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

何为分库分表?采取一定的策略将大量的表数据分布在不同的数据库,表中实现数据的均衡存储!

分库分表的背景:随着信息数据的急剧增长,单点数据库会有宕机,或者单库单表性能低下,查询和存储效率低的问题,使用分库分表实现数据的分布存储,性能更好,适合现在数据量多,用户需求高的特点!

分库分表的优点:数据分布在不同的数据库中,单表数据量低,查询速度快!可以在每个节点搭建集群防止数据丢失!

分库分表遇到的问题:

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还在写,到时候分享,需要的朋友,敬请关注。。。

评论0 赞同0
  •  加载中...
galois

galois

回答于2022-06-28 14:38

分库/分表

顾名思义,分库分表就是按照一定的规则,对原有的数据库和表进行拆分,把一个数据库分成多个库,把一张表拆分成为多张表。

为什么要分库/分表

随着时间和业务的发展,数据库和表中的数据量会越来越多,对硬件特别是磁盘消耗是越来越大,磁盘寻址、IO操作、系统内存都有很大的开销,为了提升数据库操作的效率,因此以空间换时间。打个比方,你把五颜六色的玻璃球放到一个篮子里,如果去找各种颜色球的数量是不是很麻烦。如果按照颜色分开放,找绿色的球直接去绿色区,不用顾及其他颜色,是不是效率就高了很多。就是这个原理

垂直分库/分表

垂直划分数据库是根据业务进行划分,将一张表的几个字段分成几张表,把大表变成小表,把一个大库按照业务 拆分几个专门库,比如商品,按照商品类别,商品详情,订单详情,订单 ,划分到 商品库,订单库中 。通过降低单库(表)的大小来提高性能 放入不同的库中。

水平分库/分表

水平划分是根据一定规则,例如时间或hash值等进行数据的拆分。这种拆分都是行级别拆分,也就是所有拆分的都是完整的一条数据。比如把用户表按照年份拆分2018年注册的用户,2019年的用户,2018之前注册的用户。

MyCat

Mycat是一款开源的数据库中间件,主要是用作数据库代理,也就是消费数据库数据的消费方不直接接触数据库,通过mycat来代理访问。就像明星一样,你有商演想找明星,不会直接找到明星,会找到经纪人,经纪人来谈具体事宜,经纪人再告诉明星。

Mycat的原理中最重要是在sql执行前可以拦截处理一些逻辑,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。因此对于分库分表来说把分库分表的规则写入拦截器,拦截器通过分析来指向真实的地址获取数据,还可以将数据进行逻辑处理后返回消费方。这样就完成了分库分表的操作。这样就达成了对开发无感知的目的,避免分库分表造成了路由逻辑的编写。

以下就是网上找来的mycat分库分表的示意图,相信很容易看懂。

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

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<