在分布式环境下,针对共享资源的互斥访问成为很多应用需要解决的问题,对于这个问题,人们会引入分布式锁来解决。在单机环境,有mutex等操作系统机制,帮助实现多线程情况下对共享资源的互斥访问;在分布式环境,也有很多redis,zk,etcd等三方服务实现资源的共享,本文会简单介绍常见的分布式锁实现方案,方案在实际使用中所存在的问题,以及利用dfs特性实现分布式文件互斥写入、删除。
分布式锁实现原理
分布式锁实现原理都是抢夺唯一资源,拿到资源的成为leader可对资源进行操作,其他进程则为follower,可监听资源的使用,一旦leader释放,follower则可进行资源再次抢夺。这要求分布式锁具备以下一些特性:
互斥性:在任意时刻,对于同一个锁,只有一个客户端能持有,从而保证一个共享资源同一时间只能被一个客户端操作;
安全性:即不会形成死锁,当一个客户端在持有锁的期间崩溃而没有主动解锁的情况下,其持有的锁也能够被正确释放,并保证后续其它客户端能加锁;
可用性:当提供锁服务的节点发生宕机等不可恢复性故障时,“热备” 节点能够接替故障的节点继续提供服务,并保证自身持有的数据与故障节点一致。
以etcd服务为例,讲述是如何实现上面分布式锁的几个特性。
etcd自身是是一个数据强一致的键值(key-value)存储数据库。其自身通过raft算法实现了高可用性,保证服务的稳定。
同时,他还提供了如下能力,支持分布式锁的实现:
Lease 机制:即租约机制(TTL,Time To Live),Etcd 可以为存储的 Key-Value 对设置租约ÿ