转自:(译)分片:如何将数据存储在不同的Redis实例中 | 张先森的代码小屋,讲的很好。
1.分片
- 分片很有用,如果没有分片机制,Redis就被局限于单机所支持的内存容量。
- Redis的分片机制允许数据拆分存放在不同的Redis实例上,每个Redis实例只包含所有键的子集。 一般是一主+一从或者两从作为一个完整的redis分片。redis分片实际就是指一个或多个redis实例。
- 可以减轻单台Redis的压力,提升Redis扩展能力和计算能力。能够高可用。
2.方案
- 范围分片:假设有4个Redis实例:
R0
、R1
、R2
、R3
,将一定范围的对象映射到指定的Redis实例上,例如,我们可以让ID范围在0-10000内的用户映射到R0
,ID范围在10001-20000内的用户映射到R1
,以此类推。 - 一致性哈希分片:
- key哈希结果尽可能分配到不同Redis实例。
- 当实例增加或移除,需要保护已映射的内容不会重新被分配到新实例上。
- 对key的哈希应尽量避免重复。
redis集群中使用哈希槽做分片:
3.实现
数据分片方式一般有三种:
- 客户端分片:由客户端直接选择正确的节点进行写操作或读取一个给定的键。很多Redis客户端都实现了客户端分片。
- 代理分片。客户端将请求发送给一个能够支持Redis协议的代理,而不是直接将请求发送给正确的Redis实例。代理在确认后将根据已配置的分区模式将我们的请求发送给正确的Redis实例,之后会将回复回送给客户端。Redis和Memcached代理twemproxy实现了辅助代理分区。
- 请求路由:将请求随机发送给一个实例,这个实例确认后将会把这个请求发送给正确的节点。有个重定向的过程。
4.分片的缺点
- 涉及多个键的操作通常不受支持。例如,你无法对两个存在于不同Redis实例上的集合执行交集操作(实际上这里有两种方法来完成这个操作,但都是间接的)。
- 无法使用涉及多个键的Redis事务。
- 分片的粒度是键,因此无法将类似一个非常大的有序集合这样的大键分片到多个实例上。【一个键还是只能存在一个实例上/分片上】。