[Architecture] 2.6 Distributed Lock

0. Questions and links

The process uses a mutex lock and the process hangs up. How to release the lock?

Three ways to implement distributed locks

[Distributed lock] Implementation of three distributed locks [Original]

 

1. Review of lock knowledge

1. 线程锁
2. 进程锁(nginx 中 accept 锁-共享内存+信号量)
3. 分布式锁(在不同机器的进程的锁)

2. Existing open source projects that provide distributed lock solutions

1.redis
2.mysql
3.zookeeper

3. Factors and characteristics that need to be considered for distributed locks

1.互斥性
2.可重入性,一个进程允许递归获取锁,当然也需要递归释放锁
3.对于锁超时的处理(比如说如果进程挂了,会导致锁超时,需要考虑释放分布式锁)
4.高效高可用
5.在公平和非公平之间权衡,如果按获取锁的时间进行就是公平的,否则就是非公平的.

4. Some concepts and small knowledge

(1)随机执行-非公平
(2)顺序执行-公平
(3)最终一致性(redis)
(4)强一致性(zookeeper)
(5)最终一致性-各台机器上的数据满足最后一样即可
(6)强一致性-各台机器上的数据满足一直一样
(7)Redis的主从复制中,主机写操作的时候,会通知从属机器进行写操作,实现最终一致性(在rdb模式下,会有1秒【配置文件决定】的操作丢失,
在aof模式下,会有一个操作丢失).
(8)Zookeeper用的是zab协议,是强一致性.
(9)多核编程考虑:隔离性(运行环境的隔离)和统一性(数据的统一)
(10)分布式中考虑: 一致性,可用性,分区容错性.(CAP,三者满足俩).
(11)CAP:Consistency(一致性), Availability(可用性),Partition tolerance(分区容错性).
(12)操作redis,实际上是执行redis提供的rpc调用来对redis中的数据结构.zk的数据请求方式是:
"请求回应+监听发布"来实现所有的功能.按照请求顺序来执行命令,返回也是按照执行的顺序来的.
skynet利用协程实现同步非阻塞的方式.
(13)当一个线程操作执行到设置的时间的时候还没有执行完,就要进行续时间;
(14)redis中,释放分布式锁的时候,当有多个操作的时候,如果需要原子完成,一般这样操作:
    if(get(key)==四元组){delete(key)}这个要作为一个lua事务来执行.
(15)redis实现的分布式锁是悲观锁,用setnx()来实现.或者进阶版本的redlock来实现.
(16)悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次
在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了
很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
(17)乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以
不会上锁,期间该数据可以随便被其他人读取,但是在更新的时候会判断一下在此期间别人有没有去更新这
个数据,可以使用版本号等机制.

 

Guess you like

Origin blog.csdn.net/Edidaughter/article/details/115261847