全局锁
在系统访问单个资源时或多或少都会要使用到锁,如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任务执行的管理等。这里主要介绍的还是悲观锁,在某些场景也可以使用乐观锁进行优化。
相关推荐
分布式数据库是将数据分散存储在多个物理位置的数据库系统中,这些位置可能跨越多个服务器或网络。这种架构的主要优势在于提高了系统的可用性、容错性和可扩展性。在飞机订票系统中,分布式数据库可以确保即使某个...
而分布式有限状态机是一种在分布式系统中实现状态转换的机制,常用于处理并发和分布式环境中的复杂状态管理问题。 **描述解析:** "无锡 ZooKeeper 上的简单分布式有限状态机" 这个描述可能是指这个项目或研究是在...
该项目为基于Python的迷你分布式状态机设计源码,包含44个文件,其中包括17个Python源文件、11个Python编译文件、6个XML配置文件、2个Git忽略文件、2个Markdown文件、2个JSON文件、2个SQL文件、1个IDE项目文件以及1...
分布式状态估计总体架构主要由发电厂内的发电机状态量动态状态估计、变电站内的状态估计和调度中心的系统状态估计组成。在互联过程中,机网接口问题和发电机动态状态估计的约束是两个关键问题,需要进行综合研究和...
7. 数据库监控:用于监控分布式系统中的数据库性能和状态,实现数据库的实时监控和优化。 8. 代码管理、项目同步:用于管理分布式系统中的代码和项目,实现代码的同步和版本控制。 9. 日志管理:用于管理分布式系统...
分布式燃气轮机的特色在于占地少、现场安装便捷、高度集成和模块化,这使得它在分布式能源系统中扮演着重要的角色。本文重点讨论了分布式燃气轮机的机架与润滑油箱的集成化设计方法及其特点。 集成化设计是分布式...
分布式动态非连续分配方案是指在网络中动态地根据任务需求和处理机状态,将计算任务分配给处理机的过程。在Torus网络中,这种策略能够有效避免负载不均,提高处理机利用率,并减少因处理机过载而造成的性能瓶颈。 ...
智能手机信令数据是指智能手机在通信过程中产生的各种控制信息和状态信息。这些数据对于了解和分析用户的通信行为模式、网络负载情况以及优化移动通信服务质量至关重要。然而,随着移动智能终端数量的快速增长,尤其...
而在飞机分布式配电系统中,负载管理是保证系统高效、可靠运行的关键环节。本文将详细探讨飞机分布式配电中负载管理的实施方法和重要性,并深入分析固态配电控制技术在其中的应用和优势。 在飞机分布式配电系统中,...
分布式系统在现代软件架构中扮演着至关重要的角色,它能够处理海量数据并提供高可用的服务。面试中,分布式锁、分布式事务和分布式缓存等概念是考察开发者技术能力的重要方面。下面将对这些主题进行详细阐述。 ...
在维度控制环节中,通过精确的角度、深度和宽度信息的获取和分析,进一步加强了对分布式能源发电机运行状态的监控和控制。这种控制逻辑的实现,对于维护设备的稳定运行和提前预防故障具有重要意义。 西门子与杭汽轮...
在众多类型的分布式能源站中,以燃气发电机组为核心的能源站因其较高的能源转换效率和较低的环境污染,成为推动能源绿色转型的重要力量。 在实施分布式能源站项目的过程中,燃气发电机组的调试技术显得尤为重要。...
3. **状态机和有序操作**:利用状态机模型和严格控制的操作顺序来减少不一致性的发生。 4. **异步事件**:利用异步事件处理机制来实现最终一致性。 **3.1 把分布式事务分解为具有幂等性的异步消息处理** 在分布式...
本文主要探讨了CANopen协议在分布式伺服电动机控制器中的实现方式,文中首先介绍了CANopen协议及其在通信领域的应用背景。CAN(Controller Area Network)是一种国际标准化的串行通信协议,它通过ISO11898及ISO11519...
在电力工程领域,同步发电机的励磁系统是保证发电机稳定运行的关键组成部分,尤其在分布式发电系统中,其性能的优劣直接关系到整个电力系统的稳定性和可靠性。分布式发电系统通常指的是在用户现场或靠近用户现场的...
在对10kV开关柜进行分布式实时状态监测的技术研究中,涉及的关键技术包括: 1. 分布式在线监测的实施和应用,这涉及利用先进的传感技术,将传感器嵌入高压开关柜中,实时监测其运行状态。 2. 监测到的数据信息通过...
9. **状态管理**:在分布式系统中,保持状态一致性是个挑战。源码可能包含使用分布式缓存(如Redis或Memcached)或分布式锁的示例。 10. **微服务架构**:随着微服务理念的流行,源码可能涉及如何将大型应用拆分为...
在分布式系统模型中,节点是系统的基本构成单元,可以是一个进程或者一台物理机。节点间的通信是通过网络进行的,可能包括点对点通信、广播通信等方式。存储则是指节点对数据的处理和保存。异常处理在分布式系统中尤...
在煤矿皮带运输机中的应用,它能够提高煤矿安全生产的效率和可靠性。分布式光纤测温系统能够在井下恶劣环境下实时监测皮带输送机关键部件的温度变化,为预防和诊断煤矿安全事故提供了重要的技术手段。 煤矿中的皮带...
在本文中,分布式系统的应用主要是为了设计一个独立的、模拟船舶燃油和滑油净化的分油机仿真面板。 2. 分布式分油机仿真面板的独立性与功能: 仿真面板的设计旨在实现分油机操作流程的独立模拟,即不依赖于PC服务器...