我正在尝试使用redis-cli -管道将一些命令大容量上传到我的AWS Elasticache中,用于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标志添加到上面的命令中以指定为此。
在尝试使用启用集群模式的Redis服务器的Elasticache时,我看到了以下结果:
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标志会导致“移动”错误。
我尝试修改脚本以包含{} (例如:HSET {user1}:hash field1 val1 field2 val2 ...括号,试图将键强制放到同一个集群插槽中,但我仍然会得到“移动”错误,并且我正在尝试批量上传数百万个键,因此我认为它们都不适合放在同一个位置。
是否有人有经验让--pipe使用启用集群模式的Redis/Elasticache?
谢谢!
发布于 2022-04-29 13:16:30
我相信您理解禁用群集模式与启用群集模式之间的核心区别在于,您的总键槽中存在分裂。
仅在上下文中;CMD -假设我们有4个节点集群,其中包含1个主副本和3个副本。如果我们有100个密钥插槽-所有的100个密钥插槽将在所有节点中。其中3个为只读命令服务,1个节点为所有命令服务。
CME -假设我们有4个节点被分割成两个碎片-一个副本和一个主节点。我们可以把它们看作逻辑子类,即。他们将有不同的关键插槽。理想的情况是50比50的分裂。
现在,移动的消息不一定是一个错误。当您连接到配置端点时,默认情况下您将连接到一个主节点(最初是随机选择的)。当您发出命令时,客户端发送该命令,主节点决定它是否有正确的哈希槽来服务该命令。
正如解释过的这里一样,如果节点没有您的客户端正在寻找的散列槽,它将使用移动消息重定向您。
因此,我假设移动消息在CME集群中有一定的期望。
https://stackoverflow.com/questions/71785191
复制相似问题