eecdc 发表于 2014-3-28 09:33:31

redis 在多个实例之间如何拆分数据

redis instance 与key的映射

1.range partition 指定redis实例进行映射

   redis instance:R0 R1 R2 R3

   key set : 0-1000010001-2000020001-30000 30001-40000

   这样就可以这样映射,R00-10000   R1 10001-20000      R2 20001-30000   R3 30001-40000

   但是这种映射关系,必须引入一张映射表,来实现实例跟keys之间映射关系,也就是说,每次数据更新,都必须更新映射表和相应的redis实例

2. hash partition使用一致性hash分片

   这种方式,需要引入一种hash算法,比如crc32,md5,可以根据key名,生成一致性hash,然后根据模运算,生成一个有限的序列,比如0-9,从而实现序列跟redis实例之间的映射关系 ,例如,如果有10个redis实例,那么我们可以使用crc32(key) % 10来获取对应的实例

如何实现分区呢?

1.client side partition 使用多个redis客户端分区

2.proxy assisted partition 代理辅助分区,redis 客户端向redis代理发送请求,而不直接跟redis实例进行通信,然后proxy根据配置文件,来查找对应的redis实例

并且将响应告诉给客户端

3.query route 查询路由,发送对某个redis实例的查询操作,然后由redis实例进行路由,重定向到相应的redis实例

分区缺点:

1.包含映射到不同实例的多个key操作是不支持的

2.不支持涉及到多个key的事务

3.数据处理和数据恢复的复杂性增加,生成恢复文件时,必须合并所有主机和实例上的所有的aof或者rdb文件

4.在客户端分区和代理分区的模式下,不支持扩容,在其它模式下,扩容时透明的





页: [1]
查看完整版本: redis 在多个实例之间如何拆分数据