zk服务器的启动,状态,停止
zkServer.sh start | status | stop
zk服务的进程: QuorumPeerMain
zk客户端的启动:
zkCli.sh 默认连接当前机器的zk服务
zkCli.sh -server host:port 连接指定host的zk服务
zk客户端的停止:
quit
zk客户端的进程: ZooKeeperMain
2.1 持久节点: 客户端与zk服务断开连接后,持久节点不会被删除(除非手动删)
1) 普通持久节点
2) 带序号的持久节点(序号Zookeeper自己维护)
2.2 短暂节点: 客户端与zk服务断开连接后,短暂节点会自动删除
1) 普通短暂节点
2) 带序号的短暂节点(序号Zookeeper自己维护)
4.1 ZAB协议: 基于消息传递且保证数据一致性的一种算法(协议)
4.2 ZAB协议的目标:
1) 没有的leader的情况选举leader
2) 有leader的情况,去尽可能保证数据一致.
4.3 半数机制: 整个zk集群中,只有有半数以上的机器存活,zk集群就能对外提供服务. 也就意味着在启动zk集群时,只要启动的机器数超过半数,leader也就能选举出来.
4.4 zk集群中的机器角色
1) leader: 领导者(只有一个)
2) follower: 跟随者(可有多个)
4.5 leader选举过程:
关注点: 集群中的每台机器中都没有存储任何数据(生来平等:zxid都一样)
选择过程: 有5台机器,分别给5台机器进行编号(myid),例如: 1 2 3 4 5 ,
假设按照1 2 3 4 5 的顺序启动机器(且假设真正启动起来的顺序也是1 2 3 4 5 )
投票: 自私原则 ,墙头草随风倒.
启动server1: 第一票投给自己(1,zxid),此时,机器数没有达到半数,leader未选举
启动server2: 第一票投给自己(2,zxid),server2将(2,zxid)投给server1, server1将(1,zxid)投给server2,
server2比较自己的投票(2,zxid) 与 server1的投票(1,zxid), 2 >1 , 则server2保持自己的投票
server1比较自己的投票(1,zxid) 与 server2的投票(2,zxid) 1 <2 , 技不如人,改变投票,server1改投(2,zxid), 因此最终server2有两票. 但是机器数没有达到半数,leader未选举
启动server3: 第一票投给自己(3,zxid)
server3接收到server1的(1,zxid), server2的(2,zxid) ,3 > 2 >1 ,server3保持自己的投票(3,zxid)
server2接收到server3的(3,zxid), serser1的(1,zxid) , 2 < 3 , 改变投票为(3,zxid)
server1接收到server3的(3,zxid), server2的(2,zxid) , 1 < 2< 3, 改变投票为(3,zxid)
因此最终server3有3票, 机器数也达到半数, server3当选为leader, server1 和 server2 为follower
启动server4: 因为集群已经有leader存在, server4注定就是follower
启动server5: 因为集群已经有leader存在, server5注定就是follower
当集群工作中,leader故障后,只要剩下的机器数大于半数, 集群能够正常工作,但是需要重新选举leader。
选举的过程还是进行投票, 因为集群是在工作中,因此每台机器的zxid有可能不同.
那么每次投出的票(myid,zxid) , 先比较zxid,再比较myid,因此集群中剩余的机器中zxid最大的当选为leader,
如果zxid都一样,理论情况下myid最大的当选leader.
zxid: 某种意义上,可以表示当前机器中存储的数据的完整度.
1). 安装zk
2). 在zk的安装目录下,创建zkData目录
3). 修改zoo.cfg文件:
dataDir=/opt/module/zookeeper-3.5.7/zkData
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
4). 在zkData下创建myid文件,指定当前机器的myid号
hadoop102 -->2
hadoop103 -->3
hadoop104 -->4
重点:
public void deleteAll(String path , ZooKeeper zk) throws KeeperException, InterruptedException {
List<String> children = zk.getChildren(path, false);
if(children.size()==0){
zk.delete(path,-1);
}else {
for (String child : children) {
String cpath = path + "/" +child;
deleteAll(cpath,zk);
}
deleteAll(path,zk);
}
}
2) 思考Hadoop中
对于HDFS , 如何应对NameNode的故障?
对于Yarn , 如何应对ResourceManager的故障?
本文地址:https://blog.csdn.net/qq_43206800/article/details/107574959
如对本文有疑问, 点击进行留言回复!!
同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题!
【JavaScript笔记(一)】万丈高楼平地起 - 基本概念篇
轻松解决 org.apache.taglibs.standard.tlv.JstlCoreTLV 困惑
网友评论