auto commit
This commit is contained in:
parent
0d350f1fb6
commit
d3c8e9ae61
|
@ -40,12 +40,12 @@
|
||||||
|
|
||||||
## 数据库的唯一索引
|
## 数据库的唯一索引
|
||||||
|
|
||||||
获得锁时向表中插入一条记录,释放锁时删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否存于锁定状态。
|
获得锁时向表中插入一条记录,释放锁时删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否处于锁定状态。
|
||||||
|
|
||||||
存在以下几个问题:
|
存在以下几个问题:
|
||||||
|
|
||||||
- 锁没有失效时间,解锁失败的话其它进程无法再获得该锁。
|
- 锁没有失效时间,解锁失败的话其它进程无法再获得该锁;
|
||||||
- 只能是非阻塞锁,插入失败直接就报错了,无法重试。
|
- 只能是非阻塞锁,插入失败直接就报错了,无法重试;
|
||||||
- 不可重入,已经获得锁的进程也必须重新获取锁。
|
- 不可重入,已经获得锁的进程也必须重新获取锁。
|
||||||
|
|
||||||
## Redis 的 SETNX 指令
|
## Redis 的 SETNX 指令
|
||||||
|
@ -61,8 +61,8 @@ EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了
|
||||||
使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时仍然可用。
|
使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时仍然可用。
|
||||||
|
|
||||||
- 尝试从 N 个互相独立 Redis 实例获取锁;
|
- 尝试从 N 个互相独立 Redis 实例获取锁;
|
||||||
- 计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N / 2 + 1)实例上获取了锁,那么就认为锁获取成功了;
|
- 计算获取锁消耗的时间,只有时间小于锁的过期时间,并且从大多数(N / 2 + 1)实例上获取了锁,才认为获取锁成功;
|
||||||
- 如果锁获取失败,就到每个实例上释放锁。
|
- 如果获取锁失败,就到每个实例上释放锁。
|
||||||
|
|
||||||
## Zookeeper 的有序节点
|
## Zookeeper 的有序节点
|
||||||
|
|
||||||
|
@ -91,11 +91,11 @@ Zookeeper 提供了一种树形结构的命名空间,/app1/p_1 节点的父节
|
||||||
|
|
||||||
### 5. 会话超时
|
### 5. 会话超时
|
||||||
|
|
||||||
如果一个已经获得锁的会话超时了,因为创建的是临时节点,所以该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,Zookeeper 分布式锁不会出现数据库的唯一索引实现的分布式锁释放锁失败问题。
|
如果一个已经获得锁的会话超时了,因为创建的是临时节点,所以该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,这种实现方式不会出现数据库的唯一索引实现方式释放锁失败的问题。
|
||||||
|
|
||||||
### 6. 羊群效应
|
### 6. 羊群效应
|
||||||
|
|
||||||
一个节点未获得锁,只需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应),而我们只希望它的后一个子节点收到通知。
|
一个节点未获得锁,只需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应,一只羊动起来,其它羊也会一哄而上),而我们只希望它的后一个子节点收到通知。
|
||||||
|
|
||||||
# 二、分布式事务
|
# 二、分布式事务
|
||||||
|
|
||||||
|
@ -278,6 +278,8 @@ Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接
|
||||||
|
|
||||||
Raft 也是分布式一致性协议,主要是用来竞选主节点。
|
Raft 也是分布式一致性协议,主要是用来竞选主节点。
|
||||||
|
|
||||||
|
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
|
||||||
|
|
||||||
## 单个 Candidate 的竞选
|
## 单个 Candidate 的竞选
|
||||||
|
|
||||||
有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms\~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。
|
有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms\~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。
|
||||||
|
@ -332,7 +334,6 @@ Raft 也是分布式一致性协议,主要是用来竞选主节点。
|
||||||
- [Distributed locks with Redis](https://redis.io/topics/distlock)
|
- [Distributed locks with Redis](https://redis.io/topics/distlock)
|
||||||
- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
|
- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
|
||||||
- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
|
- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
|
||||||
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
|
|
||||||
- [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html)
|
- [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html)
|
||||||
- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
|
- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
|
||||||
- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)
|
- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)
|
||||||
|
|
17
notes/分布式.md
17
notes/分布式.md
|
@ -40,12 +40,12 @@
|
||||||
|
|
||||||
## 数据库的唯一索引
|
## 数据库的唯一索引
|
||||||
|
|
||||||
获得锁时向表中插入一条记录,释放锁时删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否存于锁定状态。
|
获得锁时向表中插入一条记录,释放锁时删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否处于锁定状态。
|
||||||
|
|
||||||
存在以下几个问题:
|
存在以下几个问题:
|
||||||
|
|
||||||
- 锁没有失效时间,解锁失败的话其它进程无法再获得该锁。
|
- 锁没有失效时间,解锁失败的话其它进程无法再获得该锁;
|
||||||
- 只能是非阻塞锁,插入失败直接就报错了,无法重试。
|
- 只能是非阻塞锁,插入失败直接就报错了,无法重试;
|
||||||
- 不可重入,已经获得锁的进程也必须重新获取锁。
|
- 不可重入,已经获得锁的进程也必须重新获取锁。
|
||||||
|
|
||||||
## Redis 的 SETNX 指令
|
## Redis 的 SETNX 指令
|
||||||
|
@ -61,8 +61,8 @@ EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了
|
||||||
使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时仍然可用。
|
使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时仍然可用。
|
||||||
|
|
||||||
- 尝试从 N 个互相独立 Redis 实例获取锁;
|
- 尝试从 N 个互相独立 Redis 实例获取锁;
|
||||||
- 计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N / 2 + 1)实例上获取了锁,那么就认为锁获取成功了;
|
- 计算获取锁消耗的时间,只有时间小于锁的过期时间,并且从大多数(N / 2 + 1)实例上获取了锁,才认为获取锁成功;
|
||||||
- 如果锁获取失败,就到每个实例上释放锁。
|
- 如果获取锁失败,就到每个实例上释放锁。
|
||||||
|
|
||||||
## Zookeeper 的有序节点
|
## Zookeeper 的有序节点
|
||||||
|
|
||||||
|
@ -91,11 +91,11 @@ Zookeeper 提供了一种树形结构的命名空间,/app1/p_1 节点的父节
|
||||||
|
|
||||||
### 5. 会话超时
|
### 5. 会话超时
|
||||||
|
|
||||||
如果一个已经获得锁的会话超时了,因为创建的是临时节点,所以该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,Zookeeper 分布式锁不会出现数据库的唯一索引实现的分布式锁释放锁失败问题。
|
如果一个已经获得锁的会话超时了,因为创建的是临时节点,所以该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,这种实现方式不会出现数据库的唯一索引实现方式释放锁失败的问题。
|
||||||
|
|
||||||
### 6. 羊群效应
|
### 6. 羊群效应
|
||||||
|
|
||||||
一个节点未获得锁,只需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应),而我们只希望它的后一个子节点收到通知。
|
一个节点未获得锁,只需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应,一只羊动起来,其它羊也会一哄而上),而我们只希望它的后一个子节点收到通知。
|
||||||
|
|
||||||
# 二、分布式事务
|
# 二、分布式事务
|
||||||
|
|
||||||
|
@ -278,6 +278,8 @@ Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接
|
||||||
|
|
||||||
Raft 也是分布式一致性协议,主要是用来竞选主节点。
|
Raft 也是分布式一致性协议,主要是用来竞选主节点。
|
||||||
|
|
||||||
|
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
|
||||||
|
|
||||||
## 单个 Candidate 的竞选
|
## 单个 Candidate 的竞选
|
||||||
|
|
||||||
有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms\~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。
|
有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms\~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。
|
||||||
|
@ -332,7 +334,6 @@ Raft 也是分布式一致性协议,主要是用来竞选主节点。
|
||||||
- [Distributed locks with Redis](https://redis.io/topics/distlock)
|
- [Distributed locks with Redis](https://redis.io/topics/distlock)
|
||||||
- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
|
- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
|
||||||
- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
|
- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
|
||||||
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
|
|
||||||
- [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html)
|
- [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html)
|
||||||
- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
|
- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
|
||||||
- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)
|
- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user