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. [每日一题JS] 正则表达式

    判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /\b[a-zA-Z]{1}[a-zA-Z0-9_]{4,19}\b/; var fl ...

  2. b/s客户端和服务器的交互(转)

    原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者,你一定会对网络应用如何工作有 ...

  3. ANDROID (eclipse)开发常见问题及解决办法汇总

    1.ANDROID 在eclipse中没有出现AVD的解决方法(转)如果android安装正确的话,但是eclipse里面的导航条就是没有AVD 可以通过「Window」⇒「Customize Per ...

  4. C++指针的操作和运算(转)

    既然指针是一种数据类型,那么它也应该有对应的操作或运算,正如整数能做加减乘除一样.但是每一种操作或运算都应该对这种数据类型有意义.比如两个实数可以用关系运算得知哪个大哪个小,而两个虚数却不能使用关系运 ...

  5. 关于js对象引用的小例子

    看完下面的代码,相信对js对象引用又有了新的认识,直接上代码: // split()把字符串分割成字符串数组 // reverse() 会改变数组本身,**并返回原数组的引用**.!!!! var a ...

  6. RequireJS入门(二)

    上一篇是把整个jQuery库作为一个模块.这篇来写一个自己的模块:选择器. 为演示方便这里仅实现常用的三种选择器id,className,attribute.RequireJS使用define来定义模 ...

  7. iOS 消息推送原理

    一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Prov ...

  8. TI C66x DSP 系统events及其应用 - 5.1(QM accumulator的配置)

    以下解说在详细应用中,event与中断ISR的设置.以对QM的queue监控产生中断(不是EXCEP)为例,主要包含配置QM accumulator(用于监控QM queue)与配置ISR(ISR与e ...

  9. [转]iOS开发使用半透明模糊效果方法整理

    转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包 ...

  10. Web Api 跨域解决方案

    一.跨域问题的由来 同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容. 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻 ...