现在的位置: 首页 > 综合 > 正文

redis2.6分区

2013年05月14日 ⁄ 综合 ⁄ 共 3411字 ⁄ 字号 评论关闭

分区:如何在多个redis实例分割数据

分区即是将你的数据分布在多个redis实例中,每一个实例将只会包括你数据的key的一部分的子集。

【1】将介绍redis分区的基本概念【2】将介绍redis分区可替代的选择

Why partitioning is useful

redis的分区服务有两个主要的目标:

  • 它允许对大的数据库使用多台计算机的存储器中的总和分区你是一台计算机上可以支持的内存量有限。
  • 它是redis充分利用多个内核和多个计算机的计算能力以及多台计算机和网络适配器的网络带宽

Partitioning basics

分区有不同的划分标准试想一下我们有四个Redis的实例R0R1R2R3许多代表用户喜欢的user:1,user:2,
...依此类推,我们可以发现不同方式来选择,在这种情况我们选择一个特定的实例存储一个关键
换句话说不同的系统给定的键映射到一个给定的Redis服务器上。

最简单的方法执行分区范围分区,并且是通过范围内对象映射特定的Redis实例例如我可以说用户ID0ID10000进入实例R0用户形成ID10001到20000编号将进入例如R1等等

系统的工作原理实际上是在实践中使用,但它有一个缺点是采取表映射实例我们需要建立包括各种对象信息的表并管理它。Redis上使用这种方式不是一个好主意

可以采用hash散列的分区形式替代范围分区。此种方式可以使用任何的key形式,而不必使用object_name:<id>,并且如下这样简单的模式:

  • 使用哈希函数将key名称变成一个数字例如我可以使用CRC32哈希函数因此key是foobar经过CRC32输出93024922
  • 使用模式运算将key的哈希值映射在0~3之间,这样就可以将key映射到4个redis实例中的任何一个。所以93024922模4等于2,所以我知道我的key(foobar)存入R2实例取模运算只是除法运算的一部分它通常是使用%运算符在编程语言中。

还有其他的分区方式,但是通过这个两个例子相信你会受到启发。哈希分区的一种高级形式:一致性哈希在部分的redis客户端和代理上实现了。

Different implementations of partitioning

可以通过不同的部分来实现的分区:

  • 客户端分区          客户端直接选择合适的redis实例读取或者写入key,许多客户端实现的就是客户端分区。
  • 代理协助分区     客户端发送数据到实现了redis协议的代理端而不是直接和redis实例做数据交换。代理通过配置好的分区架构将请求分发到对应的Redis实例,并将实例答复发送给客户端。Twemproxy了redis和Memcached代理协助分区。
  • 查询路由              
    你可以将查询发送到一个随机的实例实例将确保转发正确的节点
    Redis集群借助客户端实现了一个混合式的查询路由(请求并不是从一个redis实例直接转发到另一个redis实例,而是客户端被重新定向到正确的实例)。

Disadvantages of partitioning

分区会使redis 的部分功能高效运行:

  • 涉及多个操作通常是不支持的。比如你不能执行两套之间的交集如果它们的key被映射到不同的Redis实例(虽然可以变通的实现,但是比较复杂)。
  • 分区的粒度是关键。一个容量巨大的key是无法像排序集合一样碎片化的(so it is not possible to shard a dataset with a single huge key like a very big sorted set)。
  • 使用分区后,数据管理比较复杂,比如你需要处理多个RDB/AOF文件,需要从多个实例和主机共同备份数据
  • 添加和删除容量可能很复杂。比如Redis的集群计划支持在运行时添加和删除节点的能力并且透明平衡数据的功能客户端和代理其他系统不支持此功能。可以参阅Presharding
    的技巧关于此方面的帮助。

Data store or cache?

分区作为数据存储或缓存使用Redis的概念上是相同但有一个巨大的差异Redis是用来作为数据存储你需要确定一个给定key总是映射到同一个实例Redis是用作缓存如果一个给定节点不可用它不是一个大问题,我们可以使用一个不同的节点改变的关键---实例映射,当我们希望提高系统的可用性(这就是系统响应查询的能力)

一致性哈希往往能够实现切换到其他节点如果给定key首选节点不可同样,如果你添加一个新的节点将开始一部分存储在新节点上

这里的主要概念以下

  • 如果使用Redis是作为缓存扩展使用一致性哈希容易扩展
  • Redis的是用来作为一种存储我们需要采取固定key和节点之间的映射,以及固定数量的节点否则我们需要一个系统,是能够平衡节点之间的key,当我们添加或删除节点目前仅有Redis集群能够做到这一点,但不是为生产Redis集群准备的

Presharding

我们发现分区的问题是,除非我们使用了Redis作为缓存添加和删除节点可能会非常棘手它是非常简单的使用固定key---实例的映射然而,数据的存储需求可能会随时间增长。今天可以住10Redis的节点(实例明天我可能需要50个节点由于redis
的轻量级(一个备用实例使用1 MB的内存),解决问题的一个途径就是使用多个实例在系统初始阶段。即使你开始只有一台服务器,你可以决定第一天就进入一个分布式世界单个服务器运行多个Redis的实例并使用分区

您可以开始阶段就选择相当的实例数例如,3264个实例能够为大多数用户提供足够的增长空间

采用这种方式,随着你的数据量增加,当需要更多redis服务器时,简单的将实例迁移到新增的服务器上即可。

一旦你添加额外的服务器需要从第一台服务器移动一半Redis的实例到新服务器继续添加,则依此类推。

使用Redis的复制你能使你的用户很少或不停机

  • 在新服务器启动一个空的新实例
  • 将这些新实例作为你源数据的slave。
  • 停止客户端
  • 更新被迁移的实例配置中的IP
  • 在新实例服务器使用SLAVEOF NO ONE命令,在复制完成后。
  • 更新配置后重启客户端
  • 关闭在老服务器上的被迁移的实例

Implementations of Redis partitioning

So far we covered Redis partitioning in theory, but what about practice? What system should you use?

Redis Cluster

不幸Redis的集群是目前尚未投入生产但是你可以得到更多的信息阅读说明书或检查Redis的GitHub的repositoriyunstable分支部分实施【没实现还拿出来,鄙视作者一下鄙视一旦Redis的集群可用如果一个Redis的集群投诉客户你的语言Redis的集群将成为事实上的标准Redis的分区Redis的集群查询路由和客户端分区之间的混合

Twemproxy

Twemproxy在Twitter开发Memcached的ASCII和Redis的协议是一个代理它是单线程的它是用C语言编写,并且速度极快。它是开源软件Apache
2.0许可
下发布的条款
Twemproxy其中的Redis实例支持自动分区可选节点移除如果一个节点不可用(这将改变key----实例映射所以应该使用这个功能如果你正在使用的Redis作为缓存

它不会发生一个单点故障,因为你可以启动多个代理服务器,并指示客户连接到第一个接受连接

基本上Twemproxy是一个中间和客户端之间的Redis实例可靠地处理分区以最小的额外复杂性代价

建议这种方式来处理Redis的分区你可以阅读更多关于Twemproxyantirez博客文章

Clients supporting consistent hashing

一种替代Twemproxy使用分区通过一致性哈希或其它相似的算法实现的客户端Redis的客户有多种,支持一致性哈希特别Redis-rbPredis查看Redis的客户的完整列表,以检查是否有用一致性哈希实现的你的语言客户

抱歉!评论已关闭.