背景
我实现了一个redis客户端(支持集群),并且提出了redis集群支持分布式锁的问题。
我读过红锁算法和相关辩论的帖子
问题
实际上,不可能将一个密钥散列到redis集群中的不同节点,并且很难在特定规则中生成密钥并确保它们不会在集群中迁移。在最坏的情况下,所有密钥槽可能都存在于一个节点中。然后可用性将与一个节点中的一个密钥相同。
我的算法
我的解决方案是利用READONLY
从属模式来确保锁定密钥从主控同步到其 N/2 + 1 个从属,以避免故障转移问题。既然是单键解决方案,迁移问题也无所谓。
- 随机令牌 +
SETNX
+ 获取集群主节点锁的过期时间 - 如果获取锁成功则使用
READONLY
模式检查从节点(可能有N个从节点)中的锁,如果N/2+1同步成功则中断检查并返回True - 使用 redlock 算法中描述的 lua 脚本向拥有随机生成令牌的客户端释放锁,如果客户端崩溃,则等待锁密钥过期。
你能帮我看看算法是否错误吗?我已经考虑了几个关于它的极端案例,但我仍然不太确定。