亚马逊AWS官方博客

Amazon MemoryDB 与 Amazon ElastiCache比较

背景

随着互联网的发展,数据库性能对于应用程序的成功至关重要。为了提高性能,要将读取数据库的时间延迟减少到微秒级别,我们通常采用的做法是在持久数据库之前放置一个内存缓存数据库,从而提高读取速度,带来更好的用户体验。

对于缓存,许多开发人员使用 Redis,这是一种开源的内存数据结构存储。事实上,根据 Stack Overflow 的 2021 年开发者调查,Redis 五年来一直是最受欢迎的数据库。要在 AWS 上实施此设置,您可以使用 Amazon ElastiCache作为 Amazon Aurora 或 Amazon DynamoDB 等持久数据库服务前的低延迟缓存,以最大程度地减少数据丢失。但是,此设置要求您在应用程序中引入自定义代码以保持缓存与数据库同步。这无疑会造成一定的学习成本和管理成本,与此同时您还需要兼顾考虑运行缓存数据库和持久化数据库的成本。

Amazon MemoryDB for Redis

现在推出的Amazon MemoryDB for Redis 开始填补了AWS ElastiCache 对于缓存数据持久化层的空白。我们将其视为一个连续体,Amazon MemoryDB 是一种服务,可以在 Amazon ElastiCache 的不足之处接手。

Amazon ElastiCache 和Amazon MemoryDB 之间的区别在于,前者旨在作为与主数据库一起工作的内存中缓存,而Amazon MemoryDB 本身是一项完整的数据库服务,旨在独立运行。考虑到 Amazon MemoryDB 本质上是 ElastiCache for Redis 的高级层;从功能上讲,它是一个数据库而不是缓存,从技术上讲,它是与它兼容的 Redis 引擎而修改实现。总而言之,Amazon MemoryDB for Redis 是一种实时数据库实现,部分基于开源 Redis 平台,但增加了持久性。

推出后,Amazon MemoryDB 将支持开源 Redis 的所有核心数据 API,包括字符串、列表、集合、排序集合、散列、流、地理空间、位图和超级日志。每个集群最多支持 128 TB 的内存,每个分片有一个副本。对于 MemoryDB,用户将能够使用他们已经使用的相同 Redis 数据结构和 API 构建应用程序,但具有完全托管数据库的额外好处。

配置步骤

接下来我们创建一个 MemoryDB,并与 ElastiCache Redis 进行性能比较。
目前 MemoryDB 仅支持以下四个区域
这里我们选择 Virginia(us-east-1) 来作为 MemoryDB 的运行区域。
在 AWS 控制台中跳转到到 Amazon MemoryDB for Redis 页面。
由于 MemoryDB 需要指定 VPC,所以我们在 「创建集群」 前需要先提前准备好好所需的 VPC,这里就不再进行步骤演示。
MemoryDB 的创建步骤与 ElastiCache 基本一致,在这一步中,我们选择的节点类型为 「db.r6g.large(13.07 GiB)」,Shards 数量为 1,Replicas 数目为 2。
集群创建完成后,我们可以从集群的详情页面查看 Endpoint 地址
接下来,我们登录到同一个 VPC 下的 EC2 机器中进行连接测试

性能比较

Redis 附带了一个名为 redis-benchmark 的基准测试工具。 我们通过该程序模拟任意数量的客户端同时连接并在服务器上执行操作,计算完成请求所需的时间。 来对 ElastiCache 与 MemoryDB 的每秒能够处理的平均请求数进行对比。

测试的 MemoryDB 类型为「db.r6g.large(13.07 GiB)」,ElastiCache Redis 类型为「cache.r6g.large(13.07 GiB)」,测试机器为「c5.2xlarge」。

在 EC2 上执行 SHELL
$ redis-benchmark -h $HOST -q

ElastiCache 的测试结果如下
PING_INLINE: 102880.66 requests per second
PING_BULK: 107411.38 requests per second
SET: 106609.80 requests per second
GET: 105596.62 requests per second
INCR: 107066.38 requests per second
LPUSH: 106951.88 requests per second
RPUSH: 106496.27 requests per second
LPOP: 106157.12 requests per second
RPOP: 108695.65 requests per second
SADD: 107181.13 requests per second
HSET: 107066.38 requests per second
SPOP: 110253.59 requests per second
LPUSH (needed to benchmark LRANGE): 105708.25 requests per second
LRANGE_100 (first 100 elements): 69735.01 requests per second
LRANGE_300 (first 300 elements): 34506.55 requests per second
LRANGE_500 (first 450 elements): 24795.44 requests per second
LRANGE_600 (first 600 elements): 19584.80 requests per second
MSET (10 keys): 77579.52 requests per second

MemoryDB 的测试结果如下

PING_INLINE: 105042.02 requests per second
PING_BULK: 107874.87 requests per second
SET: 16321.20 requests per second
GET: 107181.13 requests per second
INCR: 16160.31 requests per second
LPUSH: 16262.81 requests per second
RPUSH: 16257.52 requests per second
LPOP: 16217.97 requests per second
RPOP: 16326.53 requests per second
SADD: 102145.05 requests per second
HSET: 16082.34 requests per second
SPOP: 108932.46 requests per second
LPUSH (needed to benchmark LRANGE): 16212.71 requests per second
LRANGE_100 (first 100 elements): 67842.61 requests per second
LRANGE_300 (first 300 elements): 33467.20 requests per second
LRANGE_500 (first 450 elements): 23674.24 requests per second
LRANGE_600 (first 600 elements): 18188.43 requests per second
MSET (10 keys): 15105.74 requests per second

Amazon MemoryDB for Redis 与 ElastiCache 的对比结果如图所示。

从对比结果中可以看出 MemoryDB 在读取速度上与 ElastiCache 相差不大,但大多数写入命令的速度上不到 ElastiCache 的五分之一。

成本与价格

目前 MemoryDB 的可选类型还不如 ElastiCache 丰富,在两者几乎相同的配置类型下,MemoryDB 价格还是比 ElastiCache 略贵一些。在 Virginia 地区的价格对比见下表

Node Type Service vCPU Memory(GiB) Network Performance (Gbps) Price per Hour
db.r6g.large MemoryDB 2 13.07 Up to 10 $0.309
cache.r6g.large ElastiCache 2 13.07 Up to 10 $0.206
db.r6g.xlarge MemoryDB 4 26.32 Up to 10 $0.617
cache.r6g.xlarge ElastiCache 4 26.32 Up to 10 $0.411
db.r6g.2xlarge MemoryDB 8 52.82 Up to 10 $1.232
cache.r6g.2xlarge ElastiCache 8 52.82 Up to 10 $0.821
db.r6g.4xlarge MemoryDB 16 105.81 Up to 10 $2.463
cache.r6g.4xlarge ElastiCache 16 105.81 Up to 10 $1.642
db.r6g.8xlarge MemoryDB 32 209.55 12 $4.926
cache.r6g.8xlarge ElastiCache 32 209.55 12 $3.284
db.r6g.12xlarge MemoryDB 48 317.77 20 $7.388
cache.r6g.12xlarge ElastiCache 48 317.77 20 $4.925
db.r6g.16xlarge MemoryDB 64 419.09 25 $9.851
cache.r6g.16xlarge ElastiCache 64 419.10 25 $6.567

总结

您可以轻松创建 Amazon MemoryDB 集群并将其扩展到多达 500 个节点,在内存中存储超过 100 TB 的数据。 Amazon MemoryDB 具有高可用性,支持跨多个可用区的复制。 Amazon MemoryDB 也是安全的,支持 Amazon Virtual Private Cloud (VPC)、使用 AWS Key Management Service 进行静态加密、传输中加密以及使用 Redis 访问控制列表 (ACL) 进行身份验证和授权。

此外,Amazon MemoryDB 是完全托管的,因此您无需担心数据库管理任务,例如硬件配置、软件修补、设置、配置或备份。使用 Amazon MemoryDB 无需预先承诺或费用,您只需为使用的数据库容量付费。

目前Amazon MemoryDB for Redis已经在Amazon 多个区域可以使用。作为缓存数据持久化的一种选择,虽然写速度与ElastiCache相比有所下降,但读取速度还是非常令人期待。在价钱方面,相同类型的 MemoryDB 的价格是 ElastiCache 价格的1.5倍。

在未来的日子里,我们会看到更多的案例,Amazon MemoryDB for Redis为主流的RDS+ ElastiCache 或者DynamoDB+ DAX提供了另外一种解决和替代方案。拥有这样的集成功能可以让您的网站或程序从一开始就启用缓存,并且减少不菲的开发时间与维护成本,并快速获得 Redis缓存的性能优势,而无需管理单独的平台基础设施。

Amazon MemoryDB for Redis非常适合需要微秒响应时间并且随时可能出现大量流量峰值的应用程序,例如游戏排行榜、会话存储和实时分析。您可以按照不同的具体的业务形态,来选取合适您的服务,从而快速而轻松地实现您的业务需求。

本篇作者

张晓功

AWS云原生应用架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。精通微服务架构设计、治理、容器编排、监控熔断等性能和可靠性等具体功能落地。具有丰富的互联网产品开发、大规模并行计算、性能优化等经验。

许和风

AWS 云原生应用工程师,负责基于 AWS 的云计算方案架构的设计和实施。对公有云、DevOps、微服务、容器化、Serverless、全栈开发等有深入的研究,同时致力于推广云原生应用,帮助客户利用云原生来实现业务需求。