Scaling Database 数据库拆分
1. Database Sharding
aka. Partition.
- 按照一定的规则,将数据拆分开存储在不同的实体机器上
- 防止 single point failure
- 分摊 read and write traffic
1.1 Vertical Sharding 纵向拆分
- 例如
User Table里有如下数据- username
- password
- nickname
- avatar
- 我们知道 email, username, password 不会经常变动。而 nickname, avatar 相对来说变动频率较高
- 可以将它们拆分为两个表
User Table,UserProfile TableUserProfile中用一个user_id的 foreign key 指向 User- 分别放在两台机器上
- 如果
UserProfile Table挂了,不会影响 user 正常登录
Vertical Sharding 的缺点是什么? 不能解决什么问题?
- colmuns 无法再拆分
- 数据量非常巨大
1.2 Horizontal Sharding 横向拆分
- 假如使用 不一致 Hashing
%n是一种最简单的 Hash 算法。- 该方法在 n 变成 n + 1 的时候,每个
key % n和% (n + 1)的结果基本上都不一致。 - 缺点1: 数据分布不均匀。
- 缺点2: 迁移压力很大,当进行扩容时,需要将所有数据重新分布,并从老机器中迁移数据。
- Consistent Hashing 一致性哈希
- SQL, NoSQL 都可以使用
- 很多 DataBase 有 Auto-scaling 的功能
- 更多阅读 Consistent Hashing