分布式锁和数据库锁
分布式锁
多个服务竞争稀缺资源,需要使用分布式锁。
- 锁是一种资源,需要存储,高可用性,避免锁全局失效。
- 隐含条件:加锁和释放锁必须是同一个对象,需要记录持有锁的对象。
- 另外需要实现互斥的语义,获取锁做个标记,释放锁时取消标记。
- 获取锁和释放锁都是网络通信实现的,需要考虑锁超时的问题。
- 锁释放通知问题:a.定时探寻。b. 被动通知(包括广播,和通知能够获取锁的特例)
- 是否允许同一个对象多次获取锁,可重入锁
特性:互斥性、可重入性、锁超时(取到锁的进程可能会宕机)、高可用性(redis集群实现,哨兵模式和cluster模式都是异步复制、最终一致性,可能会丢数据,cluster集群lua脚本可能失效)、分类(公平锁:根据队列顺序获取锁、非公平锁:随机派发锁)
其中高可用可分为计算型和存储型,计算型的是无状态的,存储型需要有一致性的协议,主要包括选举主节点、数据复制。
实现方式:redis/mysql、zookeeper/etcd