首页 > 数据库 > 数据库开发技术 > 企业级高可用分布式锁剖析




请求锁(Request Lock):
流程开始于一个请求锁的操作(绿色椭圆形框)。
竞争锁(Compete Lock):
成功(Success):如果成功,则进入下一步“开启自动续租任务”(Start Automatic Lease Renewal Task)。
失败(Fail):如果竞争锁失败,则进入判断失败原因的环节。
进行锁竞争操作(菱形判断框)。根据竞争锁的结果,有两种可能:
开启自动续租任务(Start Automatic Lease Renewal Task):
如果锁竞争成功,则开启自动续租任务。
自动续租任务过程中,有一个 1/3 过期循环续租的操作。
失败原因判断(Determine Failure Reason):
锁异常,抢锁失败(Lock Exception, Lock Grabbing Failure):判断锁是否异常或者抢锁失败。
如果是,则进入“是否重试”环节。
如果不是,则进入“异常结束”(Red Rectangle: Abnormal Termination)。
如果锁竞争失败,需要判断失败原因(菱形判断框):
是否重试(Retry or Not):
是(Yes):如果需要重试,则继续判断是否超时。
否(No):如果不需要重试,则进入“结束”(Yellow Rectangle: End)。
如果锁异常或抢锁失败,判断是否需要重试(菱形判断框)。
是否超时(Timeout or Not):
超时(Timeout):如果超时,则进入“结束”(Yellow Rectangle: End)。
不超时(Not Timeout):如果不超时,则返回“竞争锁”步骤,重新进行锁竞争。
如果需要重试,判断是否超时(菱形判断框):
结束(End):
流程结束(绿色或黄色矩形框),根据不同的结束条件,可能是成功的结束或是异常结束。


请求锁(Request Lock):
流程开始于一个请求锁的操作(绿色椭圆形框)。
判断etcd集群client是否存在:
存在(Exists):如果存在,则继续根据负载均衡算法建立etcd连接。
不存在(Not Exists):如果不存在,则加载etcd集群建立client并进行节点心跳task。
判断etcd集群的client是否存在(菱形判断框)。
加载etcd集群建立client:
加载etcd集群并建立client连接。
建立节点心跳task:
建立一个节点心跳任务以确保节点的活跃性。
连接所有活跃节点、重连失联节点:
尝试连接所有活跃节点并重连失联节点(10秒循环)。
进入可用节点列表:
可用(Available):如果节点可用,则继续根据负载均衡算法建立etcd连接。
不可用(Not Available):如果节点不可用,则进入不可用节点列表并返回重连步骤。
进入可用节点列表。
判断节点是否可用(菱形判断框):
根据负载均衡算法建立etcd连接:
根据负载均衡算法建立etcd连接。
竞争锁(Compete Lock):
成功(Success):如果成功,则进入下一步“开启自动续租任务”(Start Automatic Lease Renewal Task)。
失败(Fail):如果竞争锁失败,则进入判断失败原因的环节。
进行锁竞争操作(菱形判断框)。根据竞争锁的结果,有两种可能:
开启自动续租任务:
如果锁竞争成功,则开启自动续租任务。
自动续租任务过程中,有一个1/3过期循环续租的操作。
失败原因判断:
锁异常,抢锁失败(Lock Exception, Lock Grabbing Failure):判断锁是否异常或者抢锁失败。
如果是,则进入“是否重试”环节。
如果不是,则进入“异常结束”。
如果锁竞争失败,需要判断失败原因(菱形判断框):
是否重试(Retry or Not):
是(Yes):如果需要重试,则继续判断是否超时。
否(No):如果不需要重试,则进入“结束”(Yellow Rectangle: End)。
如果锁异常或抢锁失败,判断是否需要重试(菱形判断框)。
是否超时:
超时(Timeout):如果超时,则进入“结束”(Yellow Rectangle: End)。
不超时(Not Timeout):如果不超时,则返回“竞争锁”步骤,重新进行锁竞争。
如果需要重试,判断是否超时(菱形判断框):
结束:
流程结束(绿色或黄色矩形框),根据不同的结束条件,可能是成功的结束或是异常结束。









原文作者:二进制跳动;如有侵权,请联系管理员删除。