|
本文参考孙卫琴,杜聚宾所创作的<<Spring Cloud Alibaba微服务开发宝典>>一书,即将出版ShardingSphere围绕着分库分表,必须建立真实表和逻辑表在结构上的对应关系,还要建立真实表和逻辑表的记录的对应关系。本文介绍ShardingSphere的核心概念。1. 和表相关的概念和表相关的概念包括:真实表、逻辑表、数据节点、绑定表、广播表。
(1)真实表
数据库中真实存在的物理表。例如order_1表、order_2表。
(2)逻辑表
存放同类型数据的所有真实表的合并表,例如order_1表和order_2表的逻辑表为order。逻辑表是ShardingSphere提供的虚拟表,使得应用程序可以忽略分库分表的细节,只需操纵一张逻辑表。
(3)数据节点
由数据源和真实表组成。例如ds1.order_1数据节点表示位于ds1数据源的真实表order_1。
(4)绑定表
指的是分片规则一致的关系表(主表、子表),例如13.1节的图13-7把order表进行垂直和水平拆分,得到order_1、order_2、order_detail_1和order_detail_2表。order_1和order_2表的逻辑表为order主表,order_detail _1和order_detail _2表的逻辑表为order_detail子表。order逻辑主表与order_detail逻辑子表为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,可以提升关联查询性能。
以下是应用程序向ShardingShpere提交的一条查询语句,应用程序操纵的是order和order_detail逻辑表:
SELECT * FROM order o JOIN order_detail d
ON o.id=d.id WHERE o.id in (10, 11); |
在不配置绑定表关系时,ShardingSphere会向真实的数据库提交4条SQL语句,它们呈现为笛卡尔积:
SELECT * FROM order_1 o JOIN order_detail_1 d
ON o.id=d.id WHERE o.id in (10, 11);
SELECT * FROM order_1 o JOIN order_detail_2 d
ON o.id=d.id WHERE o.id in (10, 11);
SELECT * FROM order_2 o JOIN order_detail_1 d
ON o.id=d.id WHERE o.id in (10, 11);
SELECT * FROM order_2 o JOIN order_detail_2 d
ON o.id=d.id WHERE o.id in (10, 11); |
配置了order与order_detail逻辑表的绑定表关系,ShardingSphere只会向真实的数据库提交两条SQL语句,不再呈现为笛卡尔积:
SELECT * FROM order_1 o JOIN order_detail_1 d
ON o.id=d.id WHERE o.id in (10, 11);
SELECT * FROM order_2 o JOIN order_detail_2 d
ON o.id=d.id WHERE o.id in (10, 11); |
(5)广播表
在实际应用中,有些表没必要做分片,例如字典表,因为它的数据量不大,而且这种表常常需要与存放海量数据的表进行关联查询。广播表会在各个真实数据库中进行存储,存储的表结构以及表中的数据完全相同。
2. 和分片相关的概念分片包含两层含义:- 对表进行水平拆分,使得表中的数据可以分片存放到多个分表中。
- 对于应用程序提交的SQL语句,按照分片策略计算出SQL的路由,即到底在哪些真实表中执行SQL操作。
(1)分片键
表中用于分片的字段,即对表进行水平拆分的字段。例如根据order订单表中的id主键分片,则id主键就是分片键。
分片键分为两种:- 单分片键:把单个字段作为分片键。
- 复合分片键:把多个字段作为分片键。
(2)分片算法(ShardingAlgorithm)
由于分片算法和业务实现紧密相关,因此并未提供内置的具体分片算法,而是从各种分片场景中抽象出更高层级的分片算法。目前提供四种分片算法,参见表1。
表1 分片算法的种类
(3)分片策略
包含分片键和分片算法。分片策略结合分片键和分片算法,指定了具体的分片方式。目前包括5种分片策略,参见表2。
表2 分片策略的种类
(4)分片策略配置维度
分片策略配置包括两个维度:数据源分片维度和表分片维度。两种维度的分片策略配置API完全相同。数据源分片维度用于指定数据被分配的目标数据源;表分片维度用于指定数据被分配的目标表。由于表存在于数据源内,所以表分片维度会依赖数据源分片维度的分片结果。13.6.9节的配置代码就从这两个维度设置了分片策略。
程序猿的技术大观园:www.javathinker.net
|
|