持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 21 天,点击查看活动详情
1 前言
在分布式系统中,当系统达到一定的规模之后,数据量达到亿级之后,不论从数据读取速度还是业务系统的性能考虑,就需要考虑分库分表的问题,分库分表的引入能够解决数据读写慢的问题,当然分库分表需要考虑业务,糅合一定的业务信息,在本文中将讲解 sharding-jdbc 的分库分表。
2 分库分表&读写分离
如下图所示,当数据库操作时,需要根据分库分表键操作数据库表,主数据库表完成之后需要将数据同步至从数据库,查询的语句需要在从数据库执行。
在这里需要理解几个概念:
- 1 分库分表键,用于数据分片的数据库字段,比如一张订单表采用分库分表之后,就需要以订单 id 或者用户的 id 进行分库分表,在查询信息时也需要根据分库分表键进行查询,否则就需要进行扫描所有的分表。
- 2 真实表和逻辑表,一般情况下真实表就是数据库表中真实存在的表,以订单表为例,tb_oder 就是逻辑表,但是在数据库中存在的表可能是 tb_oder_1, tb_order_2... 等。
- 3 分片算法。分片算法就是根据分片键将数据一定的算法路由到对应的物理表中,在代码中操作的是逻辑表,sharding-jdbc 根据分片键将数据路由到数据库中的物理表中。
3 分片算法
在 sharding-jdbc 中只是提供了分片算法的接口,没有相应的实现,需要开发者根据业务的实际情况自行实现。
3.1 精确分片算法
精确分片算法即 PreciseShardingAlgorithm, 用于单个字段作为分片键,sql 中如果有 = 或者 in 等条件的分片则可以使用精确分片算法。
3.2 范围分片算法
范围分片算法即 RangeShardingAlgorithm,同样是用于单个字段的分片键,当 sql 中有 范围查找 between and , > < 等条件时可以使用范围分片,范围和精确分片都需要在标准分片策略下使用。
3.3 复合分片算法
复合分片算法 ComplexKeysShardingAlgorithm 用于多个字段作为分片键进行使用,根据多个字段处理业务逻辑,复合分片算法需要在复合分片策略下进行使用。
3.4 Hint 分片算法
Hint 分片算法即 HintShardingAlgorithm,这里需要手动干预指定 sql 的目标数据库和数据库表信息,这也叫做强制路由。
4 分片策略
讲完了分片算法,就需要讲述一下分片策略,分片策略是一种抽象的概念,实际分片操作是由分片算法和分片键来完成的。
4.1 标准分片策略
标准分片策略适用于单个分片键,支持该策略的分片算法有精确分片算法和范围分片算法。
4.2 复合分片策略
复合分片策略同样支持 sql 语句中的 = > < >= <= IN 等符号,但是它支持的是多个分片键,具体的分片键有应用开发者来决定。
4.3 行表达式策略
行表达式策略比较简单,支持 sql 中 = 和 IN 的分片操作,但只支持单分片键,不需要自定义分片算法,可以再配置文件中直接定义分片算法。如下所示:
# 就是对order_id 取余,数据库表的范围是 t_order_0 到 t_order_3
t_order_$->{order_id % 4}
4.4 Hint 分片策略
Hint 分片策略,对应上边的 Hint 分片算法,通过指定分片键而不是从 sql 中提取分片键进行分片操作。
5 总结
在本文中主要讲述了 sharding-jdbc 的一些场景,着重讲述了分库分表的算法和分库分表的策略,总结成一张图的话如下图所示:
在后续的文章中将介绍分库分表的实战操作,欢迎继续关注。