zoukankan      html  css  js  c++  java
  • 玩转 Redis缓存 集群高可用

    转自:https://segmentfault.com/a/1190000008432854

    Redis作为主流nosql,在高并发使用场景中都会涉及到集群和高可用的问题,有几种持久化?场景下的缓存策略怎么选?高可用方案怎么实现?集群有哪几种?跟着这几个问题,结合一些自己使用的经验来简单分析一下。

    一.有哪些持久化

    Redis有两种持久化的方式:`RDB` 和 `AOF`
    • RDB - 快照

    通过预设频率write on copy来持久化数据(所以内存不宜设置超过物理内存的50%,否则会内存不足引发IO等待,使redis访问速度骤减),占用空间小,恢复速度快,适用于灾难恢复,但是宕机会丢失数据。

    • AOF - 持久化

    默认会将每个收到的写指令通过write函数追加到文本 appendonly.aof 中,通过将新记录追加到文本尾部来持久化数据,占用空间大,恢复速度慢,但是安全性好,可能会丢失一秒的数据。


    二.怎么选择适合的持久化策略

    对于Redis的使用场景会有两种策略:`LRU缓存(临时缓存)` 和 `持久化缓存`。
    
    用于存放持久化的缓存数据,常用于分布式系统中存放的计数器、统计数值等。配置类的缓存可以考虑使用google的guava
    • LRU缓存(临时缓存)

    用于临时缓存数据用,这部分数据可以通过数据库再次加载到缓存中,常用于存放热点数据。

    • 持久化缓存


    三.如何实现高可用

    对于需要到线上运行的项目,单点问题肯定是个躲不开的话题,这个时候该如何解决?

    1.LRU缓存(临时缓存)高可用

    方案:Redis搭建主从,master禁用RDBAOF,slave启用RDB; M/S切换使用哨兵。

    • master宕机:切换到从,丢失的数据重新预热即可。

    • slave宕机:换一个实例同步master即可。

    • master和slave同时宕机:可以用slave的RDB备份还原,丢失部分数据重新预热即可。

    2.持久化缓存高可用

    方案:Redis搭建主从,master禁用RDBAOF,slave启用RDB,master调用一个计划任务定期bgsave维护快照存储并通过scp传输到slave保存,保障master本地化数据完整性的同时也避免了开启持久化策略带来的性能损失; M/S切换使用哨兵。

    • master宕机:slave保存了完整的数据。

    • slive宕机:换一个实例同步master即可。

    • master和slave同时宕机:可以用slave的RDB备份还原。


    四.集群怎么做

    Redis仅支持单实例,内存一般最多10~20GB。对于内存动辄100~200GB的系统,就需要通过集群来支持了。

    Redis集群有三种方式:客户端分片代理分片Redis Cluster

    • 客户端分片

    通过业务代码自己实现路由

    优势:可以自己控制分片算法、性能比代理的好

    劣势:维护成本高、扩容/缩容 等运维操作都需要自己研发

    • 代理分片

    代理程序接收到来自业务程序的数据请求,根据路由规则,将这些请求分发给正确的Redis实例并返回给业务程序。使用类似Twemproxy、Codis等中间件实现。

    优势:运维方便、程序不用关心如何链接Redis实例

    劣势:会带来性能消耗(大概20%)、无法平滑扩容/缩容,需要执行脚本迁移数据,不方便(Codis在Twemproxy基础上优化并实现了预分片来达到Auto Rebalance)。

    • Redis Cluster

    优势:官方集群解决方案、无中心节点,和客户端直连,性能较好

    劣势:方案太重、无法平滑扩容/缩容,需要执行相应的脚本,不方便、太新,没有相应成熟的解决案例

  • 相关阅读:
    [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】
    uboot中添加自己的命令【转】
    android压力测试命令monkey详解【转】
    T-sql语句修改数据库逻辑名、数据库名、物理名(sql2000)
    sql查询与修改数据库逻辑文件名,移动数据库存储路径
    如何修改SQL Server 2000的数据库逻辑与物理名称
    你是否也忘了刷新视图?
    单点登录CAS-Demo
    SQL Case when 的使用方法 (转)
    因为数据库正在使用,所以无法获得对数据库的独占访问权(转)
  • 原文地址:https://www.cnblogs.com/yycc/p/7900997.html
Copyright © 2011-2022 走看看