在启用集群模式的情况下批量上传到 Elasticache 时,redis-cli --pipe 会产生 MOVED 错误
redis-cli --pipe yields MOVED errors when bulk uploading to Elasticache with cluster-mode enabled
我正在尝试使用 redis-cli --pipe 将一些命令批量上传到我的 AWS Elasticache for redis 集群。这些命令来自通过自定义 awk
命令解析文件,这有助于生成一些 HSET
命令。 awk
命令在自定义 shell 脚本中。当我的用于 Redis 服务器的 Elasticache 禁用了集群模式时,执行以下类似的操作就像一个魅力:
sh script_containing_awk.sh $FILE_TO_PARSE | redis-cli -h <Primary_endpoint> -p <port> --tls --cacert <path/to/cert> --pipe
由于内部项目要求,已在启用集群模式的情况下重新创建了用于 Redis 服务器的 Elasticache,因此我将 -c
标志添加到上述命令中以进行指定。
在启用集群模式的情况下尝试使用我的 Elasticache for Redis 服务器时,我看到了以下结果:
- 我可以通过配置端点连接到集群没问题!
- 单个命令上传工作(即:
redis-cli -h <config_endpoint> -p <port> -c --tls --cacert <path/to/certs> SET key value
)
将脚本的输出通过管道传输到 cli 会非常方便:
sh script_containing_awk.sh $FILE_TO_PARSE | redis-cli -h <config_endpoint> -p <port> -c --tls --cacert <path/to/cert> --pipe
但添加 --pipe
标志会导致“MOVED”错误。
我已经尝试修改脚本以包含 {}
(例如:HSET {user1}:hash field1 val1 field2 val2 ...
括号以尝试将键强制到相同的 CLUSTER SLOTS,但我仍然收到“MOVED”错误并且我试图批量上传数百万个密钥,所以我不认为它们都适合同一个插槽。
有没有人有过 --pipe
启用集群模式 Redis/Elasticache 的经验?
谢谢!
我相信您了解禁用集群模式和启用集群模式之间的核心区别在于您的总密钥槽存在差异。
只是放在上下文中;
CMD - 假设我们有 4 个节点集群,其中 1 个主节点和 3 个副本节点。
如果我们有 100 个键槽 -
所有 100 个密钥槽都将存在于所有节点中。其中 3 个将提供只读命令,1 个节点将提供所有命令。
CME - 假设我们有 4 个节点分成 2 个分片 - 每个节点 1 个副本和 1 个主节点。
我们可以将它们视为合乎逻辑的 sub-clusters 即。他们会有不同的 key-slots 组。理想情况下是 50-50 的比例。
现在,MOVED 消息不一定是错误。
当您连接到配置端点时,默认情况下您将连接到其中一个主要节点(首先随机选择)。
当您发出命令时,客户端发送该命令,主节点决定它是否具有正确的 hash-slot 来提供该命令。
如 here 所述,如果节点没有您的客户端正在寻找的 hash-slot,它将使用 MOVED 消息重定向您。
所以,我假设 MOVED 消息在某种程度上与 CME 集群有关。
我正在尝试使用 redis-cli --pipe 将一些命令批量上传到我的 AWS Elasticache for redis 集群。这些命令来自通过自定义 awk
命令解析文件,这有助于生成一些 HSET
命令。 awk
命令在自定义 shell 脚本中。当我的用于 Redis 服务器的 Elasticache 禁用了集群模式时,执行以下类似的操作就像一个魅力:
sh script_containing_awk.sh $FILE_TO_PARSE | redis-cli -h <Primary_endpoint> -p <port> --tls --cacert <path/to/cert> --pipe
由于内部项目要求,已在启用集群模式的情况下重新创建了用于 Redis 服务器的 Elasticache,因此我将 -c
标志添加到上述命令中以进行指定。
在启用集群模式的情况下尝试使用我的 Elasticache for Redis 服务器时,我看到了以下结果:
- 我可以通过配置端点连接到集群没问题!
- 单个命令上传工作(即:
redis-cli -h <config_endpoint> -p <port> -c --tls --cacert <path/to/certs> SET key value
)
将脚本的输出通过管道传输到 cli 会非常方便:
sh script_containing_awk.sh $FILE_TO_PARSE | redis-cli -h <config_endpoint> -p <port> -c --tls --cacert <path/to/cert> --pipe
但添加 --pipe
标志会导致“MOVED”错误。
我已经尝试修改脚本以包含 {}
(例如:HSET {user1}:hash field1 val1 field2 val2 ...
括号以尝试将键强制到相同的 CLUSTER SLOTS,但我仍然收到“MOVED”错误并且我试图批量上传数百万个密钥,所以我不认为它们都适合同一个插槽。
有没有人有过 --pipe
启用集群模式 Redis/Elasticache 的经验?
谢谢!
我相信您了解禁用集群模式和启用集群模式之间的核心区别在于您的总密钥槽存在差异。
只是放在上下文中; CMD - 假设我们有 4 个节点集群,其中 1 个主节点和 3 个副本节点。 如果我们有 100 个键槽 - 所有 100 个密钥槽都将存在于所有节点中。其中 3 个将提供只读命令,1 个节点将提供所有命令。
CME - 假设我们有 4 个节点分成 2 个分片 - 每个节点 1 个副本和 1 个主节点。 我们可以将它们视为合乎逻辑的 sub-clusters 即。他们会有不同的 key-slots 组。理想情况下是 50-50 的比例。
现在,MOVED 消息不一定是错误。 当您连接到配置端点时,默认情况下您将连接到其中一个主要节点(首先随机选择)。 当您发出命令时,客户端发送该命令,主节点决定它是否具有正确的 hash-slot 来提供该命令。
如 here 所述,如果节点没有您的客户端正在寻找的 hash-slot,它将使用 MOVED 消息重定向您。
所以,我假设 MOVED 消息在某种程度上与 CME 集群有关。