Master选举

2 篇文章 0 订阅
1 篇文章 0 订阅

在分布式中,经常会碰到这样的一个场景,对于一个复杂的业务,仅需要从集群中选举出一台进行处理即可。诸如此类分布式问题,我们称为”Master”选举。借助zookeeper,我们可以很方便的实现Master选举的功能。其大体思路非常简单。
选择一个根据节点,例如/master_select,多台机器同时向该节点创建一个子节点/master_select/lock,利用zookeeper的特性,最终只有一台机器能够创建成功,成功的那台就作为Master选举。
Curator也是基于这个思路,但是它将节点创建,事件监听和自动选举进行了封装,开发人员只需要简单的调用API即可实现Master选举。下面我我们通过一个实例开看看如何使用Curator实现Master选举功能。

package org.apache.curator;

import java.util.List;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListener;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * 使用Curator实现分布式选举功能
 * @author Mett.Min
 *
 */
public class RecipesMasterSelect {

    static String master_path = "/curator_recipes_master_path";
    static CuratorFramework client = CuratorFrameworkFactory.builder().connectString("hadoop01:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();

    public static void main(String[] args) throws Exception {
        client.start();
        /**
         * 该实例封装了所有Master选举相关的逻辑,包括所有和Zookeeper服务器交互的过程,其中Master_select代表一个Master选举的一个
         * 根节点,表明本次Master选举都是在该节点下进行的。
         * 在创建LeaderSelector实例的时候,还会传入一个监听器:LeaderSelectorListenerAdapter。这需要开发人员自行实现。Curator
         * 会在成功获取Master权利时候回调该监听器。
         */
        LeaderSelector leaderSelector = new LeaderSelector(client, master_path, new LeaderSelectorListener() {

            @Override
            public void stateChanged(CuratorFramework client, ConnectionState stat) {

            }
            /**
             *  成为Master角色
             *  [_c_d2557b3f-bf64-4868-988b-d023a340b38b-lock-0000000021]
             *  完成Master操作,释放Master权利
             *  成为Master角色
             */
            @Override
            public void takeLeadership(CuratorFramework client) throws Exception {
                System.out.println("成为Master角色");
                Thread.sleep(3000);
                List<String> path = client.getChildren().forPath(master_path);
                System.out.println(path);
                System.out.println("完成Master操作,释放Master权利");
            }
        });
        leaderSelector.autoRequeue();
        leaderSelector.start();
        Thread.sleep(Integer.MAX_VALUE);
    }
}

程序输出:
成为Master角色
[_c_d2557b3f-bf64-4868-988b-d023a340b38b-lock-0000000021]
完成Master操作,释放Master权利
成为Master角色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值