对于当今许多应用程序来说,磁盘速度至关重要,这也是一些 AWS 用户选择各种可用的弹性块存储 (EBS) 选项的原因。作为内存数据库,Redis 主要依赖内存,磁盘速度的重要性降低,但 Redis 也是持久化的,它使用磁盘进行复制。那么,当您已经运行 Redis 服务器时,是否值得为 AWS 提供的更快磁盘支付额外费用呢?
我们最初的假设是“否”,主要是因为 Redis 在创建 AOF 文件时使用顺序写入,当您执行复制时,它只是将内存转储到磁盘。这些操作都不会利用 SSD 的快速分配或 PIOPS 的优势。两年前,我们进行了一些测试,证明了我们的假设,最近我们再次对其进行了测试,以查看结果是否发生了变化。
我创建了三个基准测试,用于比较 EBS 磁盘速度与普通磁性磁盘、带 SSD 的 EBS 以及带 SSD PIOPS 的 EBS。基准测试是在三个节点上进行的,每个节点都有自己的 EBS,并且在它们之上安装了我们的 Redis Clouds 服务。我想使用 PIOPS 的最佳配置,所以我选择了 c3.4xlarge 实例类型(更多信息请访问 这里)。我将 Redis 配置为每秒写入其追加日志文件(即 appendfsync everysec),这是 AOF 的默认设置,被认为是常见的用例。最后,我没有使用复制来避免不必要的网络噪音,这个基准测试的重点是磁盘使用情况。
我们客户机实例类型为 c3.2xlarge,我使用我们自己开发的 memtier_benchmark 工具来模拟工作负载。
基准测试运行专门执行写入操作。我使用了 10KB 的对象,并让基准测试使用 50 个并发连接和 25 的管道大小。作为参考,以下是我使用 memtier_benchmark 的命令行参数
–ratio=1:0 –test-time=120 -d 10000 -t 1 -c 50 –pipeline=25
比率仅设置为写入 (SET) 操作,测试时间为 2 分钟。我分别用单个线程和 4 个线程运行了每个测试两次,因为我想检查线程数量对性能的影响(如果有的话)。
令我惊讶的是,这些基准测试表明,在 SSD 和 SSD PIOPS 上运行 Redis 的性能远高于在磁性磁盘上运行 Redis 的性能
逻辑保持不变,磁盘物理特性也没有改变 - 就其本身而言,磁性 EBS 应该提供与 SSD EBS 相似的吞吐量和延迟。但我们发现,使用 SSD EBS 将为您提供更好的硬件和更快的网络,从而将性能提高两倍。请注意,将 memtier_benchmark 客户端线程数量从 1 增加到 4 会导致性能下降,表明我们有效地饱和了 EBS 设备。
如果您的持久性要求严格,那么为更快的磁盘付费是值得的。此外,您可以通过附加多个 EBS 卷来提高存储的吞吐量,但这种方法在本基准测试中未进行测试。提高 Redis 设置每秒事务数 (TPS) 分数的另一种方法是将持久性委托给从属实例,从而释放主实例来执行实际的数据处理。但是,请注意,复制可能会增加网络负载,并可能降低数据库的一致性。
我使用 Linux 的 iostats 来监控基准测试运行期间每个存储配置的写入吞吐量。每个运行结束后,我还触发了手动快照(SAVE 命令)并监控其写入吞吐量。以下结果
分析
尽管 SSD 存储针对随机访问而不是追加写入模式(后者是 Redis 的工作方式)进行了优化,但我们很高兴地发现,对于我们的目的来说,它实际上比磁性磁盘性能更高。此外,AWS 的 SSD PIOPS 的确比常规 SSD 提供更高的吞吐量。AWS 团队为提供这种出色的服务而获得了高度赞赏,我们的建议是:如果您在 EC2 上运行 Redis 并需要数据持久性,那么在 PIOPS SSD EBS 卷上花费的钱将物有所值。