分库分表的垂直分割与水平分割

1、垂直分库

根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与“微服务治理”的做法相似,每个微服务使用单独的一个系统。如图:

                                                 

 2、垂直分表

基于数据表中的“列”进行划分。某个表字段较多,可以新建一张扩展表,将不经常用或者字段长度较大的字段拆分出去。

                                                        

3、水平分割

水平分割分为“库内分表”和“分库分表”,是根据表内数据内在的逻辑关系,将同一个表按照不同条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。如图:

                                                

库内分表只是解决了单一表数据量过大的问题,但没有将表分表到不同机器的库上,因此对减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。

4、水平分割方法

a、根据数值范围:按照时间区间或ID区间来切分。      

b、根据数值取模:一般采用hash取模mod的切分方式。

5、分库分表解决问题

解决了单库单表数据过大,高并发的性能瓶颈,提升系统的稳定性和负载能力。

6、注意事项

a、事务一致性问题

1)分布式事务:

一般可使用“XA协议”和“两阶段提价”处理。分布式事务能最大限度保证了数据库操作的原子性。但在提交事务时需要协调多个节点,推后了提交事务的时间点,延长了事务的执行时间。导致事务在访问共享资源时发生冲突或死锁的概率增高。随着数据库的节点增大,这种趋势会越来越严重,从而成为系统在数据库层面上水平扩展的枷锁。          

2)最终一致性:

对性能要求很高,但对一致性要求不要的系统,可采用事务补偿的方式。与事务在执行中发生错误后立即回滚的方式不同,事务补偿是一种事后检查补救的措施,一些常见的实现方法有:对数据进行对账检查,基于日志进行对比,定期同标准数据来源进行同步等等。

b、跨节点关联查询join问题

1)全局表:

系统中所有模块都可能依赖的一些表,每个数据库中都保存一份。这些数据通常很少进行修改,所以也不担心一致性问题。          

2)字段冗余:

一种典型的反范式设计,利用空间换时间。如订单表保存userID时,也将userName冗余保存一份。但应用场景也有限,比较适用于依赖字段较少的情况。冗余字段的数据一致性也较难保证,比如用户修改了userName后,是否需要在历史订单上同步更新。

3)数据组装:

在系统层面,分两次查询,最后将数据进行字段拼装。        

4)ER分片:

将存在关联关系的表记录存放在同一个分片上,就能较好的避免跨分片join问题。如图:

                                  

c、跨节点分页、排序、函数问题

1)先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序,最终返回给用户。如图:

                                   

上图中只是取第一页的数据,对性能影响还不是很大。但是如果取得页数很大,情况则变得复杂很多,因为各分片节点中的数据可能是随机的,为了排序的准确性,需要将所有节点的前N页数据都排序好做合并,最后再进行整体的排序,这样的操作时很耗费CPU和内存资源的,所以页数越大,系统的性能也会越差。          

2)在使用Max、Min、Sum、Count之类的函数进行计算的时候,也需要先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终将结果返回。如图:

                                

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值