为高级 Azure Cache for Redis 实例配置 Redis 群集功能

Azure Redis 缓存提供的 Redis 群集与 在 Redis 中实施的一样。 Redis 群集具有以下优势:

  • 能够在多个节点中自动拆分数据集。
  • 能够在部分节点遇到故障或无法与群集其余部分通信的情况下继续运行。
  • 更大的吞吐量:增加分片数时,吞吐量呈线性增加。
  • 更大的内存大小:增加分片数时,内存大小呈线性增加。

群集不会增加可用于群集缓存的连接数。 有关高级缓存大小、吞吐量和带宽的详细信息,请参阅选择正确的层

在 Azure 中,Redis 群集以主/副模型提供。在该模型中,每个分片都有一个带副本的主/副对,副本由 Azure Redis 缓存服务管理。

设置群集功能

在创建缓存期间,在左侧的“新建 Azure Cache for Redis”中启用群集。

  1. 若要创建高级缓存,请登录到 Azure 门户并选择“创建资源”。 除了在 Azure 门户中创建缓存以外,也可以使用 Resource Manager 模板、PowerShell 或 Azure CLI 创建。 有关创建 Azure Redis 缓存的详细信息,请参阅创建缓存

    Create resource.

  2. 在“新建”页上选择“数据库”,然后选择“Azure Cache for Redis”。

    Select Azure Cache for Redis.

  3. 在“新建 Redis 缓存”页上配置新高级缓存的设置。

    设置 建议的值 说明
    DNS 名称 输入任何全局唯一的名称。 缓存名称必须是介于 1 到 63 个字符之间的字符串。 字符串只能包含数字、字母或连字符。 该名称必须以数字或字母开头和结尾,且不能包含连续的连字符。 缓存实例的主机名是 <DNS name>.redis.cache.chinacloudapi.cn
    订阅 单击下拉箭头并选择你的订阅。 要在其下创建此新的 Azure Cache for Redis 实例的订阅。
    资源组 单击下拉箭头并选择一个资源组,或者选择“新建”并输入新的资源组名称。 要在其中创建缓存和其他资源的资源组的名称。 将所有应用资源放入一个资源组可以轻松地统一管理或删除这些资源。
    位置 单击下拉箭头并选择一个位置。 选择与要使用该缓存的其他服务靠近的区域
    缓存类型 单击下拉箭头并选择高级缓存来配置高级功能。 有关详细信息,请参阅 Azure Cache for Redis 定价 定价层决定可用于缓存的大小、性能和功能。 有关详细信息,请参阅用于 Redis 的 Azure 缓存概述
  4. 选择“网络”选项卡,或选择“网络”按钮(位于页面底部) 。

  5. 在“网络”选项卡中,选择你的连接方法。 对于高级缓存实例,可以通过公共 IP 地址或服务终结点进行公开连接,也可以通过专用终结点进行私密连接。

  6. 选择“下一步:高级”选项卡,或者选择页面底部的“下一步:高级”按钮 。

  7. 在高级缓存实例的“高级”选项卡中,配置非 TLS 端口、群集和数据暂留的设置。 若要选择群集,请选择“启用”。

    Clustering toggle.

    群集中最多可以有 10 个分片。 选择“启用”后,滑动滑块或者针对“分片计数”键入一个 1 到 10 之间的数字,并选择“确定”。

    每个分片都是一个由 Azure 管理的主/副缓存对,而缓存的总大小则通过将定价层中选择的缓存大小乘以分片数来计算。

    Clustering toggle selected.

    创建缓存后,连接到缓存,就像使用非群集缓存一样使用缓存。 Redis 在整个缓存分片中分发数据。 如果已启用诊断,则会为每个分片单独捕获度量值,这些度量值可在左侧的 Azure Cache for Redis 中查看

  8. 选择“下一步:标记”选项卡,或者选择“下一步:标记”按钮(位于页面底部)。

  9. 或者,在“标记”选项卡中,如果希望对资源分类,请输入名称或值。

  10. 选择“查看 + 创建” 。 随后你会转到“查看 + 创建”选项卡,Azure 将在此处验证配置。

  11. 显示绿色的“已通过验证”消息后,选择“创建”。

创建缓存需要花费片刻时间。 可以在 Azure Cache for Redis 的“概述”页上监视进度。 如果“状态”显示为“正在运行”,则表示该缓存可供使用。

注意

配置群集时,客户端应用程序中需要有一些细微的差别。 有关详细信息,请参阅使用群集功能时,是否需要对客户端应用程序进行更改?

有关在 StackExchange.Redis 客户端中使用群集功能的示例代码,请参阅 Hello World 示例的 clustering.cs 部分。

更改正在运行的高级缓存上的群集大小

若要更改正在运行并且已启用群集功能的高级缓存上的群集大小,请在“资源菜单”中选择“群集大小”。

Redis cluster size

若要更改群集大小,请使用滑块,或在“分片计数”文本框中键入 1 到 10 之间的数字。 然后选择“确定”以保存。

增加群集大小会增加最大吞吐量和缓存大小。 增加群集大小不会增加用于客户端的最大连接数据。

注意

缩放群集会运行 MIGRATE 命令,此命令需耗费大量资源,因此为使其影响最小,请考虑在非高峰时段运行此操作。 在迁移过程中,服务器负载将达到峰值。 缩放群集的运行过程耗时较长,所花费的时间量取决于密钥数以及与这些密钥相关联的值的大小。

群集功能常见问题

以下列表包含有关 Azure Redis 缓存群集功能的常见问题解答。

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

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

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

  • 使用哈希标记的密钥 - 如果将密钥的任意部分括在 {} 中,则只会对密钥的该部分进行哈希处理,以便确定密钥的哈希槽。 例如,以下 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 部分。

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

可以具有的最大缓存大小为 1.2 TB。 这会是包含 10 个分片的群集 P5 缓存。 有关详细信息,请参阅 Azure Redis 缓存定价

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

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

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

注意

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

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

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

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

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

对于非 TLS,请使用以下命令。

Redis-cli.exe -h <<cachename>> -p 13000 (to connect to instance 0)
Redis-cli.exe -h <<cachename>> -p 13001 (to connect to instance 1)
Redis-cli.exe -h <<cachename>> -p 13002 (to connect to instance 2)
...
Redis-cli.exe -h <<cachename>> -p 1300N (to connect to instance N)

对于 TLS,请将 1300N 替换为 1500N

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

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

重要

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

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

群集功能仅适用于高级缓存。

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

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

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

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

后续步骤

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