如何在3.0.7上迁移redis集群中的大密钥?

时间:2016-11-04 05:42:37

标签: redis redis-cluster

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

有没有优雅的方法来迁移这些密钥?

1 个答案:

答案 0 :(得分:0)

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

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

enter image description here

我观察到RT增长迅速,密钥长度增加。详细地,对于具有10000个密钥和密钥10的大小的节点,RT是91.7ms,并且对于相同的节点和密钥长度24000,RT是1014.3ms。此外,要检索一个大小为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来设置这个阈值并观察" large"的含义。

您也可以查看:https://fnordig.de/2014/03/11/redis-cluster-with-pre-existing-data/