前言
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,成熟的架构大部分都自带高可用实现,只需配置即可,例如基于zookeeper的storm、spark,kafka,基于数据库的quartz(Terracotta不考虑)等等。很多组件都基于zookeeper,zookeeper也成为了后端人员必修功课之一。
基于zookeeper的高可用方案
原理:
各工作节点,在zookeeper同一目录下一同创建EPHEMERAL_SEQUENTIAL节点,抢到第一个编号0的节点,成为leader。
基础提要:
1、临时节点会随着zookeeper连接的关闭自动删除
实现:
watcher类
1、DefaultWatcher
package com.ai.xiajw.watch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import java.util.concurrent.CountDownLatch;
public class DefaultWatcher implements Watcher {
private CountDownLatch countDownLatch;
public DefaultWatcher(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState keeperState = watchedEvent.getState();
Event.EventType eventType = watchedEvent.getType();
if(keeperState.equals(Event.KeeperState.SyncConnected) && eventType.equals(Event.EventType.None)){ // zookeeper连接成功
countDownLatch.countDown();
System.out.println("zookeeper 创建连接成功........");
}
}
}
作用:监控zookeeper连接状态,防止zookeeper连接还未成功建立就进行其他zookeeper操作。
2、LeaderNodeWatcher
package com.ai.xiajw.watch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import java.util.concurrent.atomic.AtomicInteger;
public class LeaderNodeWatcher implements Watcher {
private AtomicInteger state;
public LeaderNodeWatcher(AtomicInteger state){
this.state = state;
}
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState keeperState = watchedEvent.getState();
Event.EventType eventType = watchedEvent.getType();
if(eventType.equals(Event.EventType.NodeDeleted)){
System.out.println("leader node deleted!");
state.getAndI