【原】Redis分区

时间:2024-12-12 20:07:49

Redis高级篇

  • 分区


为什么分区?

Redis中的分区主要有两个目的:

  • 允许用多台机器的内存存放更大的数据集。如果没有分区,那么你只能存放单台机器内存的最大值的数据集。
  • 允许用多核和多台机器提高计算能力和网络带宽。

分区简单了解

分区方法

假设有4个Redis实例(服务器)R0,R1,R2,R3,代表user的许多keys如user:1,user:2..等,那么就有多种方法实现将给定的key映射到对应的Redis服务器上。

最简单的方式之一是用range partitioning,即将一个范围内的object映射到具体的Redis实例中。例如,将ID从0到1000放到实例R0上,从1001到2000放到R1上。实践中也在用这种方法,然而,它的缺点是映射表,因为Redis中的每个object都需要该表,所以效率低下。

另一种分区方式是hash partitioning。这种方式不要求key的形式必须是object_name:

分区缺点

  • 多个keys的操作例如交集不支持。
  • 多个keys的事务不能用。
  • 分区粒度
  • 增加了数据处理的复杂度,比如数据的添加与删除等操作。

存储数据 or 缓存数据

如果Redis用来缓存数据,那么用一致性hash是比较容易实现扩展的。

如果Redis用来存储数据,那么key常对应固定的Redis实例,所以节点必须是固定的并且不能改变。

使用Redis实现多重复制应注意如下问题:

  • 在新server中启动Redis服务
  • 移动数据并配置新的实例作为集群的slaves节点
  • 停止clients
  • 更新移动的实例和新Server的Ip地址
  • 在新的slave节点上执行SLAVEOF NO ONE命令
  • 重启Clients
  • 最后关闭不再使用的实例

Redis分区的实现

Redis Cluster

Redis Cluster提供自动分片和高可用性的首选方案。

详情了解Cluster tutorial

Twemproxy

Twemproxy是twitter为Memcached和Redis开发的代理。它是单线程的,用c语言编写,运行较快。它支持在多个Redis实例中自动分区,和可选的节点选举方案。

Twemproxy基本上是一个处于client和Redis实例中的之间层,负责分区的处理。

详情了解in this antirez blog post

Clients supporting consistent hashing

另外一种Twemporxy的实现方式是用一个client实现client端的分区通过一致性hash或类似算法。比较著名的有 Redis-rb  and Predis.