背景
在分布式系统中,经常遇到这样一种场景:选举一个节点执行某一个任务,当此节点宕机后,其他节点可以接管并继续执行这个任务。由于各个节点运行的代码是一样的,彼此之间也是平等的,各个节点如何可以知道自己是否可以执行这个任务呢?当有节点宕机时,又如何判断自己是否可以接管任务呢?在我们的分布式任务调度系统中,需要选取调度器集群中的一个节点进行轮询任务状态,这里使用了zookeeper来实现一个统一的分布式锁,从而选出轮询节点。
原理
如图所示,每台服务器启动后,都在同一目录下建一个临时顺序节点(EPHEMERAL_SEQUENTIAL),并获取此目录下的所有节点信息,如果自己的序号是最小的,就认为获取到了锁,可以执行任务。若自己的节点不是最小的,就认为自己没有获取到锁,不执行任务,同时,在比自己小1个序号的节点上增加监听。当比自己小1个序号的节点发生变化的时候,再次检查自己是否是最小序号的节点,如果是则获取锁,否则继续监听比自己小1个序号的节点。
实现
以下是一个demo实现程序:
|
|