`
chong_zh
  • 浏览: 71951 次
  • 来自: 杭州
社区版块
存档分类
最新评论

基于Client端一致性哈希的Redis Cache 集群方案设计

 
阅读更多
设计目标是高可用,易伸缩的RedisCache集群方案,Cache的应用可以允许Key丢失,但应当越少越好:
  • 故障转移:某个Redis实例故障应当可以把负责的key转移到其他实例。故障实例保存的数据可能丢失(符合Cache应用场景需求)
  • 动态水平伸缩:应当可以在运行时动态增加Redis实例,以达到容量水平扩容。水平扩容可能造成部分Cache Key丢失(符合Cache应用场景需求)
  • 配置简单,操作简便


1. 总体架构

  • 每一个Redis实例都在Zookeeper当中注册一个SEQUENTIAL节点,每个Redis实例获得一个唯一ID方便一致性哈希算法的实现
  • Client通过读取Zookeeper记录获取全集Redis实例信息,并按照一致性哈希完成Key->Redis的映射

Zookeeper中,Redis实例对应的SEQUENTIAL节点中保存如下字段:
IP端口状态

其中状态字段有两种取值
  • Available:该Redis实例可以正常访问
  • Not working:该Redis实例在最近的状态检查中无法访问(可能随后恢复)


2. 启动Cache Manager
流程如下:
  • 启动Cache Manager程序
  • Cache Manager在Zookeeper上检查是否存在/cache_cluster节点,若没有则创建
  • 启动Monitor线程(轮询维护Redis实例状态),详细功能见5.
  • 监听80端口并提供Web管理界面


3. 新增Redis实例
  • 1.启动Redis实例
  • 2.访问Cache Manager,提供新增Redis实例IP、端口
  • 3.Cache Manager在Zookeeper中为Redis实例在/cache_cluster下创建子节点:(IP,Port, Available)


4. 删除Redis实例
  • 1.访问Cache Manager,指出要删除的Redis实例:对应/cache_cluster下的子节点名称
  • 2.Cache Manager在Zookeeper中删除/cache_cluster下的对应子节点


5. 启动Client
在业务端首次通过Cache客户端访问Cache集群时触发,流程如下:
  • 读取Zookeeper /cache_cluster 节点中,所有Redis实例的信息
  • 把Redis实例信息保存在Client内存中
  • Watch Zookeeper的/cache_cluster 节点,接受来自Zookeeper关于/cache_cluster子节点变化的通知
  • 启动Monitor线程(轮询维护Redis实例状态)


6. Monitor线程
Cache Manager和Client启动之后对会创建Monitor线程,负责轮询Redis实例,并向更新Zookeeper更新,具体流程如下:
  • 1.读取Zookeeper中所有Redis实例的信息,对于所有Redis实例,无论其是什么状态,完成步骤2~5
  • 2.向每一个Redis实例发送PING包
  • 3.若Redis实例返回正常Pong包,且当前Zookeeper中该Redis的状态信息为Not working,则将其更新为Available
  • 4.若Redis实例超时无响应,则重试
  • 5.若超过重试最大次数无响应,且当前Zookeeper中该Redis的状态信息为Available,则修改Zookeeper中相关节点的状态为Not working

每次Monitor/Cache Manager更新Redis实例信息,Client都会收到Zookeeper相应通知,收到通知后Client应当更新其缓存的Redis实例信息。

7. 访问Cache集群
  • 从Client本地内存中查询所有Avalilable状态的Redis实例信息
  • 根据一致性哈希计算要访问的Key->Redis的映射
  • 访问Redis实例
  • 若成功返回结果,否则返回NULL

访问失败返回NULL的情况分为以下几种情况,此时,应当从DB中读取数据重新存入Cache
  • Redis实例正常访问,但是Redis实例上没有对应的键值
  • Redis实例故障,但是Monitor线程没有发现故障,还没有更新Zookeeper全局配置信息
  • Redis实例故障,并且Monitor已经发现并更新Zookeeper全局配置信息,但是Zookeeper还没有通知Client
  • Redis实例故障,Monitor已经发现并更新Zookeeper全局配置信息,并且Zookeeper已经通知Client,但是Client还没有更新本地缓存

分享到:
评论
2 楼 chong_zh 2015-05-28  
xudonu 写道
架构中的cache manage与web界面需要自己实现?

对的
1 楼 xudonu 2015-05-07  
架构中的cache manage与web界面需要自己实现?

相关推荐

    用Go编写的基于代理的高性能Redis集群解决方案Codis.rar

    描述"用Go编写的基于代理的高性能Redis集群解决方案Codis"进一步强调, Codis的核心特性是其高性能和基于代理的设计。Go语言以其并发模型和内存管理的优势,使得Codis能够处理大量的网络连接和数据传输,为Redis集群...

    redis3.0.0集群搭建

    在集群模式下,Redis的数据分布采用一致性哈希算法,将键空间划分为16384个槽,每个节点负责一部分槽。当新节点加入或节点故障时,槽会自动迁移以保持平衡。 对于客户端接口,Redis提供了多种语言的客户端库,如...

    新redis5.0.5集群搭建 by crj.docx

    Redis 是一个开源、基于内存的数据存储系统,提供了多种数据结构,如字符串、哈希表、列表、集合、有序集合等。Redis 的高性能和低延迟使其广泛应用于缓存、消息队列、数据存储等领域。下面,我们将详细介绍如何...

    Redis+nginx集群部署

    通过以上步骤,我们可以构建一个基于Tomcat、Nginx和Redis的高性能、负载均衡的Web集群,确保用户在不同服务器间的会话一致性,同时提高了系统的稳定性和可扩展性。在实际操作中,还需要根据具体业务需求和资源情况...

    rediscluster集群demo

    Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,提供高可用性和可扩展性。本示例“rediscluster集群demo”旨在展示如何设置和操作一个简单的Redis Cluster实例,确保在本地环境...

    redis7.0.0集群相关安装包

    在集群环境中,Redis 集群可以提供高可用性和水平扩展性,确保服务在单个节点故障时仍能正常运行,并通过分片技术来分散负载。在这个“redis7.0.0集群相关安装包”中,包含了构建和管理Redis 7.0.0集群所需的基本...

    redis集群以及Spring-data-redis操作集群

    Redis集群是为了解决单一实例在高并发、大数据量场景下的性能瓶颈问题而设计的。Redis集群通过数据分片(Sharding)策略将数据分散存储在多个节点上,实现负载均衡,增强系统的扩展性和可用性。在Redis 3.0及以上...

    Redis集群测试

    Redis集群是一种分布式数据库解决方案,它允许用户将数据分散存储在多台服务器上,以提高系统的可扩展性和可用性。在“Redis集群测试”中,我们通常会关注以下几个关键知识点: 1. **集群架构**:Redis集群采用无...

    docker 实现redis集群搭建

    "docker 实现redis集群搭建" ...使用 Docker 实现 Redis 集群搭建可以提供高可用性、高扩展性和高性能的 Redis 集群解决方案。使用 Docker 容器化技术,可以轻松地搭建和管理 Redis 集群,提高开发效率和系统稳定性。

    spring + redis集群

    本文将深入探讨如何使用Spring Data Redis构建一个Redis集群,以及如何通过Spring框架来操作Redis集群,存储对象集合,并提供一个基于Maven的可运行项目示例。 首先,Spring Data Redis是Spring框架的一个模块,它...

    redis集群一键自动部署脚本.rar

    - **分布式哈希(Distributed Hashing)**:通过一致性哈希算法,确保键到槽的映射稳定,从而保证数据在节点间的迁移时,相关键能一起移动。 - **故障转移(Failover)**:当主节点发生故障时,从节点自动接管,...

    Redis3.2.1 集群(包含主从,哨兵机制)

    在3.2.1版本中,Redis引入了集群(Cluster)功能,旨在提供数据分布式存储和高可用性解决方案。集群允许我们将数据分散到多个节点上,以实现负载均衡和故障转移,同时保持数据的一致性。下面将详细讲解Redis 3.2.1...

    redis集群槽点.zip

    5. 数据一致性:Redis集群采用的是最终一致性模型,了解其在不同网络环境下的数据同步策略。 6. 避免常见问题:如网络分区(partition)、客户端连接到错误节点等问题的处理。 总的来说,Redis集群和槽点是分布式...

    Yii_RedisCache

    5. **主从复制和集群**:Redis 支持主从复制,可以构建高可用的集群,提高服务的可靠性。 **总结** Yii 框架与 Redis 结合使用,可以创建高性能、可扩展的应用程序。通过集成 Redis 缓存组件,开发者可以充分利用 ...

    redis集群批处理一键搭建

    Redis集群是Redis提供的分布式解决方案,它将数据分散存储在多个节点上,通过一致性哈希算法实现数据的分片和负载均衡。每个节点都存储部分数据,同时负责处理一部分客户端请求。当需要扩展存储能力或处理能力时,...

    redis集群连接及工具类DEMO

    【Redis集群连接及工具类DEMO】是一个Spring工程,它提供了与Redis集群交互的实例,同时也包含了一些实用的工具类,使得开发者能够更方便地在Java应用中使用Redis作为数据存储。这个DEMO的主要目标是展示如何配置和...

    分布式存储系统中改进的一致性哈希算法.pdf

    一致性哈希算法是在分布式系统中广泛使用的一种数据定位算法,尤其适用于分布式缓存系统,如Redis。传统的哈希算法在分布式存储系统中有一个缺点,即当系统扩展或缩减节点时,数据的迁移量过大。一致性哈希算法通过...

    redis集群windows启动脚本

    Redis集群是Redis提供的分布式解决方案,它将数据分散存储在多个节点上,通过一致性哈希算法实现数据分片,提供高可用性和容错性。每个节点负责一部分数据,并且可以通过主从复制保持数据同步。 2. **Redis集群...

    redis集群搭建手册.docx

    Redis集群(Redis Cluster)是Redis官方提供的分布式解决方案,通过数据分片和槽分区来实现数据的分散存储,从而提供高可用性和可扩展性。 **Redis是什么** Redis是一个开源的,基于键值对的数据存储系统,它支持...

    redis集群redis.rar

    集群是Redis高可用性的一种解决方案,它通过将数据分散在多个节点之间来实现数据冗余和故障转移。在CentOS上设置Redis集群,通常涉及以下步骤: 1. 安装Redis:通过`yum install redis`命令安装Redis服务。 2. 配置...

Global site tag (gtag.js) - Google Analytics