Below you will find pages that utilize the taxonomy term “clojure,zookeeper”
Posts
Clojure里使用curator做Leader节点选举
Curator 框架刚出来的时候,我就用它帮 Storm 重构了 zookeeper 模块。使用 zookeeper,如果用 java 语言,curator 框架是最佳选择。
最近在做一个节点选举的功能,在几个节点之间选举一个 leader 来跑一个独占服务。原来的方案是直接利用 hostname 匹配,跟配置的 hostname 一致的固定某台机器来执行。Failover 靠人肉和自动化脚本。为了做让 failover 自动化,自动选举节点是更好的方案。理所当然,我尝试在 clojure 里使用 curator 框架。 curator 提供了 Leader Election功能,我要做的只是封装这个Java API,在clojure里更好地使用。
首先,肯定是继承LeaderSelectorListenerAdapter 来实现 LeaderSelectorListener ,监听本节点是否成功获取 leadership,当本节点成功被选举的时候,LeaderSelectorListener 的takeLeadership方法将调用,你应该阻塞这个方法,直到:
继承LeaderSelectorListenerAdapter我们用 proxy 函数,阻塞呢?Clojure提供了promise,当 promise 没有值的时候, deref 调用会阻塞, promise 本质上是一个CountDownLatch。我们就利用它来阻塞 takeLeadership 方法,封装下这个过程:
;;保存curator框架客户端的atom (defonce ^:private curator-framework (atom nil)) ;;保存LeaderSelector列表的atom (defonce ^:private leader-selectors (atom [])) (defn elect-leader "参与leader选举,如果被选举为leader,调用aquire函数,释放leadership的时候调用release函数。 path表示参与选举节点共同使用的zookeeper上的路径。" [path aquire release] (if (nil? @curator-framework) (throw (IllegalStateException. "Please call start at first.