亚马逊AWS官方博客

Amazon ElastiCache for Redis 集群故障转移时间、只读实例扩容和集群分片扩容时间测试报告

1. 测试背景

Amazon ElastiCache for Redis 是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持 Internet 范围内的实时应用程序。Amazon ElastiCache for Redis 基于开源 Redis 构建,可与 Redis API 兼容,能够与 Redis 客户端配合工作,并使用开放的 Redis 数据格式来存储数据。Amazon ElastiCache for Redis 兼具开源 Redis 的速度、简单性和多功能性与 Amazon 的可管理性、安全性和可扩展性,能够在游戏、广告技术、电子商务、医疗保健、金融服务和物联网领域支持要求最严苛的实时应用程序。

客户在使用托管的 Amazon ElastiCache for Redis 时会根据业务的需求选择最合适的实例机型,本次测试主要是测试 Amazon  ElastiCache for Redis 在集群模式多 AZ 部署时不同副本数、不同实例机型、有无工作负载的多种情况下集群故障转移、只读实例扩容和集群分片扩容所需的时间,为部署模式和实例机型选择提供指导。

2. 测试环境

被测服务 Amazon ElastiCache for Redis
测试区域 孟买区域(ap-south-1)
测试版本 4.0.10
测试机型 cache.m5.2xlarge 和 cache.m5.4xlarge
部署模式 采用集群模式多 AZ 部署,一写一读和一写两读两种模式
压测机型 c5.12xlarge*1
压测软件 memtier_benchmark(https://github.com/RedisLabs/memtier_benchmark)

3. 测试前提

本次测试基于以下三个前提:

  • 压测实例与被测试的 Amazon ElastiCache for Redis 均在同一个 VPC
  • 除上述测试环境描述的配置外,其余 Amazon ElastiCache for Redis 均使用默认配置
  • 开启 CloudTrail 用于统计故障转移、只读实例扩容和集群分片扩容的开始、结束时间

4. 测试架构图

5. 测试用例

5.1 集群故障转移测试用例,测试基于以下 4 种配置模式,分别测试无工作负载和有工作负载两种情况下的集群故障转移时间

模式
Amazon ElastiCache for Redis 集群模式 cache.m5.2xlarge 一写一读
Amazon ElastiCache for Redis 集群模式 cache.m5.2xlarge 一写二读
Amazon ElastiCache for Redis 集群模式 cache.m5.4xlarge 一写一读
Amazon ElastiCache for Redis 集群模式 cache.m5.4xlarge 一写二读

工作负载场景:Amazon ElastiCache for Redis 集群 50% 的内存利用率,以及写节点 50% 的 CPU 负载

5.2 集群扩容测试用例测试基于以下 4 种配置模式,分别测试无工作负载只读实例扩容的时间、无工作负载集群分片扩容的时间、有工作负载只读实例扩容的时间和有工作负载集群分片扩容的时间

模式
Amazon ElastiCache for Redis 集群模式 cache.m5.2xlarge 一写一读
Amazon ElastiCache for Redis 集群模式 cache.m5.2xlarge 一写二读
Amazon ElastiCache for Redis 集群模式 cache.m5.4xlarge 一写一读
Amazon ElastiCache for Redis 集群模式 cache.m5.4xlarge 一写二读

Redis 集群有两种扩容模式:

  • 只读实例扩容(通过增加只读实例,提高集群读取能力)
  • 集群分片扩容(通过增加集群分片,提高集群存储容量)

6. 测试方法

6.1 集群故障转移测试方法

  1. 在 Amazon ElastiCache for Redis 控制台“分区和节点”选项卡点击“操作”后点击“主节点故障转移”
  2. 并使用 Amazon ElastiCache 控制台“事件”来得到故障转移时间,故障转移的 Amazon ElastiCache 事件示例如下

“Test Failover API called for node group 0001” 字样代表故障转移开始,记录该事件时间为开始时间

“Failover to replica node redis-cluster-load-m5-2x-1w1r-0001-002 completed” 字样代表故障转移结束,记录该事件时间为结束时间

6.2 只读实例扩容测试方法

  1. 在 Amazon ElastiCache for Redis 控制台“分区和节点”选项卡点击“操作”后点击“添加副本”,并在打开新对话框中填写“每个分区的新副本数量”
  2. 结合 CloudTrail 和 Amazon ElastiCache 控制台“事件”来得到扩容时间。开始时间使用 CloudTrail 事件名称为 IncreaseReplicaCount 的事件时间
  3. 结束时间使用 Amazon ElastiCache 控制台“事件”的发生时间,只读实例扩容的 Amazon ElastiCache 事件示例如下

“Added cache node 0001 in availability zone ap-south-1a” 字样代表只读实例扩容结束,记录该事件时间为结束时间

6.3 集群分片扩容测试方法

  1. 在 Amazon ElastiCache for Redis 控制台“分区和节点”选项卡点击“添加分区” 并在打开新对话框中填写“要添加的分区数量”
  2. 结合 CloudTrail 和 Amazon ElastiCache 控制台“事件”来得到扩容时间。开始时间使用 CloudTrail 事件名称为 ModifyReplicationGroupShardConfiguration 的事件时间
  3. 结束时间使用 Amazon ElastiCache 控制台“事件”的发生时间,集群分片扩容的 Amazon ElastiCache 事件示例如下

“Moved a total of 8192 slots out of 8192 slots from shard 0001 to shard 0002”字样代表集群分片扩容结束,记录该事件时间为结束时间

6.4 加载数据到 Amazon ElastiCache for Redis 集群

为使集群达到 50% 的内存利用率(m5.4xlarge 的机型需要创建 26.13G 随机数据),使用 memtier_benchmark 工具(使用文档),在压测实例执行如下命令

memtier_benchmark --server=<配置终端节点> --cluster-mode -t 8 -c 100 --random-data --ratio=100:0 --data-size-range=200-500 --data-size-pattern=R --key-minimum=200 --key-maximum=1000000000000 --distinct-client-seed -n 50000

6.5 使主节点产生 50% CPU 读取负载

在压测实例执行使用如下命令

memtier_benchmark --server==<配置终端节点> -t 1 -c 8 --random-data --ratio=0:100 --data-size-range=200-500 --data-size-pattern=R --key-minimum=200 --key-maximum=1000000000000 --distinct-client-seed --test-time 3000

7. 测试数据

7.1 集群故障转移测试数据

模式 无工作负载故障转移时间 有工作负载故障转移时间
Amazon ElastiCache for Redis 集群模式 m5.2xlarge 一写一读 00:00:44 00:00:46
Amazon ElastiCache for Redis 集群模式 m5.2xlarge 一写二读 00:00:31 00:00:37
Amazon ElastiCache for Redis 集群模式 m5.4xlarge 一写一读 00:00:42 00:00:32
Amazon ElastiCache for Redis 集群模式 m5.4xlarge 一写二读 00:00:34 00:00:29

表格中记录的时间为 3 次测试的平均时间

7.2 只读实例扩容测试数据

模式 无工作负载只读实例扩容时间 有工作负载只读实例扩容时间
Redis 集群模式 m5.2xlarge 一写一读 0:06:15 0:06:29
Redis 集群模式 m5.2xlarge 一写二读 0:05:11 0:06:17
Redis 集群模式 m5.4xlarge 一写一读 0:04:39 0:05:12
Redis 集群模式 m5.4xlarge 一写二读 0:04:41 0:08:32

表格中记录的时间为 3 次测试的平均时间

7.3 集群分片扩容测试数据

模式 无工作负载集群分片扩容时间 有工作负载集群分片扩容时间
Redis 集群模式 m5.2xlarge 一写一读 0:06:33 0:22:41
Redis 集群模式 m5.2xlarge 一写二读 0:05:42 0:22:46
Redis 集群模式 m5.4xlarge 一写一读 0:05:35 0:36:48
Redis 集群模式 m5.4xlarge 一写二读 0:05:41 0:36:00

表格中记录的时间为 3 次测试的平均时间

8. 测试结论

  1. 集群故障转移,在无工作负载和有工作负载的情况下,故障转移速度在 29-46 秒之间,其中一写二读比一写一读快约 8-12 秒左右。
  2. 只读实例扩容,在有工作负载的情况下扩容速度比无工作负载情况下慢 14 秒-3 分 51 秒,比例为 4%-82%。在同等配置的前提下,一写一读有工作负载比无工作负载慢 14 秒-33 秒,比例为 4%-12%,一写两读有工作负载比无工作负载慢 1 分 6 秒-3 分 51 秒 21%-82%。在有工作负载情况一写两读只读实例的扩容速度慢于一写一读,高配置实例慢花费时间更长。因此,为了更快的扩容集群的只读实例,建议使用低配置实例(2xlarge或m5.xlarge)。
  3. 集群分片扩容,在有工作负载的情况下,低配置实例(m5.2xlarge)比高配置实例(cache.m5.4xlarge)扩容速度快 14 分-15 分,比例为 40%。原因是同等内存资源前提下,多个低配置实例并行扩容效率更高。因此,为了在有工作负载时 Amazon ElastiCache for Redis 集群可以更快的扩容分片,建议使用低配置实例(m5.2xlarge或m5.xlarge)。

综上所述,在使用 Amazon ElastiCache for Redis 集群模式时建议使用低配置实例(m5.2xlarge 或 m5.xlarge),配置模式至少选择两个只读实例,以减少集群故障转移时间、只读实例扩容时间和集群分片扩容时间。

本篇作者

纪路

亚马逊云科技解决方案架构师,现负责集团战略客户。拥有 8 年广告行业大数据架构、开发经验。擅长事件驱动架构、Serverless 架构、流式处理架构的设计和开发。同时对 SQL/NoSQL 数据库的建模、调优有深入的研究。

郭立

2019 年加入亚马逊云科技,担任资深解决方案架构师和解决方案架构师经理,负责带领架构师团队支持战略客户和企业客户,同时为亚马逊云科技机器学习、数据分析与安全合规技术专家。