数据库集群

集群化允许客户将Redis进程的负载分散到多个核心和多台服务器的内存中。

源代码可用的Redis是一个单线程进程,以提供速度和简单性。单个Redis进程受限于其运行的CPU核心和服务器上的可用内存。

Redis 企业版软件支持数据库集群,允许客户将 Redis 进程的负载分散到多个核心和多台服务器的内存中。数据库集群是一组 Redis 进程,其中每个进程管理数据库键空间的一个子集。

Redis Enterprise集群的键空间被分割成数据库分片。 每个分片位于单个节点上,并由该节点管理。 Redis数据库集群中的每个节点可以管理多个分片。 分片中的键空间被划分为哈希槽。 键的槽由键名或键名的一部分的哈希值决定。

数据库集群对连接到数据库的Redis客户端是透明的。 Redis客户端通过一个单一的端点访问数据库,该端点自动将所有操作路由到相关的分片。 您可以将应用程序连接到单个Redis进程或集群数据库,而无需在应用程序逻辑上进行任何更改。

术语

在聚类中,这些术语通常被使用:

  • 标签或哈希标签 - 用于哈希计算的键的一部分。
  • 槽或哈希槽 - 哈希计算的结果。
  • Shard - 作为Redis集群数据库一部分的Redis进程。

何时使用聚类(分片)

集群是一种扩展Redis的有效方式,应在以下情况下使用:

  • 数据集足够大,可以从使用多个节点的RAM资源中受益。 当数据集超过25 GB(对于RoF为50 GB)时,我们建议您启用集群以创建数据库的多个分片 并将数据请求分散到各个节点。
  • 对数据库执行的操作是CPU密集型的,导致性能下降。 通过让多个CPU核心管理数据库的分片,操作负载被分配给它们。

分片数量

启用数据库集群时,您可以设置数据库分片的数量。每个数据库的最小分片数为2,最大分片数取决于您购买的订阅。

在启用数据库集群并设置分片数量后,您无法停用数据库集群或减少分片数量。您只能将分片数量增加到当前分片数量的倍数。例如,如果当前分片数量为3,您可以将分片数量增加到6、9或12。

支持的哈希策略

标准哈希策略

使用标准哈希策略时,集群化的Redis Enterprise数据库的行为与标准的Redis社区版集群类似,除了在键名中使用多个哈希标签时。我们建议在Redis Enterprise中进行哈希时,键名中仅使用单个哈希标签。

  • 带有哈希标签的键:键的哈希标签是键名中{}之间的任何子字符串。当键名包含模式{...}时,哈希标签被用作哈希函数的输入。

    例如,以下键名具有相同的哈希标签并映射到相同的哈希槽:foo{bar}{bar}bazfoo{bar}baz

  • 没有哈希标签的键:当键不包含{...}模式时,整个键的名称将用于哈希计算。

你可以使用哈希标签将相关的键存储在同一个哈希槽中,以便多键操作可以在这些键上运行。如果你不在键的名称中使用哈希标签,键将均匀分布在键空间的分片中。如果你的应用程序不执行多键操作,你不需要使用哈希标签。

自定义哈希策略

您可以为集群数据库配置自定义哈希策略。当需要将不同的键保持在同一分片上以允许多键操作时,需要自定义哈希策略。自定义哈希策略通过一组Perl兼容正则表达式(PCRE)规则提供,这些规则描述了数据集键名的模式。

要配置自定义哈希策略,请输入正则表达式(RegEx)规则,这些规则用于识别键名中的子字符串——哈希标签——哈希操作将在此标签上进行。哈希标签在正则表达式中通过使用名为`tag`的命名子模式来表示。具有相同哈希标签的不同键将被存储和管理在同一个槽中。

启用自定义哈希策略后,将实施以下默认的RegEx规则。请更新这些规则以适应您的特定逻辑:

正则表达式规则 描述
.*{(?.*)}.* 哈希是在大括号之间的子字符串上进行的。
(?.*) 整个键的名称用于哈希。

您可以修改现有规则、添加新规则、删除规则或更改它们的顺序,以适应您的应用程序需求。

自定义哈希策略注意事项和限制

  1. 您可以定义最多32个正则表达式规则,每个规则最多256个字符。
  2. 正则表达式规则按顺序评估,并且使用第一个匹配的规则。因此,您应该将常见的键名模式放在规则列表的开头。
  3. 不匹配任何正则表达式规则的键名会触发错误。
  4. '.*(?)' 正则表达式规则强制将键放入单个槽中,因为哈希键始终为空。因此,在使用时,这应该是最后的、捕获所有内容的规则。
  5. 正则表达式解析器中启用了以下标志: PCRE_ANCHORED:模式被限制为仅在搜索字符串的开头匹配。

更改哈希策略

集群数据库的哈希策略可以更改。然而,大多数哈希策略更改在应用之前会触发数据的删除(FLUSHDB)。

此类变化的示例包括:

  • 将哈希策略从标准更改为自定义,或者相反,从自定义更改为标准。
  • 更改自定义哈希策略规则的顺序。
  • 在自定义哈希策略中添加新规则。
  • 从自定义哈希策略中删除规则。
注意:
对于未启用更新或需要刷新数据库的情况, 建议的解决方法是备份数据库并将数据导入新配置的数据库。

多键操作

在集群数据库中对多个键的操作支持以下限制:

  • 多键命令: Redis 提供了几个接受多个键作为参数的命令。在集群数据库中,大多数多键命令不允许跨槽位执行。以下多键命令允许跨槽位执行:DEL, MSET, MGET, EXISTS, UNLINK, TOUCH

    在 Active-Active 数据库中,多键写命令(DEL, MSET, UNLINK)只能在同一个槽位中的键上运行。然而,以下多键命令在 Active-Active 数据库中允许跨槽位执行:MGET, EXISTS, 和 TOUCH。

    在集群数据库中,允许影响所有键或匹配指定模式的键的命令,例如:FLUSHDB, FLUSHALL, KEYS

    注意:
    在分片设置中使用这些命令时, 命令会分布在多个分片上, 并且所有分片的响应会合并为一个响应。
  • 地理命令: 对于GEORADIUSGEORADIUSBYMEMBER命令, STORE和STOREDIST选项只能在所有受影响的键 位于同一槽时使用。

  • 事务: 在WATCH / MULTI / EXEC块中的所有操作应在映射到同一槽的键上执行。

  • Lua脚本: Lua脚本中使用的所有键必须映射到同一个槽,并且必须作为参数提供给EVAL / EVALSHA命令(根据Redis规范)。在Lua脚本中使用未作为参数提供的键可能会违反分片概念,但不会返回适当的违规错误。

  • 重命名/复制键: 仅当键的原始值和新值映射到同一槽时,才允许使用 RENAME / RENAMENX / COPY 命令。

RATE THIS PAGE
Back to top ↑