Redis 分区

Redis 分区技术(又称 Redis Partition)指的是将 Redis 中的数据进行拆分,然后把拆分后的数据分散到多个不同的 Redis 实例(指一台安装了 Redis 服务的计算机)中,每个实例仅存储数据集的某一部分(一个子集),我们把这个过程称之为 Redis 分区操作。

分区(Partition)不仅是 Redis 中的概念,几乎所有数据库管理系统都会涉及到 “分区” 的应用。

分区优势

Redis 分区技术有两个优势。

提升服务器性能

单台机器的 Redis 服务,其网络 IO 能力和计算资源都是非常有限的,但是如果我们将请求分散到多台机器上,那么就能充分利用多台计算机的算力和网络带宽,从而整体上提升 Redis 服务的性能。

提高服务器数据存储能力

随着存储数据的不断增加,单台机器的存储容量会达到极限,若将数据分散存储到多台 Redis 服务器上,其存储能力也将得到大幅度提升。Redis 分区技术可以利用多台计算机的内存总和,从而创建出大型的 Redis 数据库。

分区缺陷

虽然 Redis 分区技术有诸多优势,但是它也存在一些不足之处。下面做简单介绍:

  • 涉及操作多个 key 时,通常不被支持。这是由于批量操作的 key 会被映射到不同的 Redis 实例中,此时无法实现在一个实例中操作分散开的 key;

  • 不支持包含多个 key 的 Redis 事务;

  • 当使用分区的时候,数据的处理变的非常复杂,比如需要处理多个 .rdb 或者 .aof 存储文件,并且还需要从多个 Redis 实例中备份数据;

  • 添加、删除实例变的复杂,比如 Redis 集群支持在运行时增加或减少实例,分区技术不支持这种功能。

分区类型

Redis 有两种类型分区。假设有 4 个 Redis 实例 R0,R1,R2,R3,和类似 user:1,user:2 这样的表示用户的多个key,对既定的 key 有多种不同方式来选择这个 key 存放在哪个 Redis 实例中。也就是说,由不同的系统来映射某个 key 到某个 Redis 服务。

范围分区

最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的 Redis 实例。例如:ID 从 0 到 10000 的用户会保存到实例 R0,ID 从 10001 到 20000 的用户会保存到 R1,以此类推。

这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各种对象的映射表,通常对 Redis 来说并非是好的方法。

哈希分区

另外一种分区方法是 hash 分区。这对任何 key 都适用,也无需是 object_name: 这种形式,像下面描述的一样简单:

用一个 hash 函数将 key 转换为一个数字,比如使用 crc32 hash 函数。对 key foobar 执行 crc32(foobar) 会输出类似 93024922 的整数。

对这个整数取模,将其转化为 0-3 之间的数字,就可以将这个整数映射到 4 个 Redis 实例中的一个了。93024922 % 4 = 2,就是说 key foobar 应该被存到 R2 实例中。

注意:取模操作是取除的余数,通常在多种编程语言中用 % 操作符实现。

分区实现方案

客户端分区

客户端分区就是在客户端就已经决定数据会被存储到哪个 Redis 节点或者从哪个 Redis 节点读取,大多数客户端已经实现了客户端分区。

代理分区

代理分区意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些 Redis 实例,然后根据 Redis 的响应结果返回给客户端。

Redis 和 Memcached 的一种代理实现就是 Twemproxy。

什么是 Twemproxy?

Twemproxy 是一种代理分片机制,由 Twitter 开源,主要用于减少后端缓存服务器的连接数量。Twemproxy 作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个 Redis 或 Memcached 服务器,再原路返回。该方案很好的解决了单个 Redis 或 Memcached 实例承载能力的问题。Twemproxy 本身也是单点,需要用 Keepalived 做高可用方案,可以使用多台服务器来水平扩张 Redis 或 Memcached 服务,可以有效的避免单点故障问题。

查询路由

查询路由(Query routing)的意思是客户端随机地请求任意一个 Redis 实例,然后由 Redis 将请求转发给正确的 Redis 节点。Redis Cluster 实现了一种混合形式的查询路由,但并不是直接将请求从一个 Redis 节点转发到另一个 Redis 节点,而是在客户端的帮助下直接 Redirected(重定向)到正确的 Redis 节点。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号