美文网首页
【redis】基于Redis的分布式锁到底安全吗?

【redis】基于Redis的分布式锁到底安全吗?

作者: Bogon | 来源:发表于2023-09-15 23:30 被阅读0次

关于 Redis 分布式锁可靠性的问题。

使用单个 Redis 节点(只有一个master)使用分布锁,如果实例宕机,那么无法进行锁操作了。那么采用主从集群模式部署是否可以保证锁的可靠性?

答案是也很难保证。
如果在 master 上加锁成功,此时 master 宕机,由于主从复制是异步的,加锁操作的命令还未同步到 slave,此时主从切换,新 master 节点依旧会丢失该锁,对业务来说相当于锁失效了。

所以 Redis 作者才提出基于多个 Redis 节点(master节点)的 Redlock 算法,但这个算法涉及的细节很多,作者在提出这个算法时,业界的分布式系统专家还与 Redis 作者发生过一场争论,来评估这个算法的可靠性,争论的细节都是关于异常情况可能导致 Redlock 失效的场景,例如加锁过程中客户端发生了阻塞、机器时钟发生跳跃等等。

简单总结,基于 Redis 使用分布锁的注意点:

1、使用 SET $lock_key $unique_val EX $second NX 命令保证加锁原子性,并为锁设置过期时间

2、锁的过期时间要提前评估好,要大于操作共享资源的时间

3、每个线程加锁时设置随机值,释放锁时判断是否和加锁设置的值一致,防止自己的锁被别人释放

4、释放锁时使用 Lua 脚本,保证操作的原子性

5、基于多个节点的 Redlock,加锁时超过半数节点操作成功,并且获取锁的耗时没有超过锁的有效时间才算加锁成功

6、Redlock 释放锁时,要对所有节点释放(即使某个节点加锁失败了),因为加锁时可能发生服务端加锁成功,由于网络问题,给客户端回复网络包失败的情况,所以需要把所有节点可能存的锁都释放掉

7、使用 Redlock 时要避免机器时钟发生跳跃,需要运维来保证,对运维有一定要求,否则可能会导致 Redlock 失效。例如共 3 个节点,线程 A 操作 2 个节点加锁成功,但其中 1 个节点机器时钟发生跳跃,锁提前过期,线程 B 正好在另外 2 个节点也加锁成功,此时 Redlock 相当于失效了(Redis 作者和分布式系统专家争论的重要点就在这)

8、如果为了效率,使用基于单个 Redis 节点的分布式锁即可,此方案缺点是允许锁偶尔失效,优点是简单效率高

9、如果是为了正确性,业务对于结果要求非常严格,建议使用 Redlock,但缺点是使用比较重,部署成本高

参考

分布式领域
http://zhangtielei.com/posts/distributed_system.html

基于Redis的分布式锁到底安全吗(上)?
http://zhangtielei.com/posts/blog-redlock-reasoning.html

基于Redis的分布式锁到底安全吗(下)?
http://zhangtielei.com/posts/blog-redlock-reasoning-part2.html

相关文章

网友评论

      本文标题:【redis】基于Redis的分布式锁到底安全吗?

      本文链接:https://www.haomeiwen.com/subject/ksnusdtx.html