AerospikeDB 以低延迟和高吞吐量而闻名,已经用于 许多大型的、要求堪称苛刻的实时平台 。而 Redis 同样以速度著称,并且也经常用作缓存。有鉴于此,Aerospike团队近日联合拥有大数据和云架构师、AWS社区英雄、谷歌云开发专家、微软MVP(SQL Server)等众多头衔的 Lynn Langit 在AWS云的虚拟机上对AerospikeDB和Redis进行了基准测试, 测试结果 已经发布在Aerospike官方博客上。而Lynn也发表了题为《 学到的经验——在AWS云上进行NoSQL基准测试(AerospikeDB与Redis) 》的博文,对测试过程和结果进行了更为详细的描述。
由于AerospikeDB是多线程的,而Redis是单线程的,所以为了公平起见,需要对Redis进行扩展,以便它能够使用每个AWS EC2实例上的多个内核。在这个过程中,Lynn发现了AerospikeDB和Redis在扩展或分片的可管理性方面的差异:
接下来,Lynn针对下列工作负载做了两组基准测试:
第一组基准测试是在单个没有永久存储的AWS R3.8xlarge节点上进行的,测试结果如下:
(图一)
从上图可以看出,在运行(负载三)时,AerospikeDB和Redis性能相近,均接近1 MTPS。
第二组测试是在同样的实例上进行的,但引入了永久性存储。所有数据既会保存在内存中,也会存储在EBS SSD(gp2)存储上。在本组测试中,Lynn为AerospikeDB配置了一个新的命名空间,并使用了配置参数“data-in-memory”。而且,为了避免写入单个文件造成瓶颈,她还为AerospikeDB配置了12个不同的可写入位置。对于Redis,则启用了“appendonly”选项。在这种模式下,一旦AOF文件增长到一定的大小,Redis就会在后台重写AOF文件。这时,Redis的吞吐量就会下降。为了避免这种情况出现,Lynn将auto-aof-rewrite-min-size参数设为一个很大的值。这在一定程度上会夸大Redis的性能。在这个场景中,磁盘写成为瓶颈。因此,Lynn针对AerospikeDB和Redis均减少了客户端线程的数量,保证不出现写错误。测试结果如下:
(图二)
从上图可以看出,在运行(负载二)和(负载三)时,AerospikeDB都比Redis略快。
此外,Lynn还单独测试了AOF重写对吞吐量的影响,测试结果如下:
(图三)
从上图可以看出,AOF重写对Redis读写性能均有较大的影响。
按照Lynn的说法,上述基准测试结果可能会因为云环境本身的不稳定性、调优技术和基础设置的差异而有所不同。感兴趣的读者可以查看 原文 了解Lynn的测试步骤及配置细节。
在上述结果发布后,Redis创建者Salvatore Sanfilippo很快就以《 我们为什么不做基准测试来比较Redis和其它DB 》为题发表博文对此进行了回应。他认为,这种对比有广告嫌疑,并提供了一些从Redis得出更好结果的方法。紧接着,Redis首席开发大使Itamar Haber也发表了题为《漏掉的经验——在AWS云上进行NoSQL基准测试(AerospikeDB与Redis)》的博文,对Aerospike团队和Lynn的测试结果提出质疑,主要包含如下几点:
同时,Itamar指出,对于AOF,一个常见的做法是引入一个从属Redis实例,专门用于持久化处理,以减轻主实例的负担。
最后,他写道:
比较是一件很难做对却很容易做错的事。
感谢郭蕾对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。