Redis高可用缓存

来源:互联网 发布:数据库能做什么 编辑:程序博客网 时间:2024/05/22 06:30

缓存集群设计

缓存集群系统要求

  1. 自动的故障转移
  2. 支持读写分离
  3. 支持动态扩容
  4. 客户端支持
  5. 缓存性能监控

Redis 高可用方案

  1. keepalived 通过keepalived的虚拟IP,提供主从的统一访问,在主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟IP不变),坏处是引入keepalived增加部署复杂性。(KeepAlived+VIP ).
    keepalived在有些情况下会导致数据丢失,keepalived通过shell脚本进行主从切换,配置复杂,而且keepalived成为新的单点,后来选用了方案3,使用Redis官方解决方案;(方案2需要编写大量的监控代码,没有方案3简便,网上有人使用方案2读者可自行查看)
  2. zookeeper 通过zookeeper来监控主从实例,维护最新有效的IP,应用通过zookeeper取得IP,对Redis进行访问
  3. sentinel 通过Sentinel监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP&PORT)是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在Jedis2.2.2中新增了对Sentinel的支持,应用通过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址(目前sentinel方案还没有shared的正式客户端,不支持数据分片)。
  4. Redis Cluster(官方) 虽然正式版发布已经有一年多的时间,但还缺乏最佳实践;对协议进行了较大修改,导致主流客户端也并非都已支持,部分支持的客户端也没有经过大规模生产环境的验证;无中心化设计使整个系统高度耦合,导致很难对业务进行无痛的升级。
  5. Twemproxy Twemproxy本身是一个静态的分布式Redis方案,进行扩容/缩容时候对运维要求非常高,而且很难做到平滑的扩缩容。
  6. Redis Cluster
    cluster的数据存储模块和分布式的逻辑模块是耦合在一起的,这个带来的好处是部署异常简单,all-in-the-box,没有像Codis那么多概念,组件和依赖。但是带来的缺点是,你很难对业务进行无痛的升级。比如哪天Redis cluster的分布式逻辑出现了比较严重的bug,你该如何升级?除了滚动重启整个集群,没什么好办法。这个比较伤运维。
    对协议进行了较大的修改,对客户端不太友好,目前很多客户端已经成为事实标准,而且很多程序已经写好了,让业务方去更换Redisclient,是不太现实的,而且目前很难说有哪个Rediscluster客户端经过了大规模生产环境的验证,从HunanTV开源的Rediscluster proxy上可以看得出这个影响还是蛮大的,否则就会支持使用cluster的client了。
  7. Codis
    和Redis cluster不同的是,Codis采用一层无状态的proxy层,将分布式逻辑写在proxy上,底层的存储引擎还是Redis本身(尽管基于Redis2.8.13上做了一些小patch),数据的分布状态存储于zookeeper(etcd)中,底层的数据存储变成了可插拔的部件。
  8. XXX

关于读写分离的问题

当业务场景不能容忍数据不一致,由于Redis本身的replication模型是主从异步复制,在master上写成功后,在slave上是否能读到这个数据是没有保证的,而让业务方处理一致性的问题还是蛮麻烦的。而且Redis单点的性能还是蛮高的,不像mysql之类的真正的数据库,没有必要为了提升一点点读QPS而让业务方困惑。

Sentinel

当使用多个Sentinel时,如果第一个Sentinel挂了,集群就不可用,只要第一个Sentinel没有挂,其他的Sentinel挂了,集群还是可用的。
当一个主备节点都挂了以后,集群就不可用了。SentinelPool并不能把这个不可用的节点从连接池中清除。

Sentinel的问题:当集群数量很大的时候,一个主下面有很多的从服务器,如果主服务器挂了,那么Sentinel会选举一个从服务器使之成为主服务器,这是,其他从服务器会重连这个新的主服务器,就会发生数据的全量同步。当数据量很多和从服务器很多的情况下,可能会将主服务器拖死,当然,Sentinel也可以配置同步从服务器的节点数量。总之,这个问题是需要考虑的。

缓存服务层

设计细节

“淘汰缓存”还是“更新缓存”

缓存和数据库的操作时序

链接

缓存架构设计细节二三事
唯品会多线程redis设计与实现|Redis中国用户组
唯品会大规模 Redis Cluster 的生产实践
同程旅游Redis缓存系统设计
基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
如何实现高可用的redis集群

0 0