简单粗暴的分库分表设计方案

转自:

来源于:https://zhuanlan.zhihu.com/p/37438652

简单粗暴的分库分表设计方案_第1张图片

1.数据散列模式

数据散列模式主要是通过hash算法将数据随机写入(分库)分表中,用以提高数据库的负载能力,这种设计方案下分表字段通常需要被包含在分表中。

优点:可以解决有局部热点的数据的负载均衡,并整体提高数据库的负载能力。

缺点

(1)需要在前期规划好分库和分表的数量,不能动态扩展;

(2)分页查询需要基于shard-key,限制业务的查询场景;

DDAL的实现

<bean id = "idRule" class = "org.hellojavaer.ddal.ddr.shard.rule.SpelShardRouteRule" >
    <property name = "scRouteRule" value = "{scName}_{format('%02d', sdValue % 2)}" />  
    <property name = "tbRouteRule" value = "{tbName}_{format('%04d', sdValue % 8)}" />
bean>

2.数据区段模式

数据区段模式是按照数据值的区间进行分库分表,比如1 - 100到写入0号表,101-200写入200号表,依次类推。

这种模式主要用于shard-key没有局部热点的数据,其中的一个业务场景为:日志表的按时间维度的切分。

优点:支持动态水平扩展

缺点:存在局部数据热点问题

DDAL实现:你可以使用DivideShardRouteRule来实现该功能,也可以使用SpelShardRouteRule(eg: 按进行日切的路由规则表达式’{tbName}_{dateFormat(‘yyyyMMdd’, sdValue)’)来实现该功能,两者之间的差别在于DivideShardRouteRule在处理sql的between-and操作时更加高效

3.数据隔离模式

数据隔离模式在实现上体现为只分库不分表同时分表字段shard-key不包含在分表中。在业务上体现为业务数据按schema进行隔离,分库元信息独立存储。

优点

(1)数据隔离

(2)每次分库路由后,都只会落在一个数据库节点上,分库操作‘转换’为单库操作,因此所有单库操作可以被支持(包括复杂的分页查询)

缺点:定制化场景,单schema内可能出现容量和性能问题

DDAL实现:由于shard-key没有被包含在分表中,因此需要使用ShardRoute注解来引导分表路由,或者使用ShardRouteContext来引导分表路由,这两种的设置是等效的。

你可能感兴趣的:(MySQL,Java)