本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
确保具有用于创建 Redis 快照的足够内存
2.8.22 版本及更高版本中的 Redis 快照和同步
Redis 2.8.22 引入了无分支的保存过程,使您能够在同步和保存期间,将更多内存分配给应用程序使用而不会增加交换分区使用率。有关更多信息,请参阅如何实施同步和备份。
2.8.22 版本之前的版本中的 Redis 快照和同步
使用 Redis ElastiCache 时,Redis 会在许多情况下调用后台写入命令:
为备份创建快照时。
将副本与复制组中的主副本同步时。
为 Redis 启用仅附加文件功能 (AOF) 时。
将副本提升为主快照时(这会导致主集群/副本同步)。
每当 Redis 执行后台写入进程时,您都必须有足够的可用内存来处理进程开销。内存不足会导致该进程失败。因此,重要的是在创建 Redis 集群时应选择有足够内存的节点实例类型。
后台写入进程和内存使用情况
每当调用后台写入进程时,Redis 都会创建进程分叉(请记住,Redis 是单线程的)。一个分叉将您的数据保存到磁盘上的 Redis .rdb 快照文件中,另一个分叉为所有读取和写入操作提供服务。为了确保您的快照是时间点快照,所有数据更新和增加都写入与数据区域不同的可用内存区域。
只要您在数据保存到磁盘期间拥有足够的可用内存来记录所有写入操作,便不会遇到内存不足的问题。如果出现以下任何情况,您便可能会遇到内存不足的问题:
-
您的应用程序执行很多写入操作,因此需要大量可用内存来接收新数据或更新的数据。
-
可用于写入新数据或更新的数据的内存非常少。
-
您的数据集很大,需要很长时间才能保存到磁盘,因而需要大量写入操作。
下图说明了执行后台写入进程时的内存使用情况。
有关执行备份对性能的影响的信息,请参阅备份自行设计的集群所产生的性能影响。
有关 Redis 如何执行快照的更多信息,请参阅 http://redis.io
有关区域和可用区的更多信息,请参阅选择区域和可用区。
避免在执行后台写入时耗尽内存
每当调用后台写入进程(例如 BGSAVE 或 BGREWRITEAOF)时,为防止该进程失败,您拥有的可用内存必须多于写入操作在该进程执行期间所消耗的内存量。最糟糕的情况是,在后台写入操作期间,每个 Redis 记录都进行更新,并且有一些新的记录增加到缓存。因此,对于 2.8.22 版之前的 Redis,建议您将 reserved-memory-percent
设置为 50 (50%);对于 2.8.22 版及更高版本的 Redis,建议您将此参数设置为 25 (25%)。
maxmemory
值指示可供您用于数据和操作开销的内存。因为您无法修改默认参数组中的 reserved-memory
参数,所以必须为集群创建自定义参数组。reserved-memory
的默认值是 0,这允许 Redis 为数据消耗所有 maxmemory,可能不会为其他用途(例如后台写入进程)留下内存。有关各种节点实例类型的 maxmemory
值,请参阅 特定于 Redis 节点类型的参数。
您还可以使用 reserved-memory
参数来减少 Redis 在框架上使用的内存量。
有关 ElastiCache 中特定于 Redis 的参数的更多信息,请参阅 Redis 特定的参数。