请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于mycat分库分表的一些问题?

老师,你好,这里我想请教一下关于mycat分库分表的相关问题。
1.就是我们的shop商铺表是1个库2个表,我看这里老师你写了两条数据是路由在shop0和shop1表里,如果后续这两个表的数据量激增以后,这两个表肯定是首先要做扩容的吧?既然要扩容,是否要涉及到对我原有的shop0和shop1的迁移?如果涉及的话,这块迁移是怎么来做?那么同理如果后续考虑到商铺要分库的情况,这块的迁移又是怎么来做的?
2.还有就是老师我对你里边讲解的逻辑库和物理库这块不是太理解,是否可以详细说明讲解一下?
3.还有就是针对分库分表的场景的话,什么场景下是需要分库分表的,什么场景下是不分库只分表的?
4.还有就是按照单库的规则划分的话,我单库里的分片表的上限数量在多少的时候就要考虑分库了?
5.关于分库分表以后,我的分片健是如何选型这块是如何来考虑的?比如我商品表对客的数据分片健怎么来选,商品表后台运营的数据分片健怎么来选?这块老师可以详细讲解一下吗?

正在回答

4回答

6、mycat是支持组合分片键的配置的,不需要额外的业务代码实现,只需要在mycat的配置里面配置就可以了。比如userId和时间戳联合分片键,他们的顺序会有影响,一般选择最常用的查询字段在第一位,

比如经常使用userId查询,那么就是userId在最前面。

<rule>

<tableRule name="sharding-by-combined-keys">

<rule>

<columns>user_id,order_id</columns>

<algorithm>sharding-by-combined-keys-algorithm</algorithm>

</rule>

</tableRule>

</rule>

1 回复 有任何疑惑可以回复我~
  • 提问者 慕容1401898 #1
    老师,shardingjdbc这块对组合分片键的使用是如何来做的?
    回复 有任何疑惑可以回复我~ 2024-02-06 18:55:10
Er十七 2024-02-06 17:31:19

2、逻辑库相当于是在mycat配置中写的库名,这个逻辑库名呢实际上在mysql中是不存在的,比如shop分库,那么mysql中我们看到的表名是shop_0,shop_1,这个在mysql中看到的是物理库,那我们

在mycat里面配置的肯定不能指定shop_0和shop_1,是需要指定逻辑库名shop,再加上规则%2才能找到mysql中的物理库名。

3、能不分库分表就不分库分表。一般分库分表的场景:数据量大,影响查询性能;并发高,单数据库无法承载高并发,分摊压力;

4、分库的话,如果只说分片表的数量的话不太准,主要还是参考单库的一个压力,如果单库因为数据量大,磁盘存储异常;或者并发量大,单库承载不了。那么这些时候,只分表就会有问题了。那如果

没有上面的这些问题的话,单库分表的数量其实也没有一定的上限。主要看单库的资源压力。

5、选择合适的分库键是一个关键的点,因为它将直接影响到数据的分布、查询性能以及系统的可扩展性。一般考虑因素有,根据业务特性,选择与业务紧密相关且访问频率高的字段;根据数据分布,

分片键要有区分度,分表之后数据可以均匀的分布到不同表里;根据查询效率,可以根据分库键直接定位到数据,不需要做额外的关联查询。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕容1401898 #1
    老师的第5点理论我都懂,我理解是对客的分片应该是userid吧?如果是后台运营的话这块的分片是userid还是其他的?这个是我比较关注的
    回复 有任何疑惑可以回复我~ 2024-02-06 18:46:23
Er十七 2024-02-06 17:30:53

1、首先数据迁移是一件较繁琐且易出错的事情,尽量在架构设计阶段就预估好后续的流量。还有就是不一定表空间不够用了,就一定要扩展表,如果一些历史数据不需要在实时数据中查询,可以迁移到

历史表中,通过离线对外提供服务。如果一定要到了表迁移的阶段,推荐两种方式。

首先mycat本身是没有提供数据迁移的能力,只能依赖他做数据路由支持,也就是迁移过程可以依赖mycat规则做路由。

第一种,如果业务能忍受一段时间的服务不提供服务,那么迁移就简单了,只需要扩展出来新的表,修改mycat的路由策略。然后就可以写脚本拉去数据后,调用mycat新的路由策略做数据迁移了。

第二种,如果业务不能忍受不提供服务,那此时直接修改mycat路由策略肯定不成,这时候呢可以利用双写的策略,也就是重新建一套新表,老表保留,业务写数据的时候呢两边都写,然后有另外一个脚本

从老表中获取新表没有的数据做数据迁移,迁移完事之后呢,做切写,只写新的一套表。老表废弃。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕容1401898 #1
    老师我非常认可你的设计阶段进行后续流量的预估,可以避免后续数据库的频繁扩容。但是有一些点我还是不太懂,希望老师指点一下:
    1.数据表从范式的角度来看的话,订单表是不太可能冗余一些历史表的关键字段,老师说的一些数据迁移到历史表中做离线查询,这个可以举一个场景吗?
    2.既然业务能容忍不对外提供服务的话,我之前的数据表在扩容以后是如何分摊以前的流量和数据的?举个例子,我理解regigon这种方式还好点,我的order_0存0-500万,1存501-1000万,然后新扩展的表直接在这两个表的基础上进行扩展,然后上边修改路由策略对外提供服务。那么如果是hash的路由策略呢?这个是怎么来做的?
    3.这个脚本的实现方式和细节老师可以指导一下吗?就是我在双写的情况下,脚本是如何在既能感知上层流程双写的同时,又能知道我哪些数据是新表没有的?
    回复 有任何疑惑可以回复我~ 2024-02-06 18:53:47
提问者 慕容1401898 2024-01-25 19:41:31

还有再补充一个问题吧,老师,在分库分表的场景下,是否会存在组合分片健的场景出现?这块有的话 mycat或其他的分库分表的组件,这块是如何来解决的?(这里我举一个场景,比如说我支付宝的订单明细吧,首先我理解一级分片应该是用户id,二级分片应该是时间戳,这两个分片健是否有先后顺序的问题,或者说在代码层面怎么实现的,希望老师能够讲解一下)。

0 回复 有任何疑惑可以回复我~
  • 同学,你好,你的问题已经收到。问题很好,很有针对性,也是在业务开发中经常遇到的问题。这几个问题呢,我总结一下。
    回复 有任何疑惑可以回复我~ 2024-01-26 09:21:04
  • 提问者 慕容1401898 #2
    老师,有一些分布式事务的问题,我也在这里直接问了哈。seata里边对于事物嵌套这块是怎么支持的?就是我是否支持在saga事务里同时支持使用TCC事务?如果有的话,这个方式和场景在咱们的电商里有什么对应的使用场景。
    回复 有任何疑惑可以回复我~ 2024-02-06 18:58:29
问题已解决,确定采纳
还有疑问,暂不采纳
Java主流分布式解决方案多场景设计与实战
  • 参与学习       159    人
  • 解答问题       41    个

本课程是一门关于分布式系统下常见的解决方案的课程

了解课程
意见反馈 帮助中心 APP下载
官方微信