基于数据库的分布式锁设计
所属分类 architecture
浏览量 1397
lock表 设计
lock_id varchar(128) PK
create_time timestamp notNull 创建时间
update_time timestamp notNull 最后更新时间 持有者 定时心跳 更新该字段为数据库当前时间
version long 乐观锁 版本号 避免并发更新问题
node_id varchar(128) notNull 持有节点id 应用启动后 生成 ip + 随机字符串
now_time timestamp 该字段不存储,查询时 直接取数据库当前时间
统一使用 数据库时间,避免 集群各节点 时间不一致
锁记录不存在时 , Insert成功的节点 成功获取锁
锁记录存在 , 且锁超时 , 开始争抢锁
使用乐观锁 update , 更新成功的节点 成功获取锁
update lock_table set node_id=? , update_time = now() ,version=version+1 where version=?
可以把 锁超时判断放在数据库里做,这样更安全
持有锁的节点定时发送心跳 ,更新 update_time
更新时带上 node_id 和 version 条件
update lock_table set update_time = now() ,version=version+1 where node_id=? and version=?
建议心跳时间 小于 锁超时时间 ,譬如心跳 5秒 锁超时 15秒或30秒
上一篇
下一篇
prometheus配置
linux下找出占用指定端口的进程
jvm设置滚动记录GC日志
prometheus集成grafana实现可视化
g1 GC 要点
四种引用及WeakHashMap介绍