sharding-sphere之分库分表算法及策略解释

背景
        为解决关系型数据库面对海量数据由于数据量过大而导致的性能问题时,将数据进行分片是行之有效的解决方案,而将集中于单一节点的数据拆分并分别存储到多个数据库或表,称为分库分表。 分库可以有效分散高并发量,分表虽然无法缓解并发量,但仅跨表仍然可以使用数据库原生的ACID事务。而一旦跨库,涉及到事务的问题就会变得无比复杂。
        分库分表一般有两种拆分方式。按照业务拆分的方式称为垂直拆分。
        例如,根据业务的不同将订单库拆成两个相同的数据库,称之为垂直拆分。垂直拆分可以缓解数据量和访问量带来的问题,但无法根治,如果垂直拆分之后的订单数量依然超过单节点所能承载的阈值,则需要水平拆分来进一步处理。 将一个表中的数据按照一定的业务规则拆分至不同表和数据库中,称之为水平拆分。例如,原来的订单数据在order_ds.t_order表中,如果按照订单的user_id将订单拆分为2个库,再按照订单的order_id在每个库中分成4个表,那么拆分的结果则是order_ds_0.t_order_0,order_ds_0.t_order_1,order_ds_0.t_order_2,order_ds_0.t_order_3,order_ds_1.t_order_0,order_ds_1.t_order_1,order_ds_1.t_order_2,order_ds_1.t_order_3。 这只是简单的水平拆分案例,在实际使用中,将库和表拆分的更加分散也是十分常见的。
        虽然数据分片解决了性能问题,但也额外的引入了其他问题。面对如此散乱的分库分表之后的数据,应用开发和运维人员对数据库的操作变得异常繁重就是其中的重要挑战之一。他们需要知道什么样的数据需要从哪个具体的数据库的分表中去获取。透明化分库分表所带来的影响,让使用方尽量像使用一个数据库一样使用水平拆分之后的数据库,是分库分表中间件的主要功能。

分片的概念
分片键
用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:订单表订单ID分片尾数取模分片,则订单ID为分片字段。SQL中如果无分片字段,将执行全路由,性能较差,支持多分片字段。
分片算法
通过分片算法将数据分片,支持通过等号、BETWEEN和IN分片。分片算法需要应用方开发者自行实现,可实现的灵活度非常高。
目前提供4种分片算法。由于分片算法和业务实现紧密相关,因此并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。
精确分片算法
对应PreciseShardingAlgorithm,用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用。
范围分片算法
对应RangeShardingAlgorithm,用于处理使用单一键作为分片键的BETWEEN AND进行分片的场景。需要配合StandardShardingStrategy使用。
复合分片算法
对应ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,多分片键逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合ComplexShardingStrategy使用。
Hint分片算法
对应HintShardingAlgorithm,用于处理使用Hint行分片的场景。需要配合HintShardingStrategy使用。
分片策略
包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供5种分片策略。
标准分片策略
对应StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。
复合分片策略
对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符交于算法接口,完全由应用开发者实现,提供最大的灵活度。
行表达式分片策略
对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_${u_id % 8} 表示t_user表按照u_id按8取模分成8个表,表名称为t_user_0到t_user_7。
Hint分片策略
对应HintShardingStrategy。通过Hint而非SQL解析的方式分片的策略。
不分片策略
对应NoneShardingStrategy。不分片的策略。
Hint
对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录ID分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用。

你可能感兴趣的:(sharding-sphere之分库分表算法及策略解释)