3

在 redis 3.0.7 版本上使用集群时出现问题,
在我们的集群中,存在很多巨大的键,一些键的条目数,其大小大到 500M 字节,已达到数百万。
现在我们想使用命令migrate来扩展集群,但是这个命令是同步的,这可能会导致源和目标节点阻塞。

有没有什么优雅的方式来迁移这些密钥?

4

1 回答 1

1

根据我的实验,响应时间(RT)随着密钥长度的增加而迅速增长。

在这个实验中,我的目的是观察响应时间 (RT) 如何根据密钥长度而变化。我创建了一个读取所有键并计算 RT 的 JavaScript 脚本。出于实验的目的,我在 node.js 中加载了 1000、5000 和 10000 个键。结果如下图所示。

在此处输入图像描述

我观察到 RT 增长迅速,密钥长度增加。具体来说,对于具有 10000 个密钥和密钥大小为 10 的节点,RT 为 91.7 毫秒,对于相同节点和密钥长度 24000,RT 为 1014.3 毫秒。此外,检索一个大小为 10 的单个键的 RT 为 0.0127,检索一个大小为 24000 的单个键的 RT 为 0.102。

因此,当批量加载和复制不可用时,您可以尝试使用 MIGRATE 一次迁移一个密钥。MIGRATE 命令以原子方式将密钥从源数据库传输到目标数据库。但这是一种破坏性操作,除非传递了 COPY 选项(COPY -- 不要从本地实例中删除密钥)。

从 Redis 3.0.6 开始,MIGRATE 支持一种新的批量迁移模式,该模式使用管道在实例之间迁移多个键,而不会产生往返时间延迟和使用单个 MIGRATE 调用移动每个键时的其他开销。

为了启用此表单,使用了 KEYS 选项,并将普通键参数设置为空字符串。实际的键名将在 KEYS 参数本身之后提供,如下例所示:

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

因此,总而言之,除了上述之外,没有任何优雅的方法可以将密钥从源迁移到目标。

一种可能的解决方案是隔离一个或多个节点中的“大”密钥,并设置有关密钥长度的阈值。如果密钥超过此阈值,则将密钥保留在当前节点中。如果没有,您可以在不同的节点或数据库中迁移。但是您必须进行一些实验才能设置此阈值并根据响应时间和可能的 SLA 观察“大”的含义。

你也可以检查这个:https ://fnordig.de/2014/03/11/redis-cluster-with-pre-existing-data/

于 2016-11-04T08:42:28.967 回答