转自: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

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

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

玩转 Redis缓存 集群高可用的更多相关文章

  1. 浅谈MySQL集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

  2. mysql集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

  3. Rabbitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  4. openstack pike 集群高可用 安装 部署 目录汇总

    # openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...

  5. bitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  6. Eureka 集群高可用配置.

    SERVER:1 server: port: 1111 eureka: instance: hostname: ${spring.cloud.client.ip-address} instance-i ...

  7. Redis缓存集群方案

    由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业务,而Redis 3.0 beta1支持的集群功能还不适合生产环境 ...

  8. 集群高可用之lvs+keepalive

    集群高可用之lvs+keepalive keepalive简介: 负载均衡架构依赖于知名的IPVS内核模块,keepalive由一组检查器根据服务器的健康情况动态维护和管理服务器池.keepalive ...

  9. hadoop+zookeeper集群高可用搭建

                                                                  hadoop+zookeeper集群高可用搭建 Senerity 发布于 2 ...

随机推荐

  1. jQuery 选择器 (一)

    选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元素 .class $( ...

  2. Appium python

    1.运行报错:FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.android.ime without first uninstalling ...

  3. Flask分页

    一.flask实现的分页组件 from urllib.parse import urlencode,quote,unquote class Pagination(object): "&quo ...

  4. tcp链接断开的探测

    有资料说,read.write都可以探测tcp的断开,但都不是实时的. 但是实际在某些设备上测试发现,即使开一个线程每隔一小段时间发一次心跳包(write),write也不能探测连接已经断开,而且这个 ...

  5. 通用后台管理系统UI-AdminLTE:构造动态菜单栏

    AdminLTE是一款基于bootstrap的后台管理系统的通用模板UI,它的样式美观且较为符合大多数后台管理系统的需求,典型的上|左右|下的布局形式.并且提供了一整套我们开发的时候可能用到的UI样式 ...

  6. UML 类图基础

    先留个坑, 后续再填 UML 类图中主要包括以下几种关系: 1. 泛化: 定义:继承关系,指定子类继承父类的所有特征与行为. 图形:三角形箭头,指向父类.         2. 实现 定义:类与接口的 ...

  7. feed 流数据请求时机的两个思路

    最近 SF 首页 进行了大改版,效果如下: 其他地方都没什么难点,中间的 feed 流思考了不少时间,效果需要类似微博或者知乎 feed 流.之前一直没有做过类似的功能,现总结两个方案. 方案一 方案 ...

  8. 五分钟学习React(二):我的第一个Hello World

    我的第一个React应用 接着我们上一期所讲的内容,通过create-react-app脚手架创建的应用,它是基于ES6的语法生成的.我们清空src目录下的文件,并分别创建index.js和index ...

  9. Gym 101673F Keeping On Track

    原题传送门 题意:给定一颗n+1(n≤10000)个结点的树(当然有n条边辣),定义一个结点为critical,当且仅当除去这个点及与其相连的边后,所有不相连的结点对数量最多.现在保证有且仅有一个结点 ...

  10. Java面向对象接口的应用实例练习

    interface USB { public void open(); public void close(); } class Upan implements USB { public void o ...