一文带你轻松学会!分布式之分布式锁

1. 分布式锁

为了解决集群中多主机上不同线程之间的同步,需要在分布式系统中有类似于单主机下用于进程/线程同步的锁,也即分布式锁

1.1 基于MySQL

1.1.1 关键点

通过使用innodb提供的行锁来保证互斥性,来作为不同主机上线程的同步

1.1.2 可重入悲观锁实现

1)建表

create table if not exists lock_table(
    `id` int primary key ,
    `resource_name` varchar(10) ,
    `locker` varchar(20),
    `reentrant_cnt` int,
    `create_time` bigint(20),
    `update_time` bigint(20),
    unique key(resource_name))
    ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中resource_name也即资源的名称,locker代表上锁者,reentrant_cnt代表重入次数

2)上锁

假设client_1对资源a上锁,流程如下

select * from lock_table where resource_name = 'a' for update;

这里先检查是否存在a记录,如果

3)解锁

假设client_1对资源a解锁,流程如下

select * from lock_table where resource_name = 'a' for update;

这里先检查是否存在a记录,这里查到是自己的记录,如果cnt的值

1.1.3 优劣

1.2 基于 zookeeper

1.2.1 关键点

使用zookeeper的watch机制来满足互斥性

1)watch机制定义

类比于观察者模式,支持如下监听事件

后面的方法均为操作,可以指定标志位代表是否开启监听,对应于命令为加入-w参数get -w /root/...

2)watch机制使用流程

1.2.2 可重入悲观锁实现

1)上锁

假设client_1想要对资源resource_1上锁,流程如下

当注册的监听事件触发时,就代表上锁成功

上过锁的示例图如下

/root  ----> /locks  ----> resource_1 ----> /ip1_port1_readlock_reentrantcnt_lockcnt-000000
	  |             |                |
	  |             |                 ----> /ip2_port2_writelock_reentrantcnt_lockcnt-000001
	   ----> ...     ----> resource_2
	  |
	  |
	 ...

2)解锁

只需要删除对应路径下的节点即可

1.1.3 优劣

1.3 基于Redis

1.3.1 关键点

通过利用redis的缓存特性,主要为存取快及支持过期机制,来实现分布式锁

1.3.2 悲观锁实现

1)上锁

假设client_1想要对资源a上锁,流程如下

2)解锁

1.3.3 改进

上面方案存在如下问题

因而提出下面改进

展开阅读全文

页面更新:2024-05-13

标签:分布式   优容   节点   集群   线程   原子   解锁   客户端   次数   流程   机制   轻松   事件   代表   时间   资源   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top