Redis官方文档09-Redis挂了怎么办、


集群基本概念

hash和一致性哈希,思路和mysql的分库分表是一致的。

分区不同实现方式

  • 客户端分区:客户端直接选择正确节点读写指定键。很多Redis客户实现了这种分区方式。
  • 代理辅助分区:是指我们的客户端通过Redis协议把请求发送给代理,而不是直接发送给真正的Redis实例服务器。这个代理会确保我们的请求根据配置分区策略发送到正确的Redis实例上,并返回给客户端。Redis和Memcached的代理都是用Twemproxy (译者注:这是twitter开源的一个代理框架)来实现代理服务分区的。
  • 查询路由:是指你可以把一个请求发送给一个随机的实例,这时实例会把该查询转发给正确的节点。通过客户端重定向(客户端的请求不用直接从一个实例转发到另一个实例,而是被重定向到正确的节点),Redis集群实现了一种混合查询路由。

Redis分区缺点:

  • 不支持多个键的操作。比如你不能操作映射在两个Redis实例上的两个集合的交叉集。(其实可以做到这一点,但是需要间接的解决).
  • Redis不支持多个键的事务。
  • Redis是以键来分区,因此不能使用单个大键对数据集进行分片,例如一个非常大的有序集。
  • 如果使用分区,数据的处理会变得复杂,比如你必须处理多个RDB和AOF文件,在多个实例和主机之间持久化你的数据。
  • 添加和删除节点也会变得复杂。例如通过在运行时添加和删除节点,Redis集群通常支持透明地再均衡数据,但是其他系统像客户端分区或者代理分区的特性就不支持该特性。不过Pre-sharding(预分片)可以在这方面提供帮助。

作为数据存储还是作为缓存使用?

主要的概念如下:

  • 如果Redis只作为可伸缩缓存服务器来使用,那么用一致性哈希是非常容易的。
  • 若果Redis被作为数据持久化服务器,需要提供节点和键值的固定映射,还有节点数目必须是固定的,不能改变。否则当增加或删除节点时,我们需要一个系统来为键重新分配节点,从2015年4月1日开始,Redis集群提供该特性。

你可以使用Redis 的主从复制来减少服务的停止时间:

  • 在新服务器上开启新的redis空实例。
  • 将节点的数据配置移动到新的从服务器上
  • 停止你的redis客户端。
  • 在新的服务器上更新IP地址到移动过来的节点配置文件中。
  • 发送SLAVEOF NO ONE 命令到新服务器的从节点。
  • 使用新的配置重启客户端。
  • 最后关闭老服务器上不再使用的节点。

分区实践

到目前为止,我们讲了分区的原理。但是该如何实战?你应该使用什么样的系统?

Redis集群

推荐使用Redis集群获得自动分片和高可用性。Redis集群是2015年4月1日版本发布的可用和生成就绪特性。可以从集群教程中获取更多信息。

一旦Redis集群是可用的,并且一个Redis集群兼容客户端支持您的编程语言,Redis集群就是Redis分区事实上标准。

Redis集群混合使用了查询路由客户端分区

Twemproxy 框架

Twemproxy是一个由Twitter开发的适合Memached ASCII和Redis协议的代理。它是单线程工作,使用C语言实现的,速度非常快。并且是基于Apache 2.0 协议的开源软件。

Twemproxy支持自动在多个redis节点分区,如果某个节点不可用,将会被自动屏蔽(这将改变键值和节点映射表,所以如果你把Redis当作缓存服务器使用,你应该使用这个功能)。

你可以启用多个代理,让你的客户端得到可用的连接,这样不会发生单点故障。

Twemproxy基本上是Redis和客户端的一个中间层,通过简化使用让我们使用可靠的分区。

你可以在antirez的博客获取有关Twemproxy的更多知识。