3

背景

我实现了一个redis客户端(支持集群),并且提出了redis集群支持分布式锁的问题。

我读过红锁算法和相关辩论的帖子

问题

实际上,不可能将一个密钥散列到redis集群中的不同节点,并且很难在特定规则中生成密钥并确保它们不会在集群中迁移。在最坏的情况下,所有密钥槽可能都存在于一个节点中。然后可用性将与一个节点中的一个密钥相同。

我的算法

我的解决方案是利用READONLY从属模式来确保锁定密钥从主控同步到其 N/2 + 1 个从属,以避免故障转移问题。既然是单键解决方案,迁移问题也无所谓。

  1. 随机令牌 + SETNX+ 获取集群主节点锁的过期时间
  2. 如果获取锁成功则使用READONLY模式检查从节点(可能有N个从节点)中的锁,如果N/2+1同步成功则中断检查并返回True
  3. 使用 redlock 算法中描述的 lua 脚本向拥有随机生成令牌的客户端释放锁,如果客户端崩溃,则等待锁密钥过期。

你能帮我看看算法是否错误吗?我已经考虑了几个关于它的极端案例,但我仍然不太确定。

4

0 回答 0