【问题标题】:Is it possible to configure number of slots in a Redis cluster? (cluster mode enabled)是否可以在 Redis 集群中配置插槽数? (启用集群模式)
【发布时间】:2021-07-12 02:06:20
【问题描述】:

根据 Redis 集群specification,一个 Redis 集群有 16384 个插槽。我想知道是否有人成功尝试配置 Redis 集群以使用不同数量的插槽。

我的问题是:我有一个由集群模式 Redis 集群支持的应用程序。应用程序向 Redis 发送许多多获取操作(使用 MGET 命令)。在集群模式下,MGET 只支持属于同一个 slot 的 key,所以传入 multi-get 操作的 key 需要按 slot 分组,每个涉及的 slot 下发一个 MGET 命令。

MGET 中涉及的键数总是远少于 16384 个,最坏的情况是 ~2000 个键,这意味着大多数多获取操作最终会产生数百个 MGET 命令,每个命令只有一个键。

对于同一节点上的插槽,我可以通过管道传输多个 MGET 以提高性能。但是我一直想知道是否可以通过配置一个低得多的插槽号来完全避免这个问题。

例如,如果 slot 的数量是 128,使用包含 1024 个 key 的 multi-get 操作(假设这些 key 完全均匀地分布在 128 个 slot 上),最终将得到 128 个 MGET 命令,每个命令有 8 个 key。

如果我按节点对它们进行分组并将它们流水线化,我认为性能会比使用 16384 个槽更好(1024 个完全均匀分布的键将导致 1024 个 MGET 命令,每个都具有单个键)

【问题讨论】:

  • Redis(包括集群模式)是开源的github.com/redis/redis。您可以直接提取代码并制作自己的版本。

标签: redis redis-cluster


【解决方案1】:

正如@sazzad 所说,插槽数在 Redis 中是硬编码的(请参阅cluster.h:#define CLUSTER_SLOTS)。除了修改和重新编译 Redis 之外,它不能通过任何方式进行更改(我也不建议使用这种未经测试的构建)。

至于问题本身,您是在优化一些真实的东西还是只是为了好玩?尽管MGETGETs 更有效,但只要您负责任地流水线批处理,差异通常并不重要。集群清楚地表明它是 Redis 的一个子集,因此多键操作的行为不同。另一方面,在集群中挤压更多性能的方法是添加节点并分散负载。

【讨论】:

  • 感谢您回复我。从我读过的内容来看,它似乎是硬编码的,无法配置。我希望能够调整参数以提高性能。理想情况下,应该使用与 MGET 请求中的平均密钥数相当的插槽大小来实现最大性能。
猜你喜欢
  • 2018-05-03
  • 2016-05-22
  • 2017-06-17
  • 1970-01-01
  • 2019-08-09
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
相关资源
最近更新 更多