水平分表

最近更新时间:2023-02-21 11:41:08

我的收藏

概述

水平拆分方案是 TDSQL MySQL版 的基础原理,它的每个节点都参与计算和数据存储,且每个节点都仅计算和存储一部分数据。因此,无论业务的规模如何增长,我们仅需要在分布式集群中不断的添加设备,用新设备去应对增长的计算和存储需要即可。
通过如下视频,您可以了解水平拆分的过程与原理:


水平切分

水平切分(分表):是按照某种规则,将一个表的数据分散到多个物理独立的数据库服务器中,形成“独立”的数据库“分片”。多个分片共同组成一个逻辑完整的数据库实例。
常规的单机数据库中,一张完整的表仅在一个物理存储设备上读写。


分布式数据库中,根据在建表时设定的分表键,系统将根据不同分表键自动分布数据到不同的物理分片中,但逻辑上仍然是一张完整的表。


在 TDSQL MySQL版 中,数据的切分通常就需要找到一个分表键(shardkey)以确定拆分维度,再采用某个字段求模(HASH)的方案进行分表,而计算 HASH 的某个字段就是 shardkey。 HASH 算法能够基本保证数据相对均匀地分散在不同的物理设备中。

写入数据( SQL 语句含有 shardkey )

1. 业务写入一行数据。
2. 网关对 shardkey 进行 hash,得出 shardkey 的 hash 值。
3. 不同的 hash 值范围对应不同的分片(调度系统预先分片的算法决定)。
4. 数据根据分片算法,将数据存入实际对应的分片中。



数据聚合

数据聚合:如果一个查询 SQL 语句的数据涉及到多个分表,此时 SQL 会被路由到多个分表执行,TDSQL MySQL版 会将各个分表返回的数据按照原始 SQL 语义进行合并,并将最终结果返回给用户。
注意
执行 SELECT 语句时,建议您在 where 条件带上 shardKey 字段,否则会导致数据需要全表扫描然后网关才对执行结果进行聚合。全表扫描响应较慢,对性能影响很大。

读取数据(有明确 shardkey 值)

1. 业务发送 select 请求中含有 shardkey 时,网关通过对 shardkey 进行 hash。
2. 不同的 hash 值范围对应不同的分片。
3. 数据根据分片算法,将数据从对应的分片中取出。

读取数据(无明确 shardkey 值)

1. 业务发送 select 请求没有 shardkey 时,将请求发往所有分片。
2. 各个分片查询自身内容,发回 Proxy 。
3. Proxy 根据 SQL 规则,对数据进行聚合,再答复给网关。