Azure Redis 缓存中的数据持久性

如果发生 Azure Redis 缓存缓存失败,则节点关闭时可能会丢失数据。 Redis 持久性 允许保留缓存实例中存储的数据。 如果发生硬件故障,缓存实例在恢复联机时会使用持久性文件中的数据解除冻结。

本文介绍 Redis 暂留,以及如何在高级层 Azure Redis 缓存实例中配置和管理数据暂留。 数据持久性功能在基本层或标准层中不可用。

持久保存数据是提升缓存实例持久性的重要方法,因为它将所有缓存数据存储在内存中。 持久性应该是 Azure Redis 高可用性和灾难恢复 策略的关键部分。

重要

数据持久化功能提供了可应对意外 Redis 节点故障的复原能力。 数据暂留不是数据备份或时间点恢复 (PITR) 功能。 如果将损坏的数据写入 Redis 实例,则损坏的数据也会保留。 若要备份 Redis 实例,请使用 “导出 ”功能。

重要

如果在高级层上使用持久化,请在使用数据持久化功能之前进行检查,以确定存储帐户是否已启用软删除。 将数据持久化与软删除结合使用将导致非常高的存储成本。 有关详细信息,请参阅 是否应启用软删除?

可用范围

基本、标准 高级
可用

Redis 数据持久性的类型

Azure Redis 提供两种类型的数据持久性:Redis 数据库 (RDB) 格式和仅追加文件 (AOF) 格式。

  • RDB 持久性 以二进制格式保存缓存的快照,并将其保存在 Azure 存储帐户中。 配置备份频率以确定保留快照的频率。 如果发生禁用主缓存和副本缓存的灾难性事件,则缓存会自动使用最新的快照重新构造。 有关详细信息,请参阅 RDB 优点RDB 缺点

  • AOF 持久性 将每次写入作保存到日志,并将日志每秒一次保存到 Azure 存储帐户。 如果发生同时禁用主缓存和副本缓存的灾难性事件,则缓存会自动使用存储的写入作重新构造。 有关详细信息,请参阅 AOF 优点AOF 缺点

要求和限制

  • 数据持久性功能为意外的 Redis 节点故障提供复原能力。 数据持久性不是数据备份或 PITR 功能。 如果损坏的数据写入 Redis 实例,则损坏的数据也会保留。 若要备份 Redis 实例,请使用 “导出 ”功能。

  • Azure Redis 缓存持久性功能旨在将数据在数据丢失后自动还原到同一缓存。 无法将持久化数据文件导入新的或现有的缓存。

    • 若要跨缓存移动数据,请使用 导入和导出数据 功能。

    • 若要生成可添加到新缓存的数据的任何备份,可以使用定期导出数据的 PowerShell 或 Azure CLI 自动脚本。

  • 使用 被动异地复制 或主动异地复制的缓存不支持持久性。

数据加密

由于 Redis 持久性会创建静态数据,因此加密此数据非常重要。 加密选项因使用的 Azure Redis 层而异。

对于高级订阅,在启动持久性时,数据直接从缓存实例传输到 Azure 存储。 Azure 存储在保存数据时会自动加密数据,但你可以使用多种加密方法,包括Microsoft管理的密钥(MMK)、客户管理的密钥(CMK)和客户提供的密钥。 有关详细信息,请参阅 Azure 存储中静态数据的加密客户管理的密钥,用于 Azure 存储加密

设置数据持久性

可以使用 Azure 门户、Azure 资源管理器(ARM)模板、PowerShell 或 Azure CLI 为高级层 Azure Redis 缓存创建和设置数据暂留。

先决条件

  • 若要创建和添加 Azure Redis 缓存的持久性,需要写入访问权限和权限才能在 Azure 订阅中创建高级级别缓存。
  • 对于高级层缓存,需要缓存所在的同一区域中的 Azure 存储帐户 来存储缓存数据。 如果使用 托管标识 作为身份验证方法,则可以在与缓存不同的订阅中使用存储帐户。
  • 对于 Azure PowerShell 过程,需要 安装 Azure PowerShell
  • 对于 Azure CLI 过程,需要 安装 Azure CLI

在 Azure 门户中设置数据持久性

在 Azure 门户中,创建 Azure Redis 高级级缓存实例时,可以设置数据持久性。

备注

还可以通过在缓存的左侧导航菜单中的“设置”下导航到“数据暂留”,将持久性添加到以前创建的缓存。

  1. 若要在 Azure 门户中创建高级缓存,请按照快速入门中的说明作:创建开源 Redis 缓存,然后在“基本信息”选项卡上选择“缓存 SKU的高级”。

    屏幕截图显示一个用于创建 Azure Cache for Redis 资源的窗体。

  2. 填写“高级”选项卡时,在数据持久性下选择“备份文件”RDBAOF持久性,并配置相关设置。

    显示 RDB 数据持久性设置的屏幕截图。

    • 对于 RDB,请配置以下设置:

      设置 价值 说明
      身份验证方法 选择 托管标识存储密钥 使用 托管标识 ,可以在与缓存不同的订阅中使用存储帐户。
      订阅 选择包含你的托管标识的订阅。 只有当你选择了托管标识身份验证时,才会显示此项。
      备份频率 选择备份间隔: 15 分钟30 分钟60 分钟6 小时12 小时24 小时 在上一个备份操作成功完成后,此间隔就会开始倒计时。 间隔过后,将启动新的备份。
      存储帐户 选择存储帐户。 存储帐户必须与缓存位于同一区域。 建议使用高级存储帐户,因为它的吞吐量更高。
      存储密钥 选择 要使用的主密钥辅助密钥 仅当选择了 存储密钥 身份验证时,才会显示此项。 如果重新生成持久性存储帐户的存储密钥,则必须从 “存储密钥 ”下拉列表重新配置密钥。
    • 对于 AOF,请配置以下设置:

      设置 价值 说明
      身份验证方法 选择 托管标识存储密钥 使用 托管标识 ,可以在与缓存不同的订阅中使用存储帐户。
      订阅 选择包含你的托管标识的订阅。 只有当你选择了托管标识身份验证时,才会显示此项。
      第一个存储帐户 选择存储帐户。 存储帐户必须与缓存位于同一区域。 建议使用高级存储帐户,因为它的吞吐量更高。
      第一个存储密钥 选择要使用的 主密钥辅助密钥 仅当选择了 存储密钥 身份验证时,才会显示此项。 如果重新生成存储密钥,则必须从 “存储密钥 ”下拉列表重新配置密钥。
      第二个存储帐户 (可选)选择辅助存储帐户。 如果配置辅助存储帐户,则对副本缓存的写入将持久保存到第二个存储帐户。
      第二个存储密钥 选择要使用的 主密钥辅助密钥 仅当选择了 存储密钥 身份验证时,才会显示此项。 如果重新生成存储密钥,则必须重新配置密钥。
  3. 按照快速入门的其余说明完成所有选项卡并完成创建缓存 :创建开源 Redis 缓存

使用 RDB 持久性功能,当备份频率间隔结束时,第一个备份将启动。

使用 AOF 持久性时,写入缓存的操作会保存到指定的存储帐户或帐户中。 如果发生灾难性故障会同时关闭主缓存和副本缓存,则存储的 AOF 日志用于重新生成缓存。

使用 Azure PowerShell 设置数据持久性

创建 Azure Redis 高级层缓存时,可以使用 Azure PowerShell 设置数据暂留,或向以前创建的缓存添加持久性。

可以使用 New-AzRedisCache 命令创建使用数据持久性的新 Azure Redis 高级层缓存。

若要更新现有缓存以使用数据持久性,请运行 Set-AzRedisCache 命令。 有关说明,请参阅 向现有缓存添加持久性

使用 Azure CLI 设置数据持久性

创建 Azure Redis 高级层缓存时,可以使用 Azure CLI 设置数据暂留,或向以前创建的缓存添加持久性。

可以使用 az redis create 命令创建使用数据暂留的新高级层缓存。 例如:

az redis create --location chinanorth2 --name MyRedisCache --resource-group MyResourceGroup --sku Premium --vm-size p1 --redis-configuration @"config_rdb.json"

若要更新现有缓存,请使用 az redis update 命令。 例如:

az redis update --name MyRedisCache --resource-group MyResourceGroup --set "redisConfiguration.rdb-storage-connection-string"="BlobEndpoint=https//..." "redisConfiguration.rdb-backup-enabled"="true" "redisConfiguration.rdb-backup-frequency"="15" "redisConfiguration.rdb-backup-max-snapshot-count"="1"

保留常见问题

本部分包含有关 Azure Redis 缓存持久性的常见问题的解答。

RDB 持久性

AOF 持久性

能否在此前已创建的缓存的基础上启用保留?

可以,可以在创建缓存时和现有高级缓存上配置持久性。

是否可以同时启用 AOF 暂留和 RDB 暂留?

否,可以启用 RDB 或 AOF,但不能同时启用两者。

暂留如何与异地复制一起使用?

数据持久性在启用异地复制时不工作。

应该选择哪个暂留模型?

AOF 持久性每秒写入日志一次,而 RDB 持久性会基于配置的备份间隔保存备份。 与 AOF 持久性相比,RDB 持久性对吞吐量和性能的影响较小。

选择 AOF 持久性,若您的主要目标是最大程度减少数据丢失,同时可以接受缓存吞吐量较低。 如果要在缓存上保持最佳吞吐量,但仍需要一种用于数据恢复的机制,请选择 RDB 持久性。

有关详细信息,请参阅 RDB 优点RDB 缺点AOF 优点AOF 缺点

AOF 持久化是否会影响缓存的吞吐量、延迟或性能?

AOF 持久性会影响吞吐量。 由于 AOF 同时在主进程和副本进程中运行,因此对于具有 AOF 持久性的缓存,CPU 和服务器负载高于没有 AOF 持久性的相同缓存。 AOF 提供与内存中数据的最佳一致性,因为每次写入和删除仅在数秒钟延迟的情况下即可持久化保存。 代价是 AOF 的计算密集程度更高。

只要 CPU 和服务器负载都小于 90%,吞吐量会受到影响,但缓存正常运行。 如果 CPU 和服务器负载超过 90%,吞吐量损失可能会提高,因此由缓存处理的所有命令的延迟也会增加。 延迟增加是因为 AOF 持久化运行在主进程和副本进程上,从而增加了正在使用的节点的负载,并将持久化置于数据的关键路径上。

如果我调整到不同的大小,并且还原了在缩放操作之前进行的备份,会发生什么情况?

  • 如果放大到更大的尺寸,将不会产生任何影响。
  • 如果调整为较小的大小,并且自定义的数据库设置超过了新的数据库限制,那么这些数据库中的数据将不会被还原。 有关详细信息,请参阅在缩放过程中,自定义数据库设置是否会受影响?
  • 如果缩放到较小的大小,并且较小的空间不足以保存上次备份中的所有数据,则还原过程中会逐出密钥。 通常使用 allkeys-lru 逐出策略来逐出密钥。

能否在两个不同的缓存中使用同一存储帐户进行保留?

否,必须使用不同的存储帐户。 每个缓存都必须有自己的存储帐户,以便设置持久性。

重要

此外,使用单独的存储帐户来进行持久性管理,并定期在缓存上执行导出操作。

是否会对数据持久化中使用的存储费用进行收费?

  • 对于高级缓存,需根据存储帐户的定价模型为使用的存储付费。

RDB 和 AOF 的持续写入 blob 的频率如何,是否应启用软删除?

RDB 和 AOF 持久性可以按照每小时、每分钟或每秒的频率写入你的存储 blob。 如果缓存采用典型数据大小,同时每秒执行写入操作,则软删除将很快变得价格高昂。 在存储帐户上启用软删除也意味着 Azure Redis 无法通过删除旧的备份数据来最大程度地降低存储成本。

最好避免在用于 Azure Redis 高级层数据持久性的存储帐户上启用软删除。 有关软删除的详细信息,请参阅定价和计费

创建缓存后是否可更改 RDB 备份频率?

可以,可以使用 Azure 门户、Azure CLI 或 Azure PowerShell 更改 RDB 暂留的备份频率。

为何我的 RDB 备份频率为 60 分钟,而两次备份的间隔却超过 60 分钟?

在上次备份过程成功完成前,RDB 持久化备份频率间隔不会开始。 如果备份频率为 60 分钟,并且备份过程需要 15 分钟才能完成,则下一个备份在上一次备份的开始时间后 75 分钟才会启动。

进行新备份以后,旧的 RDB 备份会发生什么情况?

除最新备份外的所有 RDB 持久性备份会被自动删除。 这种删除可能不会即刻发生,但旧备份是不会无限期保存。 如果使用高级层进行暂留,并且已为存储帐户启用软删除,则现有备份将继续驻留在软删除状态。

是否应使用第二个存储帐户?

如果预期缓存上的 SET 操作高于正常水平,请使用第二个存储帐户用于 AOF 持久化。 使用辅助存储帐户有助于确保缓存未达到存储带宽限制。 此选项仅适用于高级层缓存。

如何删除第二个存储帐户?

可通过将第二个存储帐户设置为与第一个存储帐户相同的方式来删除 AOF 暂留辅助存储帐户。 若要更改现有缓存的设置,请在缓存页面左侧导航菜单中的“设置”下选择“数据暂留”。 若要完全禁用持久性,请在“数据暂留”页上选择“已禁用”。

什么是重写?重写对缓存有何影响?

当 AOF 文件足够大时,重写会自动排队在缓存上。 重写使用创建当前数据集所需的最小操作集来重设 AOF 文件大小。

重写期间预期会很快达到性能限制,尤其是在处理大型数据集时。 重写频率较低,因为 AOF 文件变大,但在发生时需要大量时间。

缩放启用 AOF 的缓存时会出现什么情况?

如果在缩放时 AOF 文件很大,预计缩放操作会比平时耗时更长,因为 AOF 文件会在缩放完成后被重新加载。 另请参阅 如果我缩放到不同的大小,并且还原了在缩放操作之前进行的备份,会发生什么情况?

AOF 数据如何在存储中进行整理?

使用高级层时,AOF 文件中存储的数据会按分片划为多个页 Blob。 默认情况下,一半的 Blob 保存在主存储帐户中,一半保存在辅助存储帐户中。 在多个页 Blob 和两个不同的存储帐户之间拆分数据可以提高性能。

如果写入缓存的峰值速率不高,则可能不需要此额外性能。 在这种情况下,可以删除辅助存储帐户配置,以及存储在单个主存储帐户中的所有 AOF 文件。 下表显示了每个定价层使用的页 Blob 总数。

高级层 Blob
P1 8 个/分片
P2 16 个/分片
P3 32 个/分片
P4 40 个/分片

启用群集时,缓存中的每个分片具有自己的页 blob 集,如上表所示。 例如,具有 3 个分片的 P2 缓存在 48 个页 blob 之间分配其 AOF 文件:每个分片 16 个页 blob,共 3 个分片。

重写后,存储中存在 2 个 AOF 文件集。 重写在后台进行,并追加到第一个文件集。 在重写期间发送到缓存的 SET 操作会追加到第二个文件集。

如果在重写期间出现故障,则会临时存储备份。 重写完成后,会立即删除备份。 如果为存储帐户启用软删除,则会应用软删除设置,而现有备份将继续处于软删除状态。

存储帐户上的防火墙例外是否会影响持久性?

是的。 对于高级层中的持久性,使用 存储帐户上的防火墙设置 可以防止持久性功能正常工作。

可以通过查看 “错误”指标来检查保存数据中的错误。 此指标指示缓存是否由于存储帐户或其他问题的防火墙限制而无法保留数据。

若要对设置了防火墙的存储帐户使用数据持久性,请使用 基于托管标识的身份验证 连接到存储。 使用托管标识将缓存实例添加到 受信任的服务列表中,使防火墙例外更易于应用。 如果使用密钥而不是托管标识授权存储帐户,则存储帐户上的防火墙例外往往会中断持久性过程。

如果我有多个副本,是否可以启用 AOF 持久性?

使用高级层时,在有多个副本的情况下不能使用 AOF 持久性。

如何检查我的存储帐户上是否启用了软删除?

在 Azure 门户中,选择缓存用于持久性的存储帐户,并在其左侧导航菜单中的数据管理下选择数据保护。 在“数据保护”页上,检查是否已启用“为 blob 启用软删除”。 有关 Azure 存储帐户中的软删除的详细信息,请参阅为 Blob 启用软删除

是否可以在与缓存所在的订阅不同的订阅中使用存储帐户?

仅当使用托管标识作为存储帐户身份验证方法时,才能选择其他订阅中的存储帐户。

了解有关 Azure Cache for Redis 功能的详细信息。