使用 Azure 门户进行纵向扩展和缩减
要缩放缓存,请在 Azure 门户中浏览到缓存,并从“资源”菜单中选择“缩放”。
选择工作窗格中的定价层,然后选择“选择”。
当缓存缩放到新层级时,会显示“缩放 Redis 缓存”通知。
缩放完成后,状态将从正在缩放更改为正在运行。
注意
使用门户纵向扩展或缩减缓存时,maxmemory-reserved
和 maxfragmentationmemory-reserved
设置都会自动根据缓存大小按比例进行缩放。
例如,如果 maxmemory-reserved
在 6 GB 缓存上设置为 3 GB,并且你扩展到 12 GB 缓存,则在扩展期间这些设置会自动更新为 6 GB。
纵向缩减时,将发生相反的行为。
使用 PowerShell 纵向扩展和缩减
修改 Size
、Sku
属性后,可以通过 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-reserved
或 maxfragmentationmemory-reserved
。 只会遵循缩放更改。 你可以在缩放操作完成后更新这些内存设置。
创建使用聚类分析横向扩展的新缓存
在创建新 Azure Cache for Redis 时,会在从工作窗格创建缓存期间启用聚类分析。
使用创建开放源代码 Redis 缓存快速入门指南,以开始使用 Azure 门户创建新缓存。
在高级缓存实例的“高级”选项卡中,配置非 TLS 端口、聚类分析和数据持久化的设置。 若要选择群集,请选择“启用”。
群集中最多可以有 30 个分片。 选择“启用”后,滑动滑块或者针对“分片计数”键入一个 1 到 30 之间的数字,并选择“确定”。
每个分片都是由 Azure 管理的主/副本缓存对。 缓存的总大小是通过将在定价层中选择的缓存大小乘以分片数来计算的。
创建缓存后,可连接到缓存,并像使用非群集缓存一样使用它。 Redis 在整个缓存分片中分发数据。 如果已启用诊断,则会为每个分片单独捕获指标,并且可以使用“资源”菜单在 Azure Cache for Redis 中查看。
使用快速入门指南完成缓存的创建。
创建缓存需要花费片刻时间。 可以在 Azure Cache for Redis 的“概述”页上监视进度。 如果“状态”显示为“正在运行”,则表示该缓存可供使用。
有关在 StackExchange.Redis 客户端中使用群集功能的示例代码,请参阅 Hello World 示例的 clustering.cs 部分。
横向缩减或横向扩展正在运行的高级缓存
如果之前创建的高级缓存正在运行且已启用群集功能,若要更改它上面的群集大小,请在“资源菜单”中选择“群集大小”。
若要更改群集大小,请使用滑块,或在“分片计数”文本框中键入 1 到 30 之间的数字。 然后选择“确定”以保存。
增加群集大小会增加最大吞吐量和缓存大小。 增加群集大小不会增加用于客户端的最大连接数据。
使用 PowerShell 横向扩展和缩减
修改 ShardCount
属性后,可以通过 PowerShell 中使用 Set-AzRedisCache cmdlet 横向扩展 Azure Cache for Redis 实例。 以下示例演示了如何横向扩展名为 myCache
的缓存以使用三个分片(即按三倍进行横向扩展)
Set-AzRedisCache -ResourceGroupName myGroup -Name myCache -ShardCount 3
有关使用 PowerShell 进行缩放的详细信息,请参阅使用 PowerShell 缩放 Azure Redis 缓存。
使用 Azure CLI 进行横向扩展和缩减
要使用 Azure CLI 缩放 Azure Cache for Redis 实例,可调用 az redis update 命令,并使用 shard-count
属性。 以下示例演示了如何横向扩展名为 myCache
的缓存以使用三个分片(即按三倍进行横向扩展)。
az redis update --cluster-name myCache --resource-group myGroup --set shard-count=3
有关使用 Azure CLI 进行缩放的详细信息,请参阅更改现有 Azure Redis 缓存的设置。
注意
在以编程方式进行纵向扩展或缩减时(例如,使用 PowerShell 或 Azure CLI),将忽略更新请求中的任何 maxmemory-reserved
或 maxfragmentationmemory-reserved
。 只会遵循缩放更改。 你可以在缩放操作完成后更新这些内存设置。
注意
缩放群集会运行 MIGRATE 命令,而这是一个价格高昂的命令。 为了尽量减少影响,请考虑在非高峰时段运行此操作。 在迁移过程中,服务器负载会达到峰值。 缩放群集的运行过程耗时较长,所花费的时间量取决于密钥数以及与这些密钥相关联的值的大小。
关于缩放的常见问题
以下列表包含有关 Azure Redis 缓存缩放的常见问题的解答。
可以向上缩放到高级缓存,或在其中向下缩放吗?
- 不能从高级缓存向下缩放到基本或标准定价层。
- 可以从一个高级缓存定价层缩放到另一个高级缓存定价层。
- 不能从基本缓存直接缩放到高级缓存。 首先在一个缩放操作中从“基本”缩放到“标准”,然后在后续的缩放操作中从“标准”缩放到“高级”。
- 如果在创建高级缓存时启用了群集,则可以更改群集大小。 如果创建缓存时未启用群集功能,可以稍后进行配置。
缩放后,我是否需要更改缓存名称或访问密钥?
不需要,在缩放操作期间缓存名称和密钥不变。
缩放的工作原理?
- 将基本缓存缩放为不同大小时,将关闭该缓存,同时使用新的大小预配一个新缓存。 在此期间,缓存不可用,且缓存中的所有数据都将丢失。
- 将基本缓存缩放为标准缓存时,将预配副本缓存并将主缓存中的数据复制到副本缓存。 在缩放过程中,缓存仍然可用。
- 将“标准”、“高级”缓存缩放为不同的大小时,将关闭其中一个副本,同时将其重新预配为新的大小,将数据转移,然后另一个副本在进行重新预配前执行一次故障转移,类似于一个缓存节点发生故障时所发生的过程。
- 横向扩展群集缓存时,将预配新的分片并将其添加到 Redis 服务器群集中。 然后,数据跨所有分片重新进行切分。
- 在群集缓存中进行缩放时,首先对数据重新进行切分,然后针对所需的分片缩减群集大小。
- 在某些情况下(例如,缩放缓存或将缓存迁移到其他群集)时,缓存的基础 IP 地址可能会更改。 缓存的 DNS 记录会发生变化,并且对大多数应用程序是透明的。 但如果使用 IP 地址配置与缓存的连接、配置 NSG 或允许流量进入缓存的防火墙,则应用程序在 DNS 记录更新后的某个时间可能会遇到连接问题。
在缩放过程中是否会丢失缓存中的数据?
- 将基本缓存缩放为新的大小时,所有数据都会丢失,且在缩放操作期间缓存将不可用。
- 将基本缓存缩放为标准缓存时,通常将保留缓存中的数据。
- 将“标准”、“高级”缓存缩放为更大的大小时,通常会保留所有数据。 将标准缓存或高级缓存缩放为更小的大小时,如果数据大小在缓存被纵向缩减时超出了新的较小大小,数据可能会丢失。 如果缩小时数据丢失,则使用 allkeys lru 逐出策略逐出密钥。
缩放后是否可以使用高级层的所有功能?
否,某些功能只能在高级层中创建缓存时设置,无法在缩放后使用。
创建高级缓存后,无法添加这些功能:
- 虚拟网络注入
- 添加区域冗余
- 每个主数据库使用多个副本
若要使用这些功能中的任何一个,必须在高级层中创建新的缓存实例。
在缩放过程中,自定义数据库设置是否会受影响?
如果在缓存创建过程中为 databases
设置配置了自定义值,请记住,某些定价层具有不同的数据库限制。 以下是在这种情况下缩放时的一些注意事项:
- 缩放到的定价层的
databases
限制低于当前层时:
- 如果使用的是默认
databases
数(对于所有定价层来说为 16),则不会丢失数据。
- 如果使用的是在要缩放到的层的限制内的自定义
databases
数,则将保留此 databases
设置并且不会丢失数据。
- 如果使用的是超出新层限制的自定义
databases
数,则 databases
设置将降低到新层的限制,并且已删除数据库中的所有数据都将丢失。
- 缩放到的定价层的
databases
限制等于或高于当前层时,会保留 databases
设置并且不会丢失数据。
虽然“标准”、“高级”缓存具有可用性 SLA,但没有数据丢失方面的 SLA。
在缩放过程中,缓存是否可用?
- “标准”、“高级”缓存在缩放操作期间保持可用。 但在缩放这些缓存时,以及从基本缓存缩放到标准缓存时,可能会遇到连接问题。 这些连接故障预期为小故障,Redis 客户端通常可以立即重新建立连接。
- 基本缓存在缩放为不同大小的操作期间处于脱机状态。 基本缓存在从“基本”缩放到“标准”时仍然可用,但可能会出现较小的连接故障。 如果发生连接故障,Redis 客户端通常可以立即重新建立连接。
异地复制是否存在缩放限制?
在配置了被动异地复制的情况下,你可能会注意到无法缩放缓存或更改群集中的分片。 两个缓存之间的异地复制链接会阻止你执行缩放操作或更改群集中的分片数。 若要发布这些命令,必须取消链接缓存。 有关详细信息,请参阅配置异地复制。
不支持的操作
- 不能从较高的定价层缩放到较低的定价层。
- 不能从高级缓存向下缩放到标准或基本缓存。
- 不能从标准缓存向下缩放到基本缓存。
- 可从基本缓存缩放到标准缓存,但不能同时更改大小。 以后如果需要不同的大小,可以执行缩放操作以缩放为所需大小。
- 不能从基本缓存直接缩放到高级缓存。 首先在一个缩放操作中从“基本”缩放到“标准”,然后在之后的一个操作中从“标准”缩放到“高级”。
- 不能从较大的大小减小为 C0 (250 MB) 。
如果缩放操作失败,该服务将尝试还原操作并且缓存将还原为原始大小。
缩放需要多长时间?
缩放时间取决于几个因素。 下面是一些可能会影响缩放时间的因素。
- 数据量:量较大的数据需要较长的时间进行复制
- 高写入请求:写入次数越多,意味着跨节点或分片的数据复制越多
- 高服务器负载:较高的服务器负载意味着 Redis 服务器繁忙,可用于完成数据重新分发的 CPU 周期有限
通常,在没有数据的情况下扩展缓存时,大约需要 20 分钟。 对于群集缓存,在数据最少的情况下,每个分片的缩放大约需要 20 分钟。
如何判断缩放何时完成?
在 Azure 门户中可以看到进行中的缩放操作。 缩放完成后,缓存状态将更改为正在运行。
使用群集功能时,是否需要对客户端应用程序进行更改?
启用群集功能时,仅数据库 0 可用。 如果客户端应用程序使用多个数据库并尝试读取或写入零之外的其他数据库,则会引发以下异常:Unhandled Exception: StackExchange.Redis.RedisConnectionException: ProtocolFailure on GET --->
StackExchange.Redis.RedisCommandException: Multiple databases are not supported on this server; cannot switch to database: 6
有关详细信息,请参阅 Redis 群集规范 - 已实现子集。
如果使用的是 StackExchange.Redis,则必须使用 1.0.481 或更高版本。 连接到该缓存时,可以使用的终结点、端口和密钥与连接到禁用了群集功能的缓存时使用的相同。 唯一的区别是,所有读取和写入都必须在数据库 0 中进行。
其他客户端可能有不同的要求。 请参阅 是否所有 Redis 客户端都支持群集功能?
如果应用程序使用的多个密钥操作都在单个命令中成批执行,则所有密钥都必须位于同一分片。 若要查找同一分片中的密钥,请参阅密钥在群集中是如何分布的?
如果使用的是 Redis ASP.NET 会话状态提供程序,则必须使用 2.0.1 或更高版本。 请参阅 能否在 Redis ASP.NET 会话状态和输出缓存提供程序中使用群集功能?
密钥在群集中是如何分布的?
按照关于密钥分布模型的 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 群集协议要求每个客户端以群集模式直接连接到每个分片,并且还定义了新的错误响应,例如 MOVED
和 CROSSSLOTS
。 如果你要尝试使用的客户端库不支持群集但包含群集模式缓存,则结果可能造成很多 MOVED 重定向异常,如果你正在执行横向槽多密钥请求,则会中断你的应用程序。
启用群集功能后,如何连接到缓存?
连接到缓存时,可以使用的终结点、端口和密钥与你连接到未启用群集功能的缓存时使用的相同。 Redis 在后端管理群集功能,因此不需要你通过客户端来管理它。
可以直接连接到缓存的各个分片吗?
群集协议要求客户端建立正确的分片连接,以便客户端应为你建立共享连接。 话虽如此,但每个分片都是由主/副缓存对组成的,该缓存对统称为缓存实例。 可以在 GitHub 上通过 Redis 存储库的不稳定分支使用 Redis-CLI 实用程序连接到这些缓存实例。 使用 -c
开关启动后,此版本可实现基本的支持。 有关详细信息,请参阅 https://redis.io 上 Redis cluster tutorial(Redis 群集教程)中的操作群集。
需要使用 -p
开关来指定要连接到的正确端口。 使用 CLUSTER NODES 命令来确定用于主节点和副本节点的确切端口。 使用以下端口范围:
- 对于非 TLS 高级层缓存,端口在
130XX
范围内可用
- 对于已启用 TLS 的高级层缓存,端口在
150XX
范围内可用
是的。 首先,请确保缓存为高级缓存(通过纵向扩展缓存)。 接下来,应该能够看到群集配置选项,包括用于启用群集的选项。 在创建缓存或首次启用群集功能后更改群集大小。
重要
无法撤消启用群集功能。 启用了群集功能且只有一个分片的缓存的行为与没有群集功能的相同大小缓存的行为不同。
群集功能仅适用于高级缓存。
能否在 Redis ASP.NET 会话状态和输出缓存提供程序中使用群集功能?
我在使用 StackExchange.Redis 和群集功能时出现 MOVE 异常,应该怎么办?
如果使用的是 StackExchange.Redis 并在使用群集功能时收到 MOVE
异常,请确保使用的是 StackExchange.Redis 1.1.603 或更高版本。 有关如何配置 .NET 应用程序以使用 StackExchange.Redis 的说明,请参阅配置缓存客户端。
后续步骤