Redis 从入门到入土⑥:分片
分片位置:
- 客户端分片:客户端使用一致性哈希等算法决定键应当分布到哪个节点
- 代理分片:将客户端请求发送到代理上,由代理转发请求到正确的节点上
- 服务器分片:Redis Cluster
1. 顺序分片
概述: 将数据划分为多个连续的部分,按数据的 ID 或者时间分布到不同节点上。例如 User 表的 ID 范围为 1 ~ 7000,使用顺序分片可以将其划分成多个子表,对应的主键范围为 1 ~ 1000,1001 ~ 2000,…,6001 ~ 7000
优点:
- 能保持数据 原有的顺序
- 并且能够 准确控制每台服务器存储的数据量,从而使得存储空间的利用率最大
2. 哈希分片
概述: 哈希分片就是将数据计算哈希值之后,按照哈希值分配到不同的节点上。例如有 N 个节点,数据的主键为 key,则将该数据分配的节点序号为:hash (key)% N
问题: 传统的哈希分片算法存在一个问题:当节点数量变化时,也就是 N 值变化,那么几乎所有的数据都需要重新分布,将导致大量的数据迁移
3. 一致性哈希
概述: Distributed Hash Table(DHT)是一种哈希分片方式,其目的是为了克服传统哈希分布在服务器节点数量变化时大量数据迁移的问题
基本原理:
将哈希空间 [0, 2n-1] 看成一个哈希环,每个服务器节点都配置到哈希环上。每个数据对象通过哈希取模得到哈希值之后,存放到哈希环中顺时针方向第一个大于等于该哈希值的节点上
一致性哈希在增加或者删除节点时只会影响到哈希环中相邻的节点
例如下图中新增节点 X,只需要将它前一个节点 C 上的数据重新进行分布即可,对于节点 A、B、D 都没有影响
4. 虚拟节点(Redis Cluster)
问题: 上面描述的一致性哈希存在数据分布不均匀的问题,节点存储的数据量有可能会存在很大的不同
原因: 数据不均匀主要是因为 节点在哈希环上分布的不均匀,这种情况在节点数量很少的情况下尤其明显
解决方式: 通过增加虚拟节点,然后将虚拟节点映射到真实节点上。虚拟节点的数量比真实节点来得多,那么虚拟节点在哈希环上分布的均匀性就会比原来的真实节点好,从而使得数据分布也更加均匀