水平分表

最近更新时间:2018-10-29 11:24:21

概述

水平拆分的方案,实际上是分布式数据库的基础原理,他的每个节点都参与计算和数据存储,而且每个节点都仅计算和存储一部分数据。因此,无论业务的规模如何增长,我们仅需要在分布式集群中不断的添加设备,用新设备去应对增长的计算和存储需要即可。

水平切分

水平切分(分表)是按照某种规则,将一个表的数据分散到多个物理独立的数据库服务器中,形成“独立”的数据库“分片”。多个分片共同组成一个逻辑完整的数据库实例。

  • 常规的单机数据库中,一张完整的表仅在一个物理存储设备上读写。

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

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

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

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

数据聚合

数据聚合:如果一个查询 SQL 语句的数据涉及到多个分表,此时 SQL 会被路由到多个分表执行,TDSQL 会将各个分表返回的数据按照原始 SQL 语义进行合并,并将最终结果返回给用户。

注意:
在执行 SELECT 语句时,建议您带上 shardkey 字段,否则会导致数据需要全表扫描然后网关才对执行结果进行聚合。全表扫描响应较慢,对性能影响很大。

读取数据时(有明确 shardkey 值):

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

读取数据时(无明确 shardkey 值):

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