luxuze.github.io

github pages

View on GitHub

分库分表数据切分

  1. 水平切分

    • 水平切分又称为 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中。
    • 当一个表的数据不断增多时,Sharding 是必然的选择,它可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。
  2. 垂直切分

    • 垂直切分是将一张表按列分成多个表,通常是按照列的关系密集程度进行切分,也可以利用垂直气氛将经常被使用的列喝不经常被使用的列切分到不同的表中。
    • 在数据库的层面使用垂直切分将按数据库中表的密集程度部署到不通的库中,例如将原来电商数据部署库垂直切分称商品数据库、用户数据库等。

Sharding 策略

  1. 哈希取模:hash(key)%N
  2. 范围:可以是 ID 范围也可以是时间范围
  3. 映射表:使用单独的一个数据库来存储映射关系

Sharding 存在的问题

  1. 事务问题
    • 使用分布式事务来解决,比如 XA 接口
  2. 连接
    • 可以将原来的连接分解成多个单表查询,然后在用户程序中进行连接。
  3. 唯一性
    1. 使用全局唯一 ID (GUID)
    2. 为每个分片指定一个 ID 范围
    3. 分布式 ID 生成器(如 Twitter 的 Snowflake 算法)