我想从现有的Redis群集中删除主节点。我尝试按照http://redis.io/topics/cluster-tutorial的说明操作,但无法关注。帮助??
答案 0 :(得分:0)
根据先前的答案,要删除主节点,该节点必须为空。这意味着我们必须flushall数据或将哈希槽迁移到另一个现有的母版。
但是正如redis reconfiguration和redis cluster resharding所说,在上一个答案的第5步之后可能需要添加其他步骤。
根据redis官方文档,适用于我的解决方案如下。这里的顺序很重要。
我们将拥有哈希槽当前所有权的节点称为源节点,并将要迁移目的地节点的节点称为。 >
对于每个插槽:
CLUSTER SETSLOT <slot> IMPORTING <source-node-id>
到目的地节点,将广告位设置为导入状态。CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>
到源节点以将广告位设置为正在迁移状态。使用CLUSTER GETKEYSINSLOT命令从源节点获取密钥,然后使用以下MIGRATE命令将其移至目标节点。
MIGRATE target_host target_port key target_database_id timeout
在Redis Cluster中,无需指定0以外的数据库,但是MIGRATE是通用命令,可用于不涉及Redis Cluster的其他任务。
CLUSTER SETSLOT <slot> NODE <destination-node-id>
,以便将插槽再次设置为正常状态。通常会将同一命令发送给所有其他节点,以避免等待新配置在集群中自然传播。这里也提供了一个简单的bash脚本示例:
source-ip:172.17.0.5
。来源ID:1f70a5107e0042a7d33a9efaf88dbdfecd78076a
destination-ip:172.17.0.4
。 destination-id:7e428bae84697a3882ecad19bd0d13ac7ee97d02
另一个主IP:172.17.0.7
for i in `seq 0 5460`; do
redis-cli -c -h 172.17.0.4 cluster setslot ${i} importing 1f70a5107e0042a7d33a9efaf88dbdfecd78076a
redis-cli -c -h 172.17.0.5 cluster setslot ${i} migrating 7e428bae84697a3882ecad19bd0d13ac7ee97d02
while true; do
key=`redis-cli -c -h 172.17.0.5 cluster getkeysinslot ${i} 1`
if [ "" = "$key" ]; then
echo "there are no key in this slot ${i}"
break
fi
redis-cli -h 172.17.0.5 migrate 172.17.0.4 6379 ${key} 0 5000
done
redis-cli -c -h 172.17.0.5 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
redis-cli -c -h 172.17.0.4 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
redis-cli -c -h 172.17.0.7 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
done
答案 1 :(得分:-1)
节点在删除之前应为空。因此,我们需要在删除节点之前移动数据和插槽。
按照以下步骤进行迁移:
连接目标节点:
群集public function onOpen(ConnectionInterface $conn) {
// ...
$this->players->append(new Player($conn, x, y));
}
(插槽号)导入(源节点ID)
连接到源节点:
群集setslot
(插槽号)迁移(目标节点ID)
迁移(目标IP)(目标端口)密钥(目标数据库)(超时)
连接目标节点:
setslot
(slot no)节点(dest节点)我们可以在循环中为所有插槽和键执行上述操作,然后删除源节点。