简单地说,我们现在是Redis

了解更多

您的云无法做到:0.5M ops + ACID @<1ms Latency!



回到博客

对于熟悉Redis的人来说,创建一个保证酸的-ish(原子性、一致性、隔离性、持久性)操作:只需创建一个具有“主”角色的Redis实例,并将其配置为对持久存储设备的每次写入(“appendfsync always”)的AOF。此配置通过以下方式提供ACID特性:

  • 原子性-不可分割和不可简化的特性是通过Redis事务命令实现的。监视/多重/执行)或Lua脚本. “全部或无”属性几乎总是可以实现的,不包括OOM(内存不足)或错误的Lua脚本等情况
  • 一致性–Redis验证任何“写入”操作是否以允许的方式影响目标数据结构,任何编程错误都不会导致违反任何定义的规则
  • 隔离在命令层,隔离是由于Redis是单线程的事实;对于多个操作,可以使用以下方法实现隔离交易(即。监视/多重/执行)或在Lua脚本中。
  • 耐久性-使用AOF(仅追加文件)每次写,Redis在'写'操作成功写入磁盘后回复客户端,保证耐久性。此外,您应该将持久存储连接到网络,以便通过将新节点连接到故障节点使用的相同持久存储,轻松恢复数据。

也就是说,大多数Redis用户不喜欢在这种配置下运行Redis,因为它会极大地影响性能。例如,如果持久化存储当前很忙,Redis会等待请求的执行,直到存储再次可用。

考虑到这一点,我们想确定Redis Enterprise (Redis万博体育彩e)集群可以处理ACID事务。我们对Redis做了一些内置的增强e在ACID配置中实现更好性能的架构,包括:

  1. 使用Red万博体育彩is Enterprise,可以很容易地创建一个主集群,并让所有的shard运行在同一个节点上。由于Redis是单线程的,在同一个节点上运行多个分片将帮助我们获得更高的吞吐量,因为节点上的所有核都得到了利用。此外,这还将帮助我们确定从单个节点可以获得多少吞吐量,然后在需要更多吞吐量时相应地扩展集群。
  2. 由于AOF的大小随着每次“写入”操作而增长,因此需要一个AOF重写过程来控制文件的大小并减少从磁盘恢复的时间。默认情况下(也是可配置的),OSS Redis会在AOF的大小是前一次重写操作的两倍时触发重写操作。因此,在“写”密集型场景中,重写操作可能会阻止Redis的主循环(以及在同一节点上运行的其他Redis实例)执行正在进行的磁盘请求。Redis Enterprise使用贪婪的AOF重写算法,该算法试图尽可能推迟AOF重写操作,而不会违反恢复时间SLA(一个可配置参数),也不会达到磁盘空间限制。这种方法的优点是Redis Enterprise的吞吐量更高,尤其是在ACID配置中,因为重写过程得到了最佳利用。万博体育彩
  3. Redi万博体育彩s Enterprise存储层允许多个Redis实例以非阻塞的方式写入同一个持久存储,即一个忙碌的分片不断写入磁盘(例如,当AOF重写正在执行时)不会阻塞其他分片执行持久操作。

AWS的ACID基准

我们在AWS VPC内部部署了如下基准配置:

  • 1x c4.8xlarge实例运行memtier_benchmark1.2.6版作为负载生成工具
  • 1x x1.16xlarge实例仅用于运行主分片雷迪斯e群集版本4.4.2-30
  • 4个io1 EBS卷,共5TB和75K IOPS/sec

运行基准测试

尽管测试了多种类型的负载,包括不同的读/写比率;不同的对象大小(从100B到6KB);多个连接数;有无流水线;对于持久的“写入”操作,我们无法获得少于1毫秒的延迟,其中延迟是从请求的第一个字节到达集群时开始测量的,直到“写入”响应的第一个字节被发送回客户端为止。最后,我们在一个连接上测试了一个请求,但仍然无法获得小于2-3毫秒的延迟。我们进行了更深入的分析,发现在ACID配置下,AWS云上的任何实例与EBS存储之间的延迟都不可能少于两毫秒。

由于我们的大多数客户希望延迟小于1毫秒,所以我们决定寻找替代方案。

在Dell EMC VMAX上进行ACID基准测试

VMAX背景

简而言之,VMAX是一个基于简单、智能、模块化存储策略的存储阵列家族。它集成了一个动态虚拟矩阵接口,连接和共享所有VMAX引擎的资源,允许存储阵列从入门级配置无缝增长到世界上最大的存储阵列。
就性能而言,VMAX可以从一个引擎扩展到八个引擎(V-Bricks)。每个引擎都由双控制器组成,每个控制器都具有2插槽Intel CPU、前端和后端连接、硬件压缩模块、Infiniband内部结构以及大型镜像和持久缓存。所有写入操作都会在向VMAX缓存注册后立即向主机确认,直到稍后(可能是在多次更新之后)才会写入闪存。读取还受益于VMAX大型缓存。当请求读取尚未在缓存中的数据时,FlashBoost技术将I/O直接从后端(闪存)传送到前端(主机),然后在缓存中暂存以备将来可能的访问。

基准配置

我们建立了以下基准环境:

以下是一些更详细的信息:

基准参数

  • 项目大小- 100B和6000B,涵盖了大多数Redis用例
  • 我们测试了不同的读/写比率
    • 标准–1:1
    • “写”密集- 1:9
    • 精读——9:1
  • 在每个配置中,我们测量在保持毫秒级服务器延迟的情况下每秒可以实现多少ACID操作。服务器延迟包括整个Redis进程和提交到磁盘,但不包括客户端-服务器网络开销。
基准测试结果


正如所料,“阅读”密集型测试提供了最好的结果;这就是说,我们非常惊讶地看到,在标准的1:1读/写用例中,100B项大小超过660K操作/秒,而在写密集型场景中,整个操作数(即640K操作/秒)仅略低。6000B的结果也给我们留下了深刻的印象,即使在写密集型场景下,例如在单个群集节点上的80K ops/sec延迟为亚毫秒。
我们很惊讶(也很高兴)地发现,对于像Dell-EMC VMAX这样的高端持久存储设备,只有一个Redise群集节点可以支持650K以上的ACID操作/秒,同时保持亚毫秒的数据库延迟。
另一方面,我们失望地看到,我们无法在最先进的云存储基础设施(即AWS io1 EBS)上以亚毫秒的延迟运行单个持久操作。有了大量的先进技术和公共云服务,我们还有很多路要走。

完整的Redis与Dell-EMC VMAX性能评估测试和最佳实践可以在我们的网站上找到在这里

附录

memtier_benchmark参数
每个测试都使用下列memtier_benchmark参数运行

  • 客户端数量- 70
  • 线程数- 1
  • 管道尺寸- 20
  • 测试运行时间–900秒
Baidu