curator-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jordan Zimmerman <jor...@jordanzimmerman.com>
Subject Re: Zookeeper Leadership election with curator
Date Thu, 15 Jan 2015 23:57:19 GMT
But if you go through that much trouble you might as well just use InterProcessMutex.

-JZ



On January 15, 2015 at 6:54:30 PM, Cameron McKenzie (mckenzie.cam@gmail.com) wrote:

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