使用 Amazon MemoryDB for Redis 构建持久化内存数据库 - 缓存与主数据存储的统一
解析通过 MemoryDB 运维 Redis 兼容内存数据库、持久性机制及与 ElastiCache 的使用场景区分。
MemoryDB 概述
MemoryDB for Redis 是兼容 Redis 7.x 的持久化内存数据库服务,可在最多 500 个节点中存储数据。与 ElastiCache for Redis 专注于缓存 (易失性数据) 不同,MemoryDB 将写入持久化到 Multi-AZ 事务日志,因此可作为主数据存储使用。读取延迟在微秒级,写入延迟在个位数毫秒级。集群模式下可通过增加分片进行横向扩展,每个分片由一个主节点和副本组成。
持久性机制
MemoryDB 将写入同步记录到 Multi-AZ 事务日志,因此节点故障后也能恢复已写入的数据。写入操作在事务日志持久化完成后才向客户端返回 ACK,因此可获得强一致性 (strong consistency)。节点重启时从事务日志恢复数据。副本节点的复制是异步进行的,因此从副本的读取为最终一致性 (eventual consistency)。除每日自动快照外,还可以获取手动快照,用于恢复。
使用场景与 ElastiCache 的选择
MemoryDB 适用于会话存储、用户配置文件、排行榜、实时分析等「需要内存速度且不能丢失数据」的用例。可充分利用 Redis 数据结构 (Sorted Set、Hash、Stream),将 MemoryDB 作为补充 DynamoDB 或 RDS 的数据层。ElastiCache 适用于 RDS 或 DynamoDB 前端缓存等数据丢失可接受的场景。ElastiCache 采用异步复制,故障转移时可能丢失最近的写入。选择标准:如果数据可从数据源 (如 RDS) 重新获取则选 ElastiCache,如果 Redis 中的数据是唯一的真实来源则选 MemoryDB。如果只以缓存为目的,则选 ElastiCache。
Redis 数据结构与服务端处理
MemoryDB 支持 Redis 7.x 命令集,包括 Strings、Hashes、Lists、Sets、Sorted Sets、Streams、HyperLogLog 和 Geospatial 索引。Sorted Sets 可以 O(log N) 复杂度获取排名,可用于实现排行榜和时间线。Streams 可用作事件日志或消息队列,支持消费者组进行并行处理。Lua 脚本实现原子化的服务端处理,Redis Functions 可注册可重用逻辑,Pub/Sub 提供实时通知,事务 (MULTI/EXEC) 支持原子操作。ACL v2 支持按用户和命令级别的细粒度访问控制,可按键模式分离读写权限。集群模式下按 Redis Cluster 协议基于哈希槽分布数据,客户端通过 MOVED 重定向自动连接到正确的分片。大键 (数 MB 以上) 集中在单个分片会导致热点,因此按均匀的键大小设计数据模型。
设计最佳实践与注意事项
使用 MemoryDB 时,按数据大小能容纳在节点内存中进行设计。内存使用率过高会导致交换或逐出,性能下降,规划容量时为内存使用率留出余量。分片数变更 (重新分片) 可在线执行,但数据重新分配期间写入延迟会暂时增加。加密支持静态 (at-rest, KMS) 和传输中 (in-transit, TLS) 两种方式,ACL (访问控制列表) 可在 Redis 命令级别进行授权控制。基本架构是将 MemoryDB 放置在 VPC 内,通过安全组限制连接来源。通过 Multi-AZ 配置确保高可用性。
费用与限制注意事项
MemoryDB 的节点按小时计费,费用因节点类型而异。比 ElastiCache 同等节点费用更高,但包含持久性所需的事务日志存储。数据传输区域内免费,跨区域适用标准数据传输费。快照存储超出免费额度的部分按存储量计费。使用预留节点 (1 年/3 年) 可降低成本。通过参数组设置 maxmemory-policy 控制逐出行为。
总结
MemoryDB 是 Redis 兼容且具备持久性的内存数据库。通过 Multi-AZ 事务日志实现写入持久化,与 ElastiCache 用于缓存不同,可作为主数据库使用。以微秒级读取延迟,适合用作会话存储、排行榜和实时分析的数据层。设计要点是区分:ElastiCache 用于缓存,MemoryDB 用于数据是唯一真实来源的场景。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。