全局锁
在系统访问单个资源时或多或少都会要使用到锁,如Java的Lock等,但多个系统访问资源,或在集群中各个实例需要访问资源时,就需要建立全局的锁,这里讲三种全局锁的方法。
数据库
利用ACID
使用关系型数据库的ACID可以创建一个锁
UPDATE LOCKTABLE SET INSTANCE=<instance_name> WHERE RESOURCE=XXXX AND INSTANCE IS NULL;
当返回更新了相应记录后就代表获得了锁
对应的可以使用以下sql来释放获得的锁
UPDATE LOCKTABLE SET INSTANCE='' WHERE RESOURCE=XXXX AND INSTANCE=<instance_name>;
上面的方法看上去很好,但是当获得锁的实例宕机那么这个锁就一直被占用着
利用行锁
为了解决实例非正常退出而没有释放锁可以使用数据库(ORACLE)的行锁
SELECT 1 FROM LOCKTABLE WHERE RESOURCE=XXXX FOR UPDATE;
这样在commit/rollback之前就能持有这个锁,如果调用方断开,数据库也会自动rollback。可以使用NOWAIT+循环查询的方式防止阻塞
REDIS
数据库固然可以,但应对大量的资源需要长期持有大量锁也不是很恰当,下面看下Redis如何创建全局锁
SETNX
SETNX是set if not exist的缩写,也就是当值不存在时再进行赋值
SETNX lock.resource 1
//hold the lock
DEL lock.resource
以上伪代码简单演示了如何获得锁和释放锁,和数据库的方法一样,这种方法同同样存在实例宕机的风险导致死锁
SET
可惜Redis上没有像数据库中的for update。一个替代方法是使用expire。即给锁设定一个超时时间,如果时间超过自动释放锁,这里超时时间要合适不能过长让其他实例空等,也不能过短实例没有结束就自动释放了。
幸运的是Redis 2.6.12之后SET命令可以使用expire和notexist
SET lock.resource <instance_name> NX EX timeout
//hold the lock
WATCH lock.resource
GET lock.resource
MULTI
if(getResult==<instance_name>)
DEL lock.resource
EXEC
使用watch/multi确保竞态条件
RedLock
防止单Redis不可用,可以使用多个redis,在半数以上节点获得锁的情况下代表获得锁,否则就释放所有获得的锁。
Redison
如果不想自己造轮子,已经有现成的类库可以使用Redis创建全局锁了
Redison封装了锁的实现,提供可重入的锁的一系列实现,可以方便地使用
https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers
Zookeeper
redis的不足就是只能通过expire来控制锁持有者失联的情况。
zookeeper在这方面就有一定的优势,再加上zookeeper天生自带集群,在可靠性上优于redis
zookeeper可以创建ephemeral节点,当客户端断开连接节点自动删除,可以创建一个节点,最小值持有当前锁
create -e -s /LOCK/RESOURCE/REQUEST 1
之后判断如果当前节点最小就获得锁,如果没有就在前一个节点上加watch,在watch中再进行判断,这样就实现了等待获得锁的队列。
总结
全局锁在集群上的应用有不少,最常见的就如集群内CRON任务执行的管理等。这里主要介绍的还是悲观锁,在某些场景也可以使用乐观锁进行优化。
相关推荐
Go的有限状态机
无锡 ZooKeeper 上的简单分布式有限状态机
AfricaOS:用纯Rust编写的基于提议的分布式复制状态机(RSM)。 AOS是为定制而设计的简单区块链协议
电商的很多业务,考虑更多的是 BASE(即Basically Available、Soft state、和...第三,“通过状态机和严格的有序操作,来最大限度地降低不一致性”。 第四,最终一致性(Eventually Consistent)通过异步事件做到。
3.1.1 状态机模型 3.1.2 佩特里网 3.2 因果相关事件 3.2.1 发生在先关系 3.2.2 时空视图 3.2.3 交叉视图 3.3 全局状态 3.3.1 时空视图中的全局状态 3.3.2 全局状态:一个形式定义 3.3.3 全局状态的“快照”...
对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容变化事件...
dfsmr dfsmr或分布式有限状态机运行程序是界面设计方面的一项实验,旨在表现出富有表现力的现代分布式任务管理系统。 值得重复一遍,这是界面设计中的一项实验。 该实现有效,但仅在行使接口所需的范围内有效,并且...
在VHDL代码中,分布式算法滤波器可以利用下面的状态机描述: 欢迎转载,信息来源维库电子市场网(www.dzsc.com) 来源:ks99
通过SDK开发自主权身份环境中的智能合约Sirius Smart-Contract是由参与者认可的驱动的...通过状态机定义特定的共识程序,这些状态机可在与环境中提高参与者的状态-在IT基础架构上节省资金。安装pip install sirius-sdk
对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容变化事件...
3.1.1 状态机模型 3.1.2 佩特里网 3.2 因果相关事件 3.2.1 发生在先关系 3.2.2 时空视图 3.2.3 交叉视图 3.3 全局状态 3.3.1 时空视图中的全局状态 3.3.2 全局状态:一个形式定义 3.3.3 全局状态的“快照”...
单独启动swoole server不具备分布式特性,一台物理机只允许启动一个swoole server 4.swoole dispatch服务器可以和swoole server放在一个物理机上,一台物理机只允许启动一个swoole dispatch 5.可以启动多台swoole ...
分布式存储系统是一个有效的解决有状态工作负载高可用问题的方案。Ceph 就是一个分布式存储系统,近年来其影响主键扩大。Rook 是一个编排器,能够支持包括 Ceph 在内的多种存储方案。Rook 简化了 Ceph 在 Kubernetes...
介绍了一种分布式多点无线同步地震数据采集系统设计方法。该系统以C8051F020单片机为主控芯片,利用GPS模块提供的PPS信号实现分布式采集系统的同步,利用无线射频模块Xbee-Pro实现数据的无线传输。
电力物理网络通过构建信息网络进行优化调控并构成信息物理融合系统, 实现大规模分布式系统的优化控制, 随之而来的... 最后通过3 机9 节点分布式电网系统仿真实验验证了所设计的状态估计器对于数据攻击检测的有效性.</p>
分布式存储系统包括以下几个特性: 高性能 可扩展 低成本 易用性 分布式存储系统的技术挑战包括:数据和状态信息的持久化、数据的自动迁移、系统的自动容错、并发读写的数据的一致性等方面。 云计算——分布式存储...
对核动力装置中的故障问题进行了研究,根据系统结构和运行特点,基于分布式诊断策略将核动力装置划分成三级子单元结构,将故障诊断任务划分到不同的子单元中,采用核主元分析(kernel principal component analysis)进行...
b) 如果从控机发出的请求和中央空调设置的冷暖控制状态发生矛盾时,以中央空调机的状态优先,否则中央空调机不予响应。 5. 从控机只能人工方式开闭,并通过控制面板设置目标温度,目标温度有上下限制。 a) 从控机...
#资源达人分享计划#
如果从控机发出的请求和中央空调设置的冷暖控制状态发生矛盾时,以中央空调机的状态优先,即中央空调机不予响应。 4.从控机只能人工方式开闭,并通过控制面板设置目标温度,目标温度有上下限制。所有房间的初始目标...