curator-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Cameron McKenzie <mckenzie....@gmail.com>
Subject Re: Zookeeper Leadership election with curator
Date Thu, 15 Jan 2015 23:54:29 GMT
If you use the callback as Jordan suggested, then you can just block on a
latch, and then get this latch to be updated by the callback when it is
notified that it's leader. Then you won't have to wait for some fixed
amount of time, it will just block until it's leader.


On Fri, Jan 16, 2015 at 10:48 AM, Check Peck <comptechgeeky@gmail.com>
wrote:

> As of now, I am adding a sleep of 1 minute and it works fine before I
> check whether I am a leader or not.
>
> On Thu, Jan 15, 2015 at 3:43 PM, Check Peck <comptechgeeky@gmail.com>
> wrote:
>
>> Yes that makes sense that 1 client will be leader. But suppose I have 5
>> background threads running in 5 different machines and each background
>> thread is in different classes and I want to make sure that those 5
>> background threads are running from a single machine who is the leader so
>> that's why we are doing that check whether I am the leader then do this.
>>
>> Will this work if we add a Listener to leaderlatch?
>>
>> On Thu, Jan 15, 2015 at 3:30 PM, Jordan Zimmerman <
>> jordan@jordanzimmerman.com> wrote:
>>
>>> The problem with that is you have to wait until you are the leader. The
>>> benefit of LeaderSelector is that it has a callback that is invoked when
>>> you are the leader. Remember, you are in a multithreaded, multi client
>>> environment. Only 1 client is going to be the leader. Maybe what you are
>>> after is an InterProcessMutex?
>>>
>>> -JZ
>>>
>>>
>>>
>>> On January 15, 2015 at 6:24:06 PM, Check Peck (comptechgeeky@gmail.com)
>>> wrote:
>>>
>>>  I saw the leader election code here -
>>> https://git-wip-us.apache.org/repos/asf?p=curator.git;a=tree;f=curator-examples/src/main/java/leader;h=73b547eadb98995c0ccbd06a5b76d0741ffef263;hb=HEAD
>>>
>>> But didn't understand few things - How can I call something like this in
>>> my code  - I want to do stuff in my code by just checking whether I am the
>>> leader or not. And from the LeaderSelectorExample, I am not able to
>>> understand this.
>>>
>>> if (zookClient.isLeader()) {
>>>
>>> // then do stuff
>>>
>>> }
>>>
>>>
>>> On Thu, Jan 15, 2015 at 3:17 PM, Jordan Zimmerman <
>>> jordan@jordanzimmerman.com> wrote:
>>>
>>>>  Oh - maybe I read the code too fast. I guess it doesn’t make more
>>>> than one…
>>>>
>>>>  There’s an example of LeaderSelector here:
>>>> http://curator.apache.org/curator-examples/index.html
>>>>
>>>>
>>>> On January 15, 2015 at 6:00:03 PM, Check Peck (comptechgeeky@gmail.com)
>>>> wrote:
>>>>
>>>>    Thanks Jordan for the input.
>>>>
>>>> * Where do you see that I am creating new Curator instance for each
>>>> Leader? I guess I am using one Curator instance for my application?
>>>> * Ok, I have commented out this line in ZookeeperClient class
>>>> * That's a good point, how would I use the listener or the
>>>> leaderselector in my code base? If possible, can you provide an example?
>>>>
>>>>
>>>> On Thu, Jan 15, 2015 at 2:38 PM, Jordan Zimmerman <
>>>> jordan@jordanzimmerman.com> wrote:
>>>>
>>>>>  A few things:
>>>>>
>>>>>  * You don’t need to create a new Curator instance for each Leader.
>>>>> One Curator instance can be used for an application.
>>>>>  * Calling
>>>>> client.getZookeeperClient().blockUntilConnectedOrTimedOut(); is unnecessary
>>>>>  * Calling isLeader() immediately after starting the latch may not
>>>>> work. It takes time for the leader to get selected. LeaderLatch has a
>>>>> listener if you want to get notified. Alternatively, you can use
>>>>> LeaderSelector.
>>>>>
>>>>>  Hope this helps.
>>>>>
>>>>>  -Jordan
>>>>>
>>>>>
>>>>>
>>>>> On January 15, 2015 at 5:25:26 PM, Check Peck (comptechgeeky@gmail.com)
>>>>> wrote:
>>>>>
>>>>>  I am using Zookeeper for the leadership election process. I have
>>>>> three nodes zookeeper ensemble.
>>>>>
>>>>> We have a node like this "/test/msn" on which we are doing the
>>>>> leadership election and it works fine and we have application servers
>>>>> running it in production and using "/test/msn" node for leadership. And
>>>>> this program is always running.
>>>>>
>>>>> Now we created another node like this "/testpnl" in the same zookeeper
>>>>> servers. And we have another set of machines which is trying to do the
>>>>> leadership election on that node and whenever I run my program in
>>>>> production from one servers, it always returns back that the node is
not
>>>>> leader? And I can see only one node inside "/testpnl" and it is the same
>>>>> node from which I am running my program?
>>>>>
>>>>> I am using Curator 2.7.0 and the zookeeper version is 3.4.5 Is there
>>>>> anything wrong with my setup or zookeeper has some bug which I am not
aware?
>>>>>
>>>>> Is anything
>>>>>
>>>>>     public class ZookeeperLeaderTester {
>>>>>
>>>>>         private ZookeeperClient zookClient;
>>>>>
>>>>>         private static final String ZOOK_PRODUCTION =
>>>>> "host1:2181,host2:2181,host3:2181";
>>>>>         private static final String LEADERSHIP_NODE = "/testpnl";
>>>>>
>>>>>         private static class Holder {
>>>>>             static final ZookeeperLeaderTester INSTANCE = new
>>>>> ZookeeperLeaderTester();
>>>>>         }
>>>>>
>>>>>         public static ZookeeperLeaderTester getInstance() {
>>>>>             return Holder.INSTANCE;
>>>>>         }
>>>>>
>>>>>         private ZookeeperLeaderTester() {
>>>>>             try {
>>>>>                 String hostname = getHostName();
>>>>>
>>>>>                 zookClient = new ZookeeperClient(nodes,
>>>>> LEADERSHIP_NODE, hostname);
>>>>>                 zookClient.start();
>>>>>
>>>>>             } catch (Exception ex) {
>>>>>                 System.out.println (ex);
>>>>>                 System.exit(1);
>>>>>             }
>>>>>         }
>>>>>
>>>>>         public ZookeeperClient getZookClient() {
>>>>>             return zookClient;
>>>>>         }
>>>>>     }
>>>>>
>>>>> And here is my ZookeeperClient code -
>>>>>
>>>>>     public class ZookeeperClient {
>>>>>
>>>>>         private CuratorFramework client;
>>>>>         private String latchPath;
>>>>>         private String id;
>>>>>         private LeaderLatch leaderLatch;
>>>>>
>>>>>         public ZookeeperClient(String connString, String latchPath,
>>>>> String id) {
>>>>>             client = CuratorFrameworkFactory.newClient(connString, new
>>>>> ExponentialBackoffRetry(1000, Integer.MAX_VALUE));
>>>>>             this.id = id;
>>>>>             this.latchPath = latchPath;
>>>>>         }
>>>>>
>>>>>         public void start() throws Exception {
>>>>>             client.start();
>>>>>
>>>>> client.getZookeeperClient().blockUntilConnectedOrTimedOut();
>>>>>             leaderLatch = new LeaderLatch(client, latchPath, id);
>>>>>             leaderLatch.start();
>>>>>         }
>>>>>
>>>>>         public boolean isLeader() {
>>>>>             return leaderLatch.hasLeadership();
>>>>>         }
>>>>>
>>>>>         public Participant currentLeader() throws Exception {
>>>>>             return leaderLatch.getLeader();
>>>>>         }
>>>>>
>>>>>         public void close() throws IOException {
>>>>>             leaderLatch.close();
>>>>>             client.close();
>>>>>         }
>>>>>
>>>>>         public CuratorFramework getClient() {
>>>>>             return client;
>>>>>         }
>>>>>
>>>>>         public String getLatchPath() {
>>>>>             return latchPath;
>>>>>         }
>>>>>
>>>>>         public String getId() {
>>>>>             return id;
>>>>>         }
>>>>>
>>>>>         public LeaderLatch getLeaderLatch() {
>>>>>             return leaderLatch;
>>>>>         }
>>>>>     }
>>>>>
>>>>> And this is the way I am using it -
>>>>>
>>>>>     ZookeeperLeaderTester zookClient =
>>>>> ZookeeperLeaderTester.getInstance().getZookClient();
>>>>>     if (zookClient.isLeader()) {
>>>>>         // then do stuff
>>>>>     }
>>>>>
>>>>>
>>>>
>>>
>>
>

Mime
View raw message