确保您有足够的内存来创建 Redis OSS 快照 - 亚马逊 ElastiCache (Redis OSS)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

确保您有足够的内存来创建 Redis OSS 快照

2.8.22 及更高版本中的 Redis OSS 快照和同步

Redis OSS 2.8.22 引入了无分叉保存过程,允许您分配更多内存供应用程序使用,而不会在同步和保存期间增加交换使用量。有关更多信息,请参阅 如何实施同步和备份

版本 2.8.22 之前的 Redis OSS 快照和同步

当你使用 ElastiCache (Redis OSS) 时,Redis OSS 会在许多情况下调用后台写入命令:

  • 为备份创建快照时。

  • 将副本与复制组中的主副本同步时。

  • 为 Redis OSS 启用仅追加文件功能 (AOF) 时。

  • 将副本提升为主快照时(这会导致主集群/副本同步)。

每当 Redis OSS 执行后台写入进程时,都必须有足够的可用内存来容纳进程开销。内存不足会导致该进程失败。因此,在创建 Redis OSS 集群时,选择具有足够内存的节点实例类型非常重要。

后台写入进程和内存使用情况

每当调用后台写入进程时,Redis OSS 都会分叉其进程(请记住,Redis 是单线程的)。一个分叉将您的数据保存到 Redis OSS .rdb 快照文件中的磁盘中。另一个分叉为所有读取和写入操作提供服务。为确保您的快照是 point-in-time 快照,所有数据更新和添加都将写入与数据区域分开的可用内存区域。

只要您在数据保存到磁盘期间拥有足够的可用内存来记录所有写入操作,便不会遇到内存不足的问题。如果出现以下任何情况,您便可能会遇到内存不足的问题:

  • 您的应用程序执行很多写入操作,因此需要大量可用内存来接收新数据或更新的数据。

  • 可用于写入新数据或更新的数据的内存非常少。

  • 您的数据集很大,需要很长时间才能保存到磁盘,因而需要大量写入操作。

下图说明了执行后台写入进程时的内存使用情况。

图像:后台写入过程中的内存使用情况图。

有关执行备份对性能的影响的信息,请参阅备份自行设计的集群所产生的性能影响

有关 Redis OSS 如何执行快照的更多信息,请参阅 http://redis.io

有关区域和可用区的更多信息,请参阅选择区域和可用区

避免在执行后台写入时耗尽内存

每当调用后台写入进程(如BGSAVEBGREWRITEAOF)时,为了防止该进程失败,可用内存必须超过该过程中写入操作所消耗的内存量。最坏的情况是,在后台写入操作期间,每个 Redis OSS 记录都会更新,并将一些新记录添加到缓存中。因此,对于2.8.22之前的Redis OSS版本,我们建议您将设置reserved-memory-percent为50(50%),对于Redis OSS版本2.8.22及更高版本,我们建议您将设置为25(25%)。

maxmemory 值指示可供您用于数据和操作开销的内存。因为您无法修改默认参数组中的 reserved-memory 参数,所以必须为集群创建自定义参数组。的默认值reserved-memory为 0,这允许 Redis OSS 将所有的 maxmemory 与数据一起消耗,从而可能为其他用途(例如后台写入进程)留下的内存太少。有关各种节点实例类型的 maxmemory 值,请参阅 Redis OSS 节点类型的特定参数

您还可以使用reserved-memory参数来减少 Redis OSS 在盒子上使用的内存量。

有关中特定于 Redis 的参数的更多信息,请参阅。 ElastiCache Redis OSS 特有的参数

有关创建和修改参数组的信息,请参阅创建参数组修改参数组