zookeeper master选举


zookeeper master选举

 

应用场景:从集群中选举一个服务器处理任务

实现原理:多个进程在同一个目录节点下创建子节点,只有一个可以创建成功,创建成功的进程执行任务,其他进程等待

 

******************************

相关类

 

  LeaderSelector

public class LeaderSelector implements Closeable {

*****************************
构造方法
 
    public LeaderSelector(CuratorFramework client, String leaderPath, LeaderSelectorListener listener)

    public LeaderSelector(CuratorFramework client, String leaderPath, ExecutorService executorService, LeaderSelectorListener listener) 

    public LeaderSelector(CuratorFramework client, String leaderPath, CloseableExecutorService executorService, LeaderSelectorListener listener) {


*****************************
常用方法

    public void autoRequeue()  //执行完成后重新排队选主

    public void start()        //开始选主

    public boolean requeue()    //重新排队

    public synchronized void close()  //关闭

    public Participant getLeader() //获得leader
    public boolean hasLeadership() //是否有leader
    public Collection<Participant> getParticipants()
                               //获得所有选主参与者

 

  Participant

public class Participant {
    private final String id;
    private final boolean isLeader;

    public Participant(String id, boolean leader) {
        this.id = id;
        this.isLeader = leader;
    }

    。。。。

}

 

 

  LeaderSelectorListener

public interface LeaderSelectorListener extends ConnectionStateListener {
    void takeLeadership(CuratorFramework var1) throws Exception;
}

说明:当执行完takeLeadership(CuratorFramework var1)后,会重新选主

 

 

****************************

使用示例

 

********************

config 层

 

@Configuration
public class ZookeeperConfig {

    @Value("${zookeeper.connecting-string}")
    private String connectingString;

    @Bean
    public CuratorFramework initCuratorFramework(){
        CuratorFramework curatorFramework= CuratorFrameworkFactory.builder()
                .connectString(connectingString)
                .sessionTimeoutMs(5000)
                .retryPolicy(new ExponentialBackoffRetry(1000,3,3000))
                .namespace("test")
                .build();
        curatorFramework.start();

        return curatorFramework;
    }
}

 

********************

controller 层

 

@RestController
public class HelloController {

    @Autowired
    private CuratorFramework curatorFramework;

    private String master_path="/master";

    @RequestMapping("/get4")
    public String test3(){
        ExecutorService executorService=Executors.newFixedThreadPool(5);

        for(int i=0;i<5;i++){
            executorService.submit(()->{
                LeaderSelector leaderSelector=new LeaderSelector(curatorFramework, master_path, new LeaderSelectorListenerAdapter() {
                    @Override
                    public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
                        try{
                            System.out.println(Thread.currentThread().getId()+" 开始选主: "+System.currentTimeMillis());
                            Thread.sleep(1000);
                            System.out.println(Thread.currentThread().getId()+" 执行结束: "+System.currentTimeMillis());
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });

                leaderSelector.start();
            });
        }

        return "success";
    }
}

 

********************

控制台输出:

 

49 开始选主: 1569202690581
49 执行结束: 1569202691586
47 开始选主: 1569202691609
47 执行结束: 1569202692612
45 开始选主: 1569202692622
45 执行结束: 1569202693625
48 开始选主: 1569202693637
48 执行结束: 1569202694639
46 开始选主: 1569202694650
46 执行结束: 1569202695652

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值