1. master选举(LeaderSelector)

1)LeaderSelector构造函数

 在leaderPath上建立分布式锁:mutex = new InterProcessMutex(client, leaderPath)

org.apache.curator:master选举和分布式锁

2)LeaderSelector.start

当前WorkServer参与master选举

org.apache.curator:master选举和分布式锁

org.apache.curator:master选举和分布式锁

若autoRequeue为ture,则当前WorkServer在未能获取leadership || 获取并释放leadership时,将自动进入下一轮master选举

org.apache.curator:master选举和分布式锁

3)LeaderSelector.doWorkLoop -> takeLeadership

捕获InterruptedException并进行自我中断,若autoRequeue为ture,则忽略一切捕获的异常

org.apache.curator:master选举和分布式锁

获取分布式锁 -> 获取leadership ->释放分布式锁,获取分布式锁失败时将等待

org.apache.curator:master选举和分布式锁

org.apache.curator:master选举和分布式锁

2. 分布式锁(InterProcessMutex)

1)InterProcessMutex和LockInternals构造函数

maxLeases默认为1:只选举一个master

driver默认为StandardInternalsDriver类型

org.apache.curator:master选举和分布式锁

org.apache.curator:master选举和分布式锁

2)获取分布式锁

InterProcessMutex.acquire

org.apache.curator:master选举和分布式锁

org.apache.curator:master选举和分布式锁

LockInternals.attemptLock

org.apache.curator:master选举和分布式锁

StandardLockInternalsDriver.createsTheLock

在zookeeper上建立临时顺序(-e -s)节点,获取该节点在zookeeper上的完整路径(ourPath)

org.apache.curator:master选举和分布式锁

LockInternals.internalLockLoop

(1)basePath下的子节点依字符串自然顺序排序:getSortedChildren

(2)driver.getsTheLock(client, children, sequenceNodeName, maxLeases),其中sequenceNodeName为createsTheLock所创建的临时顺序节点的名称,如lock-0000000001

  若sequenceNodeName为children中的首个元素,则说明当前WorkServer为首个成功创建临时顺序节点的WorkServer,当前WorkServer成功获取分布式锁(haveLock = true)

  否则,创建watcher监听前置节点的变化 -> 当前WorkServer等待:client.getData().usingWatcher(watcher).forPath(previousSequencePath) -> wait

org.apache.curator:master选举和分布式锁

org.apache.curator:master选举和分布式锁

StandardLockInternalsDriver.getsTheLock

maxLeases为1

sequenceNodeName在children中的位置 < 1:getsTheLock = true,pathToWatch = null

sequenceNodeName在children中的位置 >= 1:getsTheLock = false,pathToWatch = sequenceNodeName前置节点

org.apache.curator:master选举和分布式锁

3)释放分布式锁

InterProcessMutex.release

org.apache.curator:master选举和分布式锁

LockInternals.releaseLock

删除当前WorkServer在zookeeper上创建的临时顺序节点:将触发所有WorkServer中设置LockInternals.watcher

org.apache.curator:master选举和分布式锁

org.apache.curator:master选举和分布式锁

LockInternals.watcher

watcher在LockInternals.internalLockLoop中被设置

org.apache.curator:master选举和分布式锁

唤醒当前WorkServer:每个WorServer代表一个JVM线程,多个WorkServer可能位于不同JVM上,也可能位于不同主机上

org.apache.curator:master选举和分布式锁

相关文章:

  • 2021-12-20
  • 2021-07-20
  • 2022-12-23
  • 2021-07-09
  • 2021-04-11
  • 2022-12-23
  • 2021-10-19
  • 2022-12-23
猜你喜欢
  • 2021-10-02
  • 2022-12-23
  • 2021-08-29
  • 2021-11-27
  • 2021-11-17
  • 2021-09-05
相关资源
相似解决方案