Redis是一个非常流行的基于内存的,低延迟,高吞吐量的key/value数据存储,被广泛用于数据库缓存,session的管理,热数据高速访问,甚至作为数据库方式提高应用程序可扩展性,吞吐量,和实施处理性能。

Azure的Redis Cache是一个PAAS服务,开箱即用,完全兼容开源的Redis 3.0服务, 并且提供了更多增强的服务提供给企业级应用使用,比如SSL支持,主从服务器,Redis集群,虚拟网络支持,数据持久化备份等等,本文介绍如何使用这些高级特性并构建百万量级的缓存读写访问。

在使用Azure Redis之前,我们需要理解不同版本的Redis服务的差异,根据你的业务选择合适的服务层级,目前Azure Redis有三个不同的版本:

基本版本:这个版本是单个节点,只适用于开发测试,没有SLA,内存大小从250M到53GB。

标准版本:主从复制架构,99.9%的SLA保障,内存大小同样是250M到53GB大小,最大C6级别的缓存可以达到15万每秒的RPS(每秒请求数),可用带宽250MB/s。

高级版本:主从复制架构,支持集群,分区分片,支持数据持久化,最为重要的是支持虚拟网络,也就意味着可以将Redis部署到你的虚拟网络中去就像访问本地服务一样,内存大小单个节点6GB大53GB,最大支持10个节点,因此最大内存值可以达到530GB。

在大部分的生产环境中,Redis都是作为本地缓存提供低延迟高吞吐量的缓存服务,所以在生产环境的部署中,我建议大家使用高级版本将Azure Redis部署到虚拟网络中获得最佳性能和体验,本示例中也是以高级版本作为演示。

基本安装配置

  1. 首先我们需要创建一个虚拟网络,测试的虚拟机和Azure Redis cache都会被部署在这个虚拟机网络,虚拟机对于Redis的访问就和本地访问一样了,在"网络"中创建虚拟网络,输入相关参数,进行创建:

  2. 接下来我们创建一个Redis Cache, Redis的高级版本只能使用资源管理器模式创建,所以我们可以用Powershell或者新Portal来创建,打开新portal,选择Redis缓存:

  3. 输入Redis的名称,资源组(和虚拟网络的资源组一样),位置也和虚拟网络一致:

  4. 为便于性能测试,在Redis大小上,选择P4高级最高级别并确定:

  5. 在群集配置上,选择"已启用"启用集群功能,分片暂时保持不变为1个分片:

  6. 虚拟网络,选择之前创建的虚拟网络,并点击确定,点击确定开始部署:

  7. 为便于测试,创建一台CentOS 7.2虚拟机,用户安装Redis客户端及Benchmark工具,资源组和Redis资源组保持一致,虚拟网络和Redis一致,然后进行创建,如果创建成功,在资源组myredisgroup下看起来如下:

    请注意:将 Azure Redis 缓存部署到 ARM VNet 时,缓存必须位于专用子网中,其中只能包含 Azure Redis 缓存实例,而不能包含其他任何资源。如果尝试将 Azure Redis 缓存部署到包含其他资源的 ARM VNet 子网,部署将会失败;所以如果你需要将虚拟机部署到Redis所在的ARM vnet,需要新建一个子网,比如App;经典模式的vnet无此限制。

  8. 在Azure Redis上,默认只循序SSL访问,但对于放在内网的缓存来说,没有必要,并且支持SSL的客户端比较少;登录新portal,选择Redis,端口,点击"已禁用SSL端口",配置为否,允许非SSL访问,点击保存:

性能测试

我们用标准的redis-benchmark来实际压测一下Azure Redis cache的处理性能,首先我们需要配置一下测试虚拟机,并安装Redis测试相关工具。Redis测试的相关工具,比如redis-benchmark等都在Redis的源码包中。

  1. 下载最新的Redis并解压缩,最新的稳定版本是3.2.5:

    $ wget http://download.redis.io/releases/redis-3.2.5.tar.gz

    $ tar xzf redis-3.2.5.tar.gz

    $ cd redis-3.2.5

  2. 在正式编译之前,需要安装下gcc,make等工具:

    $ sudo yum install gcc make

  3. 编译Redis,目前由于Redis编译文件的问题,需要先编译依赖包deps,然后再进行Redis编译:

    $ cd deps

    $ make hiredis lua jemalloc linenoise jemalloc geohash-int

    $ cd ..

    $ make

    Deps的编译结果和命令如下:

  4. 单个节点,即一个分片性能测试:

    在该测试中,执行100万次SET/GET操作,并发客户数50,每个对象大小1024,用来测试Redis的处理性能,当然Redis测试性能也和测试的客户端有关系,当前测试的客户端是一台DS12(4核心)。

    src/redis-benchmark -h 10.0.0.8 -a bAukX3LpNeJaOdDd6tfhzjifkXm4LS8gmASapxkgU04= -t SET -n 1000000 -d 1024 -P 30 -c 50

    写操作,即SET操作,可以达到SET: 120496.45 requests per second

    src/redis-benchmark -h 10.0.0.8 -a bAukX3LpNeJaOdDd6tfhzjifkXm4LS8gmASapxkgU04= -t GET -n 1000000 -d 1024 -P 30 -c 50

    读操作,即GET操作,可以达到GET: 284414.09 requests per second

  5. 使用集群,增加分片数目,测试客户端不需要做任何修改,首先增加节点数到5个节点:


    在该测试中,执行300万次SET/GET操作,并发客户数500,每个对象大小1024,用来测试Redis的处理性能,当然Redis测试性能也和测试的客户端有关系,当前测试的客户端是一台DS14(16核心)

    使用同样的测试程序进行测试,可以看到Redis Cluster节点增加到5个的时候:

    SET操作:SET: 861573.75 requests per second


    GET操作:GET: 2038043.50 requests per second


    使用同样的测试程序进行测试,可以看到Redis Cluster节点增加到10个的时候

    SET的操作可以达到:929368.06 requests per second


    GET的操作可以达到:3118503.00 requests per second


    做一个简单的汇总可以看到,在将Azure Redis部署在虚拟网络中,并且客户端同一个虚拟网络中进行测试的时候,Redis的处理性能随着节点的增加呈现线程增长,可以达到百万量级的缓存访问,并且目前客户处理每天千万量级的用户请求而处理非常平稳:

Redis节点数目

及内存

SET操作(requests/second)

GET操作(requests/second)

测试客户端

1 node(53GB)

120496

284414

DS12

5 nodes(5X53GB)

861573

2038043

DS14

10 nodes(10X53GB)

929368

3118503

DS14

注意:

1. 测试的性能和你的客户端处理能力以及参数有关,比如即使使用了10个节点,但你的客户端处理能力有限,测试出来的性能会受限于客户端

2. 每次测试的结果并不一定完全一致,和处理能力,网络等会有关系

高可用测试

之前我们讲到,其实每个Redis的标准和高级版本中,有主从复制,那么主从复制对我们的程序有什么影响?我们如何看到主从复制昵?我们用redis-cli工具和redis-benchmark来进行测试看看。

  1. src/redis-cli -h 10.0.0.8 -a bAukX3LpNeJaOdDd6tfhzjifkXm4LS8gmASapxkgU04=

    我们输入cluster nodes命令,可以看到,单节点的Redis有一个master和一个slave机器来保证高可用性,即使一个发生问题,另外一个也会实时接管,客户无感知:

  2. 在服务器端进行增加扩展的时候,继续运行客户端测试,你会看到由于使用了主从机制,客户端并无感知,服务不会中断,可以继续进行测试:

Azure Redis的数据持久化

需要新建一个Redis集群,或者硬件损坏,或者需要回滚数据的时候,都需要用到Redis的备份持久化功能。

标准Redis提供两种数据持久化的方式将Redis内存中的数据持久化到磁盘上,一种是RDB方式,一种是AOF方式. RDB是Redis默认的方式,提供时间点的快照,是一种二进制压缩文件;AOF方式实际上会是记录Redis服务器上所有的操作,当你需要恢复的时候,利用AOF文件重新执行即可。

可以看到RDB更加高效,性能更好,速度更快,但缺点是粒度较大,时间点内可能会有数据损失;AOF方式粒度更小,就如数据库的操作日志一样,由于是文本文件,即使出现问题也比较容易修复,但缺点是效率较低,文本文件较大,比RDB方式较慢。

Azure Redis cache目前只支持RDB方式的持久化,配置相对来讲比较简单:

备份频率最低为15分钟,建议使用高级存储账号进行存储,需要注意的是,Azure上RDB存储的格式是page blob格式。

Azure Redis的导入导出

Azure Redis的导入/导出功能目前还是预览阶段,需要了解的是,目前,Redis在界面上可以接受的导入导入格式只能是RDB格式,还有一个很重要的问题,在Azure上,目前导入,导出的格式只支持RDB格式,并且只能是Page Blob格式。

使用RDB并且使用page blob导入的限制在于:

  1. 如果你是从你的数据中心的Redis集群到处的RDB文件,其大小必须是512字节的整数倍。
  2. 如果不是整数倍,即使你用azcopy按照page blob上传过去,也无法导入,会报错,需要修改文件

解决办法?

目前在实际的案例中,有两种解决办法比较高效:

redis-cli -h 10.0.0.8 –a ACCESSKEY  -p 6379 --pipe < backup.aof

  1. https://github.com/vipshop/redis-migrate-tool

    该工具非常强大,可以从各种源,比如RDB导入到Azure Redis,需要编译安装。

    从以上的测试可以看出,Azure Reids是一个高可用的,低延迟,并且可分区的高性能Reids存储,可以支持百万量级的缓存读写,并且维护配置非常简单。

利用Azure Redis Cache构建百万量级缓存读写的更多相关文章

  1. Azure Redis Cache作为ASP.NET 缓存输出提供程序

    前一篇文章<Azure Redis Cache作为ASP.NET Session状态提供程序 >我们已经知道如何将ASP.NET应用程序Session存储在Redis Cache中,这里我 ...

  2. Azure Redis Cache

    将于 2014 年 9 月 1 日停止Azure Shared Cache服务,因此你需要在该日期前迁移到 Azure Redis Cache.Azure Redis Cache包含以下两个层级的产品 ...

  3. Azure Redis Cache (1) 入门

    <Windows Azure Platform 系列文章目录> Microsoft Azure Redis Cache基于流行的开源Redis Cache. 1.功能 Redis 是一种高 ...

  4. Azure Redis Cache作为ASP.NET Session状态提供程序

    从上一篇博客<使用Azure Redis Cache>我们已经可以创建并使用Redis Cache为我们服务了. 作为Web开发者,我们都知道Session状态默认是保存在内存中的,它的优 ...

  5. Azure Redis Cache (2) 创建和使用Azure Redis Cache

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 注意: 截至今日2015年10月7日,国内由世纪互联运维的Azur ...

  6. Azure Redis Cache (3) 创建和使用P级别的Redis Cache

    <Windows Azure Platform 系列文章目录> 在笔者之前的文档里面已经说明了,Azure Redis Cache分为三个不同的级别: - 基本,Basic,不包含SLA ...

  7. Azure Redis Cache (4) 配置和管理Redis Cache

    <Windows Azure Platform 系列文章目录> 我们在创建完Azure Redis Cache后,经常需要切换Redis Cache的服务级别,这里我简单介绍一下使用Azu ...

  8. 使用Azure Redis Cache

    通过上一篇博客<Redis Cache 简介>我们已经简单了解了Azure Redis Cache,这里就不过多赘述了. 1.创建Redis Cache 创建Redis Cache之前,我 ...

  9. Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源

    一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...

随机推荐

  1. Spark link集合

    Part1. 各种参数的意义及如何配置 Spark官方文档——Spark Configuration(Spark配置) http://www.cnblogs.com/vincent-hv/p/3316 ...

  2. While reading XXX pngcrush caught libpng error: N

    错误一:   While reading /XXX/XXX/XXX/img1.png pngcrush caught libpng error:   Not a PNG filCould not fi ...

  3. 禁用与启用Button点击

    //启用查询按钮 btnFpSelect.setClickable(true); //禁用查询按钮 btnFpSelect.setClickable(false);

  4. Javascript 原型注意事项

    function abc() {} abc.prototype.xx = { name: "keatkeat" } var x = new abc(); x.xx.name = & ...

  5. Codeforces 519E A and B and Lecture Rooms

    http://codeforces.com/contest/519/problem/E 题意: 给出一棵树和m次询问,每次询问给出两个点,求出到这两个点距离相等的点的个数. 思路: lca...然后直 ...

  6. JavsScript的基本特点

    1.简单性Javascript是一种脚本语言,它采用小程序段的方式实现编程它同样也是一种解释性语言.2.动态性Javascript是动态的,它可以直接对用户或者客户输入做出相应,无须经过Web服务程序 ...

  7. Teach Yourself Scheme in Fixnum Days 13 Jump跳转

    Jumps One of the signal features of Scheme is its support for jumps or nonlocal control. Specificall ...

  8. 【Android】通过Java代码替换TabHost中的drawableTop资源

    在博客 http://blog.csdn.net/jueblog/article/details/11837445 中的Tab选项卡中, 点击相应的Tab选项,图标没有发生改变. 这些资源图片也没有尽 ...

  9. linq 跨库查询

    可以用多个DBContext,例如有DBContext1和DBContext2,但是不能将两个DBContext用在同一个查询中,可以分开,先用一个查出结果集1,再在第二个查询中使用结果集1就可以了

  10. 【转】Excel快捷键大全

    原文网址:http://www.bm8.com.cn/keyboard/excel.asp 显示和使用"Office 助手"注意 若要执行以下操作,"Microsoft ...