RedLock

本文深入探讨Redis分布式锁的实现方式,包括单实例正确实现及RedLock算法,分析故障切换方案的不足,阐述锁同步、性能指标及故障恢复机制,同时讨论锁续约机制的重要性。

Redis分布式锁:


1.采用单实例的正确实现

获取锁:
 SET name value NX PX 30000
 value必须在所有获取锁的客户端里面唯一. 这个值用来保证可以安全的释放锁
释放锁:
 redis.eval(传入lua脚本) 不使用del进行删除(删除时,因为超时已经自动释放了锁,所以删除了其他人的锁)
 
 
2.为什么基于故障切换的方案不够好?

    2.1 客户端A 在master节点获取到了锁
    2.2 master在把A 创建的key同步给slave之前宕机了.
    2.3 slave变成了master节点
    2.4 客户端B 也得到了和A持有的相同的锁.  (因为原来的slave还没有A持有锁的信息)

RedLock算法
获取锁:
    1. client得到本地时间. 
    2. 使用相同的key和唯一的value值. 按顺序在每个master上尝试获取锁. (设置快速失败时间)
    3. 获取锁的时间小于锁存活时间,并且在一半以上的master获取到锁认为client成功获取到了锁.
    4. 如果获得了锁,client执行任务时间窗口是  锁的存活时间减去获得锁消耗的时间.
    5. 如果获得锁数量不足一半,或者获取锁时间超时,认为获取锁失败. 
        客户端要尝试在所有的master 节点中释放锁,即时获取锁失败的master依然要进行释放操作
        

能保证锁同步吗?    
集群时间误差与锁超时时间相比较小.

失败重试机制.
如果无法获得锁,进行一个随机延迟后继续. 与其他申请同一个锁的client错开时间.        
    
    
    
使用redis作为锁服务主要优势是性能.
指标:
1. 加锁和释放锁的延迟.
2. 每秒可以进行多少加锁和解锁操作.

多路发送 减少通信延时.


故障恢复:
延时重启机制,等待一个锁周期后才能进行锁服务. 牺牲一部分可用性

可靠性:
锁续约机制.  如果客户端工作时间较短,可以设置小的工作时间加上锁续约机制. 续约次数做限制,防止key长时间不可用.
 

转载于:https://my.oschina.net/u/3674060/blog/3036852

03-25
### Redlock 分布式锁算法实现与原理 #### 1. 背景介绍 在分布式环境中,多个进程或线程可能需要访问共享资源。为了防止并发冲突并保持数据一致性,通常会引入一种称为 **分布式锁** 的机制。Redlock 是 Redis 提供的一种用于解决分布式环境下的锁管理方案。 #### 2. 基本概念 Redlock 算法的核心思想是利用 N 个独立的 Redis 主节点来提供高可用性和可靠性。它假设这些节点之间没有任何复制或其他显式的分布式协调协议[^4]。通过这种方式,即使部分节点发生故障,整个系统仍然能够正常工作。 #### 3. 获取锁的过程 以下是 Redlock 中获取锁的主要逻辑: - 客户端尝试按照固定的顺序依次向所有的 N 个 Redis Master 节点发送 `SET` 请求,请求参数为 `key_name`, `my_random_value`, `NX`, 和 `PX timeout`[^3]。 ```python import time, random def acquire_lock_with_redlock(client_list, resource, lock_validity_time, retry_delay=0.2, max_retries=3): majority = int(len(client_list) / 2) + 1 quorum_count = 0 start_time = time.time() for client in client_list: try: result = client.set(resource, str(random.randint(1000, 9999)), nx=True, px=lock_validity_time) if result is True: quorum_count += 1 if quorum_count >= majority: elapsed_time = (time.time() - start_time) * 1000 if elapsed_time < lock_validity_time / 2: return True else: release_lock(client_list, resource) return False except Exception as e: continue return False ``` 上述代码展示了如何在一个集群中申请锁,并验证是否成功获得多数派支持。如果未能满足条件,则立即释放已持有的锁实例。 #### 4. 锁的有效期设置 为了避免死锁情况的发生,在实际部署过程中还需要考虑锁超时问题。当某个服务持有锁的时间超过预定义的最大期限后自动解锁。这一步骤可以通过 Redis 自带的功能完成——即指定键值对存在时间为有限长度(单位:毫秒)。同时也可以借助外部定时器配合定期续租策略进一步增强健壮性[^2]。 #### 5. 故障处理机制 考虑到网络分区或者某些服务器突然掉线等情况可能导致原本合法拥有的锁变得非法,因此设计了一套完整的错误恢复流程。主要包括以下几个方面: - 如果发现当前实例无法继续维持其所有权状态,则主动放弃该资源控制权; - 对于其他竞争方而言,一旦检测到前任所有者的信号消失即可重新发起新一轮争夺过程直至胜利为止。 --- ### 总结 综上所述,Redlock 不仅简单易懂而且具备较强的容错能力,非常适合应用于现代微服务体系架构当中去保障跨机器间的数据同步需求。然而值得注意的是,尽管如此优秀的理论模型被广泛接受认可,但在极端条件下仍可能存在潜在风险,比如时钟偏差过大等问题可能会破坏原有的一致性约定[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值