你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

缩放 Azure Cache for Redis 实例

Azure Cache for Redis 具有不同的产品/服务,可以灵活地选择缓存大小和功能。 通过缩放,可以在创建缓存实例后更改节点的大小、层和数量,以匹配应用程序的需求。 本文演示了如何使用 Azure 门户以及 Azure PowerShell 和 Azure CLI 等工具来缩放缓存。

缩放类型

基本上可以使用两种方法来缩放 Azure Cache for Redis实例:

  • 纵向扩展可增加运行 Redis 服务器的虚拟机 (VM) 大小,从而添加增加更多的内存、虚拟 CPU (vCPU) 和网络带宽。 纵向扩展也称为垂直缩放。 纵向扩展与纵向缩减相反。

  • 横向扩展会将缓存实例划分为更多相同大小的节点,可以通过并行化增加内存、vCPU 和网络带宽。 横向扩展也称为水平缩放分片。 横向扩展与横向缩减相反。 在 Redis 社区中,横向扩展通常称为聚类分析

可用范围

“基本”和“标准” 高级 Enterprise 和 Enterprise Flash
按比例增加
纵向缩减
Scale Out
横向缩减

何时缩放

可使用 Azure Cache for Redis 的监视功能来监视缓存的运行状况和性能。 使用该信息确定何时缩放缓存。

可以监视以下指标来确定是否需要进行缩放。

  • Redis 服务器负载
    • 高 Redis 服务器负载意味着此服务器无法应对来自所有客户端的请求。 由于 Redis 服务器是单线程进程,因此横向扩展通常比纵向扩展更有帮助。 通过启用聚类分析进行横向扩展有助于跨多个 Redis 进程分配开销函数。 横向扩展还有助于分发 TLS 加密/解密和连接/断开连接,从而使用 TLS 加快缓存实例的速度。
    • 纵向扩展仍有助于降低服务器负载,因为后台任务可以利用更多的 vCPU 并为主 Redis 服务器进程释放线程。
    • Enterprise 和 Enterprise Flash 层使用 Redis Enterprise,而不是开放源代码 Redis。 这些层的优点之一是 Redis 服务器进程可以利用多个 vCPU。 使用多个 vCPU,在这些层中纵向扩展和横向扩展都有助于降低服务器负载。
  • 内存使用率
    • 高内存用量指示数据大小对于当前的缓存大小来说太大。 请考虑缩放到具有更大内存的缓存大小。 纵向扩展横向扩展在这里都是有效的。
  • 客户端连接
    • 每个缓存大小都有其所能支持的客户端连接数的限制。 如果客户端连接即将达到缓存大小限制,请考虑纵向扩展到更大的层。 横向扩展不会增加支持的客户端连接数。
    • 有关按缓存大小列出的连接限制的详细信息,请参阅 Azure Cache for Redis 定价
  • 网络带宽
    • 如果 Redis 服务器超出可用带宽,则客户端请求可能会超时,因为服务器无法以足够快的速度将数据推送到客户端。 要了解使用的服务器端带宽量,请检查“缓存读取”和“缓存写入”指标。 如果 Redis 服务器超出可用的网络带宽,则应考虑横向扩展或纵向扩展到具有更高网络带宽的更大缓存大小。
    • 对于使用 Enterprise 群集策略的 Enterprise 层缓存,横向扩展不会增加网络带宽。
    • 若要详细了解缓存大小的网络可用带宽,请参阅 Azure Cache for Redis 规划常见问题解答
  • 内部 Defender 扫描
    • 在 C0C1 标准缓存上,当内部 Defender 扫描正在 VM 上运行时,服务器负载可能会出现短暂的峰值(不是由缓存请求数增加导致的)。 当每天在这些层级上多次运行内部 Defender 扫描时,请求延迟更高。 C0 和 C1 层上的缓存只有一个核心用来进行多任务处理,并将服务于内部 Defender 扫描和 Redis 请求的工作分开。 可以通过缩放到具有多个 CPU 核心的更高层级产品/服务(例如 C2)来降低影响。
    • 更高层级上增加的缓存大小有助于解决任何延迟问题。 此外,在 C2 级别,可以支持多达 2,000 个客户端连接。

若要详细了解如何确定要使用的缓存定价层,请参阅选择正确的层Azure Cache for Redis 规划常见问题解答

注意

有关如何优化缩放过程的详细信息,请参阅缩放最佳做法指南

缩放 Azure Cache for Redis 的先决条件/限制

可以纵向扩展/缩减到不同定价层,但存在以下限制:

  • 不能从较高的定价层缩放到较低的定价层。
    • 不能从 EnterpriseEnterprise Flash 缓存纵向缩减到任何其他层。
    • 不能从高级缓存向下缩放到标准基本缓存。
    • 不能从标准缓存向下缩放到基本缓存。
  • 可从基本缓存缩放到标准缓存,但不能同时更改大小。 以后如果需要不同的大小,可以执行缩放操作以缩放为所需大小。
  • 不能从基本缓存直接缩放到高级缓存。 首先在一个缩放操作中从“基本”缩放到“标准”,然后在后续的缩放操作中从“标准”缩放到“高级”。
  • 不能从较大的大小横向缩减为“C0 (250 MB)”大小。 但是,可以横向缩减为同一定价层中的任何其他大小。 例如,可以从“C5 标准”横向缩减为“C1 标准”。
  • 不能从高级标准基本缓存纵向扩展到 EnterpriseEnterprise Flash 缓存。
  • 不能在 EnterpriseEnterprise Flash 之间缩放。

可以横向扩展/缩减,但存在以下限制:

  • 只有高级层、Enterprise 层和 Enterprise Flash 层支持横向扩展
  • 只有高级层支持横向缩减
  • 高级层上,必须先启用聚类分析,然后才能进行横向缩减或横向扩展。
  • 在“高级”层上,对横向扩展到 10 个分片的支持已正式发布。 预览版支持横向扩展到最多 30 个分片。 (对于具有两个副本的缓存,分片限制为 20。对于具有三个副本的缓存,分片限制为 15。)
  • 只有 EnterpriseEnterprise Flash 层可以同时进行纵向扩展和横向扩展。

如何缩放 - 基本层、标准层和高级层

使用 Azure 门户进行纵向扩展和缩减

  1. 要缩放缓存,请在 Azure 门户浏览到缓存,并从“资源”菜单中选择“缩放”。

    显示“资源”菜单上“缩放”的屏幕截图。

  2. 选择工作窗格中的定价层,然后选择“选择”。

    显示 Azure Cache for Redis 层的屏幕截图。

  3. 当缓存缩放到新层级时,会显示“缩放 Redis 缓存”通知。

    显示缩放通知的屏幕截图。

  4. 缩放完成后,状态将从正在缩放更改为正在运行

注意

使用门户纵向扩展或缩减缓存时,maxmemory-reservedmaxfragmentationmemory-reserved 设置都会自动根据缓存大小按比例进行缩放。 例如,如果 maxmemory-reserved 在 6 GB 缓存上设置为 3 GB,并且你扩展到 12 GB 缓存,则在扩展期间这些设置会自动更新为 6 GB。 纵向缩减时,将发生相反的行为。

使用 PowerShell 纵向扩展和缩减

修改 SizeSku 属性后,可以通过 PowerShell 使用 Set-AzRedisCache cmdlet 缩放 Azure Cache for Redis 实例。 以下示例演示了如何将名为 myCache 的缓存缩放为同一层中的 6 GB 缓存。

   Set-AzRedisCache -ResourceGroupName myGroup -Name myCache -Size 6GB

有关使用 PowerShell 进行缩放的详细信息,请参阅使用 PowerShell 缩放 Azure Redis 缓存

使用 Azure CLI 纵向扩展和缩减

要使用 Azure CLI 缩放 Azure Cache for Redis 实例,可调用 az redis update 命令。 使用 sku.capcity 属性在层内缩放,例如从标准 C0 到标准 C1 缓存:

az redis update --cluster-name myCache --resource-group myGroup --set "sku.capacity"="2"

使用“sku.name”和“sku.family”属性纵向扩展到不同的层,例如从标准 C1 缓存扩展到高级 P1 缓存:

az redis update --cluster-name myCache --resource-group myGroup --set "sku.name"="Premium" "sku.capacity"="1" "sku.family"="P"

有关使用 Azure CLI 进行缩放的详细信息,请参阅更改现有 Azure Redis 缓存的设置

注意

在以编程方式进行纵向扩展或缩减时(例如,使用 PowerShell 或 Azure CLI),将忽略更新请求中的任何 maxmemory-reservedmaxfragmentationmemory-reserved。 只会遵循缩放更改。 你可以在缩放操作完成后更新这些内存设置。

如何纵向扩展和横向扩展 - Enterprise 层和 Enterprise Flash 层

Enterprise 和 Enterprise Flash 层能够在一次操作中进行纵向扩展和横向扩展。 其他层则需要对每个操作执行单独的操作。

注意

Enterprise 层和 Enterprise Flash 层尚不支持纵向缩减横向缩减操作。

使用 Azure 门户进行缩放

  1. 要缩放缓存,请在 Azure 门户浏览到缓存,并从“资源”菜单中选择“缩放”。

    显示在 Enterprise 缓存的“资源”菜单中选择了“缩放”的屏幕截图。

  2. 要进行纵向扩展,请选择其他缓存类型,然后选择“保存”。

    重要

    此时只能进行纵向扩展。 而无法进行纵向缩减。

    显示工作窗格中 Enterprise 层的屏幕截图。

  3. 要进行横向扩展,请增大“容量”滑块。 容量将以 2 为增量增加。 此数字反映了要添加的基础 Redis Enterprise 节点数。 此数字始终是 2 的倍数,以反映正在为主分片和副本分片添加的节点。

    重要

    目前只能进行横向扩展来增加容量。 无法进行横向缩减。

    屏幕截图显示了工作窗格中的“容量”,其周围有一个红框。

  4. 当缓存缩放到新层级时,会显示“缩放 Redis 缓存”通知。

    显示缩放 Enterprise 缓存的通知的屏幕截图。

  5. 缩放完成后,状态将从正在缩放更改为正在运行

使用 PowerShell 进行缩放

可以使用 Update-AzRedisEnterpriseCache cmdlet 通过 PowerShell 缩放 Azure Cache for Redis 实例。 可以修改 Sku 属性来纵向扩展实例。 可以修改 Capacity 属性来横向扩展实例。 以下示例演示了如何将名为 myCache 的缓存缩放为容量为 4 的 Enterprise E20 (25 GB) 实例。

   Update-AzRedisEnterpriseCache -ResourceGroupName myGroup -Name myCache -Sku Enterprise_E20 -Capacity 4

使用 Azure CLI 进行缩放

要使用 Azure CLI 缩放 Azure Cache for Redis 实例,可调用 az redisenterprise update 命令。 可以修改 sku 属性来纵向扩展实例。 可以修改 capacity 属性来横向扩展实例。 以下示例演示了如何将名为 myCache 的缓存缩放为容量为 4 的 Enterprise E20 (25 GB) 实例。

az redisenterprise update --cluster-name "myCache" --resource-group "myGroup" --sku "Enterprise_E20" --capacity 4

关于缩放的常见问题

以下列表包含有关 Azure Redis 缓存缩放的常见问题的解答。

可以向上缩放到高级缓存,或在其中向下缩放吗?

  • 不能从高级缓存向下缩放到基本标准定价层。
  • 可以从一个高级缓存定价层缩放到另一个高级缓存定价层。
  • 不能从基本缓存直接缩放到高级缓存。 首先在一个缩放操作中从“基本”缩放到“标准”,然后在后续的缩放操作中从“标准”缩放到“高级” 。
  • 无法从高级 缓存缩放到 EnterpriseEnterprise Flash 缓存。
  • 如果在创建高级缓存时启用了群集,则可以更改群集大小。 如果创建缓存时未启用群集功能,可以稍后进行配置。

缩放后,我是否需要更改缓存名称或访问密钥?

不需要,在缩放操作期间缓存名称和密钥不变。

缩放的工作原理?

  • 将基本缓存缩放为不同大小时,将关闭该缓存,同时使用新的大小预配一个新缓存。 在此期间,缓存不可用,且缓存中的所有数据都将丢失。
  • 基本缓存缩放为标准缓存时,将预配副本缓存并将主缓存中的数据复制到副本缓存。 在缩放过程中,缓存仍然可用。
  • 在将标准高级EnterpriseEnterprise Flash 缓存缩放为不同大小时,其中一个副本将会关闭并重新预配为新的大小,将数据转移,然后另一个副本将会执行故障转移,再进行重新预配,类似于一个缓存节点出现故障时所发生的过程。
  • 横向扩展群集缓存时,将预配新的分片并将其添加到 Redis 服务器群集中。 然后,数据跨所有分片重新进行切分。
  • 在群集缓存中进行缩放时,首先对数据重新进行切分,然后针对所需的分片缩减群集大小。
  • 在某些情况下(例如,缩放缓存或将缓存迁移到其他群集)时,缓存的基础 IP 地址可能会更改。 缓存的 DNS 记录会发生变化,并且对大多数应用程序是透明的。 但如果使用 IP 地址配置与缓存的连接、配置 NSG 或允许流量进入缓存的防火墙,则应用程序在 DNS 记录更新后的某个时间可能会遇到连接问题。

在缩放过程中是否会丢失缓存中的数据?

  • 基本缓存缩放为新的大小时,所有数据都会丢失,且在缩放操作期间缓存将不可用。
  • 将基本缓存缩放为标准缓存时,通常将保留缓存中的数据 。
  • 在将标准高级EnterpriseEnterprise Flash 缓存缩放到更大的大小时,通常会保留所有数据。 将标准缓存或高级缓存缩放为更小的大小时,如果数据大小在缓存被纵向缩减时超出了新的较小大小,数据可能会丢失。 如果缩小时数据丢失,则使用 allkeys lru 逐出策略逐出密钥。

缩放后是否可以使用高级层的所有功能?

否,某些功能只能在高级层中创建缓存时设置,无法在缩放后使用。

创建高级缓存后,无法添加这些功能:

  • 虚拟网络注入
  • 添加区域冗余
  • 每个主数据库使用多个副本

若要使用这些功能中的任何一个,必须在高级层中创建新的缓存实例。

在缩放过程中,自定义数据库设置是否会受影响?

如果在缓存创建过程中为 databases 设置配置了自定义值,请记住,某些定价层具有不同的数据库限制。 以下是在这种情况下缩放时的一些注意事项:

  • 缩放到的定价层的 databases 限制低于当前层时:
    • 如果使用的是默认 databases 数(对于所有定价层来说为 16),则不会丢失数据。
    • 如果使用的是在要缩放到的层的限制内的自定义 databases 数,则将保留此 databases 设置并且不会丢失数据。
    • 如果使用的是超出新层限制的自定义 databases 数,则 databases 设置将降低到新层的限制,并且已删除数据库中的所有数据都将丢失。
  • 缩放到的定价层的 databases 限制等于或高于当前层时,会保留 databases 设置并且不会丢失数据。

虽然标准、高级、Enterprise 和 Enterprise Flash 缓存具有面向可用性的 SLA,但没有数据丢失方面的 SLA。

在缩放过程中,缓存是否可用?

  • 在缩放操作期间,标准高级EnterpriseEnterprise Flash 缓存仍然可用。 但在缩放这些缓存时,以及从基本缓存缩放到标准缓存时,可能会遇到连接问题。 这些连接故障预期为小故障,Redis 客户端通常可以立即重新建立连接。
  • 对于使用活动异地复制的 Enterprise 和 Enterprise Flash 缓存,在某些情况下,仅缩放一部分链接缓存可能会随时间推移而引发问题。 建议尽可能一起缩放异地复制组中的所有缓存。
  • 基本缓存在缩放为不同大小的操作期间处于脱机状态。 基本缓存在从“基本”缩放到“标准”时仍然可用,但可能会出现较小的连接故障。 如果发生连接故障,Redis 客户端通常可以立即重新建立连接。

异地复制是否存在缩放限制?

在配置了被动异地复制的情况下,你可能会注意到无法缩放缓存或更改群集中的分片。 两个缓存之间的异地复制链接会阻止你执行缩放操作或更改群集中的分片数。 若要发布这些命令,必须取消链接缓存。 有关详细信息,请参阅配置异地复制

在配置了活动异地复制的情况,将会无法缩放缓存。 异地复制组中的所有缓存的大小和容量必须相同。

不支持的操作

  • 不能从较高的定价层缩放到较低的定价层。
    • 不能从高级缓存向下缩放到标准基本缓存。
    • 不能从标准缓存向下缩放到基本缓存。
  • 可从基本缓存缩放到标准缓存,但不能同时更改大小。 以后如果需要不同的大小,可以执行缩放操作以缩放为所需大小。
  • 不能从基本缓存直接缩放到高级缓存。 首先在一个缩放操作中从“基本”缩放到“标准”,然后在之后的一个操作中从“标准”缩放到“高级” 。
  • 无法从高级 缓存缩放到 EnterpriseEnterprise Flash 缓存。
  • 不能从较大的大小减小为 C0 (250 MB)

如果缩放操作失败,该服务将尝试还原操作并且缓存将还原为原始大小。

缩放需要多长时间?

缩放时间取决于几个因素。 下面是一些可能会影响缩放时间的因素。

  • 数据量:量较大的数据需要较长的时间进行复制
  • 高写入请求:写入次数越多,意味着跨节点或分片的数据复制越多
  • 高服务器负载:较高的服务器负载意味着 Redis 服务器繁忙,可用于完成数据重新分发的 CPU 周期有限

缩放缓存是重要操作,可能需要很长时间。

根据实际示例,使用一到两个分片缩放缓存的时间可以是 1 到 2 小时,因为缓存未处于繁重负载。如果有更多的分片,缩放时间不会以线性方式增加。

如何判断缩放何时完成?

在 Azure 门户中可以看到进行中的缩放操作。 缩放完成后,缓存状态将更改为正在运行

使用群集功能时,是否需要对客户端应用程序进行更改?

重要

使用 Enterprise 或 Enterprise FLash 层时,可以选择 OSS 群集模式Enterprise 群集模式。 OSS 群集模式与高级层上的聚类分析相同,并遵循开放源代码聚类分析规范。 Enterprise 群集模式的性能可能较低,但使用的是无需任何客户端更改即可使用的 Redis Enterprise 聚类分析。 有关详细信息,请参阅群集

密钥在群集中是如何分布的?

按照关于密钥分布模型的 Redis 文档:密钥空间会拆分为 16,384 个槽。 每个密钥都经过哈希处理并分配到其中一个槽,这些槽分布在群集的节点中。 对密钥的哪部分进行哈希处理是可以配置的,这样可确保多个使用哈希标记的密钥位于同一分片。

  • 使用哈希标记的密钥 - 如果将密钥的任意部分括在 {} 中,则只会对密钥的该部分进行哈希处理,以便确定密钥的哈希槽。 例如,以下 3 个密钥将位于同一分片中:{key}1{key}2{key}3,因为只对名称的 key 部分进行了哈希处理。 如需密钥哈希标记规范的完整列表,请参阅 密钥哈希标记
  • 不带哈希标记的密钥 - 将使用整个密钥名称进行哈希处理,从而让缓存在分片之间均匀分布(从统计角度)。

为了优化性能和吞吐量,建议将密钥平均分布。 如果使用带哈希标记的密钥,则应用程序会负责确保密钥平均分布。

有关详细信息,请参阅 Keys distribution mode(密钥分布模型)、Redis Cluster data sharding(Redis 群集数据分片)和 Keys hash tags(密钥哈希标记)。

有关在 StackExchange.Redis 客户端中使用群集和查找同一分片中的密钥的示例代码,请参阅 Hello World 示例的 clustering.cs 部分。

可以创建的最大缓存大小是多大?

可以具有的最大缓存大小为 4.5 TB。 此结果是容量为 9 的群集 F1500 缓存。 有关详细信息,请参阅 Azure Redis 缓存定价

是否所有 Redis 客户端都支持群集功能?

很多(但并非全部)客户端库都支持 Redis 群集。 查看文档,找到你正在使用的库,确认你正在使用的库和版本是否支持群集。 StackExchange.Redis 是一个库,它在更新的版本中确实支持群集。 有关其他客户端的详细信息,请参阅 Redis cluster tutorial(Redis 群集教程)的 Playing with the cluster(操作群集)部分。

Redis 群集协议要求每个客户端以群集模式直接连接到每个分片,并且还定义了新的错误响应,例如 MOVEDCROSSSLOTS。 如果你要尝试使用的客户端库不支持群集但包含群集模式缓存,则结果可能造成很多 MOVED 重定向异常,如果你正在执行横向槽多密钥请求,则会中断你的应用程序。

注意

如果使用 StackExchange.Redis 作为客户端,请验证所使用的是否为 StackExchange.Redis 1.0.481 最新版本或更高版本,以便群集正确工作。 要详细了解出现 move 异常的任何问题,请参阅 move 异常

启用群集功能后,如何连接到缓存?

连接到缓存时,可以使用的终结点端口密钥与你连接到未启用群集功能的缓存时使用的相同。 Redis 在后端管理群集功能,因此不需要你通过客户端来管理它。

可以直接连接到缓存的各个分片吗?

群集协议要求客户端建立正确的分片连接,以便客户端应为你建立共享连接。 话虽如此,但每个分片都是由主/副缓存对组成的,该缓存对统称为缓存实例。 可以在 GitHub 上通过 Redis 存储库的不稳定分支使用 Redis-CLI 实用程序连接到这些缓存实例。 使用 -c 开关启动后,此版本可实现基本的支持。 有关详细信息,请参阅 https://redis.ioRedis cluster tutorial(Redis 群集教程)中的操作群集

需要使用 -p 开关来指定要连接到的正确端口。 使用 CLUSTER NODES 命令来确定用于主节点和副本节点的确切端口。 使用以下端口范围:

  • 对于非 TLS 高级层缓存,端口在 130XX 范围内可用
  • 对于已启用 TLS 的高级层缓存,端口在 150XX 范围内可用
  • 对于使用 OSS 聚类分析的 Enterprise 和 Enterprise Flash 缓存,将会通过端口 10000 建立初始连接。 可以使用 85XX 范围内的端口连接到单个节点。 85xx 端口会随时间而更改,因此不应将其硬编码到应用程序中。

可以为以前创建的缓存配置群集功能吗?

是的。 首先,请确保缓存为高级缓存(通过纵向扩展缓存)。 接下来,应该能够看到群集配置选项,包括用于启用群集的选项。 在创建缓存或首次启用群集功能后更改群集大小。

重要

无法撤消启用群集功能。 启用了群集功能且只有一个分片的缓存的行为与没有群集功能的相同大小缓存的行为不同

所有 Enterprise 和 Enterprise Flash 层缓存始终处于群集状态。

可以为基本缓存或标准缓存配置群集功能吗?

群集仅适用于高级、Enterprise 和 Enterprise Flash 缓存。

能否在 Redis ASP.NET 会话状态和输出缓存提供程序中使用群集功能?

  • Redis 输出缓存提供程序 - 无需进行更改。
  • Redis 会话状态提供程序 - 若要使用群集功能,必须使用 RedisSessionStateProvider 2.0.1 或更高版本,否则会引发异常,这是一项重大更改。 有关详细信息,请参阅 v2.0.0 重大更改详细信息

我在使用 StackExchange.Redis 和群集功能时出现 MOVE 异常,应该怎么办?

如果使用的是 StackExchange.Redis 并在使用群集功能时收到 MOVE 异常,请确保使用的是 StackExchange.Redis 1.1.603 或更高版本。 有关如何配置 .NET 应用程序以使用 StackExchange.Redis 的说明,请参阅配置缓存客户端

OSS 群集和 Enterprise 层缓存上的 Enterprise 群集有何区别?

OSS 群集模式与高级层上的聚类分析相同,并遵循开放源代码聚类分析规范。 Enterprise 群集模式的性能可能较低,但使用的是无需任何客户端更改即可使用的 Redis Enterprise 聚类分析。 有关详细信息,请参阅群集

Enterprise 层缓存使用多少个分片?

与基本层、标准层和高级层缓存不同,Enterprise 和 Enterprise Flash 缓存可以在单个节点上利用多个分片。 有关详细信息,请参阅分片配置

后续步骤