37 | 什么时候需要分表分库?
37 | 什么时候需要分表分库?
讲述:李良
时长13:53大小12.70M
什么时候要分表分库?
如何分表分库?
分表分库之后面临的问题
1. 分布式事务问题
2. 跨节点 JOIN 查询问题
3. 跨节点分页查询问题
4. 全局主键 ID 问题
5. 扩容问题
总结
思考题
赞 12
提建议
精选留言(31)
- mmilan2019-08-28老师说"我们在最开始设计表数据量时,尽量使用 2 的倍数来设置表数量。当我们需要扩容时,也同样按照 2 的倍数来扩容,这种方式可以减少数据的迁移量",不是很理解为什么按2的倍数,就能减少数据的迁移量?
作者回复: 我们的分表一般是根据[字段的hash值%表数量]或来进行分配的。 假设某分表字段的哈希值4、8、12,原来的表数量为4,所以这几个数据都会在一个表中。当扩容到8时,只有12会迁移到第五张表中。 如果扩容到6张表的话,此时哈希值为4的数据会迁移到第五张表,哈希值为8的需要迁移到第三张表,只有哈希值为12的不需要迁移。
共 11 条评论32 - Jxin2019-08-221.中间件应该就mycat,sharding jdbc应该属于基础框架来使用。 2.提个问题,公司禁用分区,不知为何,但结果就是相关知识忘光光。本章刚好也有提到,顺带麻烦老师介绍下分区,这块反而成薄弱点了。
作者回复: MySQL的表分区存在一些限制,常见的有:分区字段不能为NULL,避免建立和分区列不匹配的索引。 除此之外,底层实现的表分区,对MySQL来说其实是一个性能消耗的过程,特别是范围分区,服务器需要扫描所有的分区定义的列表来确定具体的分区。 表分区在操作数据过滤之前,是需要打开并锁住所有底层表的,这个过程是在分区过滤之前发生的,所有是一个非常消耗性能的过程。 分区表的维护成本也是很高的,特别是重组分区。 总之,MySQL的表分区实现偏底层,定制不灵活且性能不是很好,维护成本高。所以很多DBA不建议使用。
15 - QQ怪2019-08-15现在Fescar已经改名为Seata
作者回复: 看来成长比较迅速呀。这个开源中间件比较新,去年刚开源的时候了解下源码,顺便实践了基本功能。
15 - QQ怪2019-08-15没有什么大厂经验,看了老师的分享的确对大厂数据库分库分表设计有一定的理解和提高12
- 咬尖月牙儿2019-08-15老师,可以用tidb这种newsql取代分库分表的方案吗
作者回复: 可以的,TiDB是一种集中式的数据存放解决方案,可以节省开发人员很多工作量。
10 - .2020-03-21数据冗余后,如果数据修改后数据更新怎么方便点?
作者回复: 一般冗余数据前提是不频繁被修改的,甚至更严格为不会变修改的数据才能坐数据冗余
9 - 儿戏2019-09-05老师,请问下 订单表用 用户ID 做hash 分库分表后,订单的item表会成倍增长,造成的数据倾斜,怎么解决?做2次分表吗?
作者回复: 一般我们都是采用hash求余的方法来实现分库分表,如果在生产环境中出现数据倾斜比较严重,我们需要考虑使用一致性hash算法实现分库分表,也是二次分表的一种实现,只不过可以对局部倾斜数据进行二次分表,实现起来方便,且只影响部分表数据。
6 - Mr.wang2020-03-12刘老师,这里我不太了解一个表字段非常多的时候,新增会发生跨页问题,除了老师在上一章中讲到mysql主键id不是自增id,在新增的时候会发生跨页的原因,这里的跨页还有其他原因吗?
作者回复: 数据页的大小是有限的,如果插入行数据大于数据页大小,就会发生跨页问题了。
5 - on the way2020-11-13用一致性hash算法的思想也可以减少数据的迁移3
- 钱2019-09-15我使用过公司基础架构部自研的数据库中间件,对于分库分表的的数据查询可以动态路由,不过也就是动态路由,对于join的支持有限,另外分布式事务保证的也一般般。不知开源产品中有哪些佼佼者,功能多性能高?
作者回复: sharding-jdbc\mycat在行业内使用比较多,各有优势
3 - 一眼万年2019-08-19老师,mysql单表最大储存性能分析能详细点,而不是简单一句性能能B+树深度有关共 3 条评论2
- 明天更美好2019-08-15个人感觉单表超过500w就要分表,不然对于性能有要求的业务来说性能太差了。单库数据超2T,就得分库。这样的话可能更合理些共 5 条评论2
- 失火的夏天2019-08-15用过阿里的DRDS,它只支持一个字段作为分库分表键,不能多个字段同时分库分表,而且不支持分布式事务,如果要修改分库键的值,就要先插入再删除,或者先删除再插入。插入,更新,查询的时候都要带上分库键。不过好像有个参数可以控制是不是一定要带分库键,大概就了解这么些。2
- Geek_9269212021-07-07自己接触过的分布式系统中大多数还是使用了分库分表,分库主要是根据不同的业务或者服务名划分库,由于业务数据量还没那么大,仅仅做了分库,这个时候只是在报表统计这边会牵涉到多数据源查询以及不同的库进行join查询,而业务中的多数据库操作,我们是把数据操作划分到对应的服务上,可以用MQ、RPC通信、redis等操作。报表中的多数据源join实践过后是禁止这样子操作,因为不知道你join的那个库中的表是否会发生迁移,这个时候应该是把join的操作放在代码里面实现,虽然效率会比直接join要慢很多,但是可以通过多线程的方式去提升处理数据的速度,例如CompleteFutrue的异步非阻塞进行数据处理.展开2
- 皮卡皮卡2019-09-26GitHub上搜snowflake已经淘汰了
作者回复: 可以自我实现一个snowflake工具类,理解雪花算法的原理即可
2 - Demon.Lee2019-09-18泪奔,之前用微服务开发产品遇到的难点全中,要是早点看到专栏就好了,人生啊~~~1
- 许童童2019-08-15我们的系统前期没设计好,现在想分库分表很难,大量join查询,很难处理。 想用阿里云的分页式rdbms,不知道可行性。
作者回复: 前期没有做好分表的准备,后面做表升级工作量就大很多,而风险更高。 例如一个表如果是自增主键ID,而主键ID又跟其他业务表做了耦合,当我们要做表升级时,需要用另外一个字段做分表字段,这时候就存在主键ID在分表后可能存在冲突的问题。 所以一开始我们就要想到这张表有可能需要做表升级,在做表关联时用另外一个非自增主键ID做关联,或者使用全局自增ID或雪花算法统一获取全局主键ID。 阿里云的数据库暂时没有用过,多了解支持的一些功能,匹配下是否更适合自己的业务。
2 - Tree2020-11-12老师我想问一下,雪花算法的datacenterid 和 workerId 服务器该怎么获取分配?
- 与路同飞2020-09-23基于 Elasticsearch、Solr 存储的订单数据,主要用于运营人员根据其它字段进行分页查询。这种给后台运营人员操作的数据,怎么保证实时性呢?例如运营人员手动关闭了订单,这个订单数据的写操作更新的是mysql,mysql同步到elasticSearch会有延迟。这种延迟老师有什么好的建议么?针对这种写后读的场景1
- 李武2020-08-14shardingjdbc对mysql支持比较好,其他数据库貌似会有很多问题