ITPub博客

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

企业级高可用分布式锁剖析

原创 数据库开发技术 作者:greencoatman 时间:2024-06-28 08:41:00 0 删除 编辑

  • 请求锁(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):如果不超时,则返回“竞争锁”步骤,重新进行锁竞争。

    • 如果需要重试,判断是否超时(菱形判断框):

  • 结束:

    • 流程结束(绿色或黄色矩形框),根据不同的结束条件,可能是成功的结束或是异常结束。




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

请登录后发表评论 登录
全部评论

注册时间:2022-07-08

  • 博文量
    312
  • 访问量
    141134