zookeer-梳理及知识点解析之ZAB算法及基本使用
1.ZAB选举过程描述
1.1选举场景
a.集群第一次启动
b.集群重启,leader挂了
1.2 leader满足的条件
a.经验最丰富 zxid
b.myid
c.过半通过的数据才是真数据,你见到的可用的zxid
1.3 ZK选举过程
a.3888造成两两连通
b.只要任何人投票都会出发那个准leader投票
c.推选制,先比较zxid,如果zxid相同,再比较myid
2.具体案例描述选举过程
集群4台机器,3台过半
选举过程描述:
a.当leader node04挂了后,假设node01率先发起投票,他将投票请求发送分别发送node02和node03,同时投自己一票。
b.当node02收到请求后,将请求信息中的zxid和自己本地zxid做比较,如果node02中的zxid大于node01的zxid,将触发node02发起投票,将自己投票请求发送给node01和node03,
c.当node01收到node02的投票请求后,发现node02的zxid,大于自己本地zxid,它将支持node02,放弃选举自己。
d.同理node03也会和node02进行相同的操作。
b.最终会快速选举出leader,恢复集群可用信息。
3.zookeeper client API基本使用
`
public class ZookeeperApp{
public static void main(String[] args){
//zk有session的概念,没有连接池的概念
//watch: 观察回调,回调。
//watch的注册值发生在 读类型调用
//第一类:new zk 时候,传入的watch,这个watch,session级别的,跟path 、node没有关系
Zookeeper zk = new Zookeeper("192.168.7.230:2181,192.168.7.241:2181,192.168.7.71:2181",5000,new Watcher(){
@Overridde
public void process(WatchedEvent event){
Event.KeeperState state = event.getState();
Event.EventType type = event.getType();
String path = event.getPath();
switch(state){
case Unknown:
break;
case Disconnected:
break;
case NoSyncConnected:
break;
case SyncConnected:
break;
case AuthFailed:
break;
case connectedReadOnly:
break;
case SaslAuthenticated:
break;
case Expire:
break;
}
switch(type){
case None:
break;
case NodeCreated:
break;
case NodeDeleted:
break;
case NodeDataChanged:
break;
case NodeChildrenChanged:
break;
}
}
});
Zookeeper.State state = zk.getState();
switch(state){
case CONNECTING:
break;
case ASSOCIATING:
break;
case CONNECTD:
break;
case CONNECTEDREADONLY:
break;
case CLOSED:
break;
case AUTH_FAILED:
break;
case NOT_CONNECTED:
break;
}
String pathName = zk.create("/bigData","hadoop".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CREATE_MODE.EPHEMERAL);
Stat stat = new Stat();
byte[] node = zk.getData("/bigData",new Watcher(){
@Overridde
public void process(WatchedEvent envnt){
zk.getData("/bigData",stat);
}
},stat);
Stat stat1 = zk.setData("/bigData","spark".getBytes(),0);
Stat stat2 = zk.setData("/bigData","spark01".getBytes(),stat1.getVersion());
zk.getData("/bigData",false,new AsyncDataCallback.DataCallback(){
@Overridde
public void processResult(int rc,String path,Object ctx,byte[] data,Stat stat){
System.out.println(new String(data));
}
},"hadoop");
}
}