分库分表的故事

2021-02-15  本文已影响0人  河神

数据分片

垂直分片

按照业务进行拆分,不同的业务在不同的库中,将数据访问压力由单库分散到不同的库中,但是,当表数据量超过单节点阈值的时候,还是需要进行水平分片


水平分片

水平分片一般是指将单表根据某个或者某几个字段 分成多个库或者多个表内,每个分片只包含数据的一部分。

逻辑表

水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为 10 张表,分别是 t_order_0 到 t_order_9,他们的逻辑表名为 t_order。不是一个真实存在的表

真实表

在分片的数据库中真实存在的物理表。即上个示例中的 t_order_0 到 t_order_9。

数据节点

数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0。

绑定表

广播表

指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景

分片策略

分片维度

核心原理

解析引擎

将sql语句解析为语法树,分为词法分析和语法分析。


抽象语法树中的关键字的 Token 用绿色表示,变量的 Token 用红色表示,灰色表示需要进一步拆分

路由引擎

用于根据分片键进行路由的场景,又细分为直接路由、标准路由和笛卡尔积路由这 3 种类型。

改写引擎

SELECT order_id FROM t_order WHERE order_id=1 AND remarks=' t_order xxx';
改为
SELECT order_id FROM t_order_1 WHERE order_id=1 AND remarks=' t_order xxx';
  1. 对于分组和排序的sql,如果在返回结果中没有排序或者分组的列,会自动将这列进行补充
  2. 使用avg函数的时候,需要把sum和cout,补充,否则计算也是不准确的

执行引擎

sql的执行需要考虑是否为每一个sql语句创建一个连接,同一个库里面是否只创建一个连接。

自动化执行引擎

1. 准备阶段

2. 执行阶段

用于真正的执行 SQL,它分为分组执行和归并结果集生成两个步骤。


执行过程

归并引擎

遍历归并

将多个数据集合并为一个数据集

排序归并

将每个数据集,采用游标的方式,一步一步的去处数据,实现排序


排序方式

分组归并

聚合归并

累加类型的聚合函数是指 SUM 和 COUNT。它们需要将每一个同组的结果集数据进行累加。

求平均值的聚合函数只有 AVG。它必须通过 SQL 改写的 SUM 和 COUNT 进行计算。

分页归并

归并

分片算法

求余算法:

只要根据分片参数进行求余即可得出分片。性能也比较好。缺点是伸缩性不太好,一旦要增加一个新的分片,就需要对全部旧的数据进行数据迁移。

哈希一致性算法

热点分配


分布式ID

雪花算法 snowflake

生成一个long类型的数字id,其实就是对这64位的二进制形式里面填值,把这64位分成几个部分,彼此间互不影响,每部分都有自己的生成规则,这样在一定的简单的大前提下,能保证全局唯一。


image.png

读写分离

https://shardingsphere.apache.org/document/current/cn/features/sharding/principle/parse/

上一篇 下一篇

猜你喜欢

热点阅读