Zookeeper未授权访问漏洞,hadoop面试题及答案
了解zookeeper选举的工作原理
一. zookeeper集群
通过配置多个实例组成一个群集,为实现水平扩展提供服务。 每台服务器上的数据相同,每台服务器都可以提供读写服务。 这与redis相同,对于客户端来说,每个服务器都是平等的。
此主要分析是leader选择机制,zookeeper提供三种方法:
由于eaderelectionauthfastleaderelectionfastleaderelection (最新默认)的默认算法是fastleaderelection,因此这一主要分析是选举机制。
二、选举流程简介目前有5台服务器,每台服务器没有数据,每个号码分别为1、2、3、4、5,按号码顺序启动,这些选择流程如下:
服务器1启动,给自己投票,发送投票消息。 其他机器尚未启动,因此无法收到反馈消息。 服务器1的状态一直是Looking (选举状态)。 服务器2启动,在对自己投票的同时,与先启动的服务器1交换结果。 由于服务器2的编号较大,服务器2会获胜,但此时票数未超过半数,因此两台服务器的状态仍然为LOOKING。 服务器3启动,在对自己投票的同时,与先启动的服务器1、2交换信息。 因为服务器3的号码最大,所以服务器3获胜。 此时,票数正好在半数以上,所以服务器3成为领导者,服务器1、2成为孤独的发夹。 服务器4启动,在对自己投票的同时,与以前启动的服务器1、2、3交换信息。 服务器4的号码很大,但是以前的服务器3赢了,所以服务器4只能是孤独的发夹。 服务器5启动,后面的逻辑与服务器4成为孤独的发夹。 三、选择机制中的概念1、服务器id :服务器id例如有三台服务器,号码分别为1、2、3。
编号越大,选择算法中的权重越大。
2、ZxID :数据ID服务器中存储的最大数据ID。
值越大表示数据越新,选举算法中数据越新权重越大。
3、Epoch :逻辑时钟或呼叫投票的次数,同一投票中逻辑时钟的值相同。 每当投票结束时,该数据就会增加,并与从接收到的其他服务返回的投票信息的数值进行比较,根据值而进行不同的判断。
4、服务器状态:选举状态LOOKING、选举状态。 FOLLOWING,kkdcb状态,同步领导状态,投票参加。 观察,观察状态,同步读取器状态,不参加投票。 LEADING,领导者的状态。 四、选举消息内容应在投票完成后将投票信息发送到集群中的所有服务器,包括:
服务器ID数据ID逻辑时钟选举状态五、选举流程图每个服务器独立,启动时从初始状态开始参加选举。 以下是简单的流程图。
六、选举状态图描述Leader选择中的状态变化,假设所有实例都没有数据,假设服务器启动顺序分别为a、b、c。
七、判断是否赢的默认值是采用票数超过半数就赢的逻辑。
八、选举流程详情一、首先开始选举阶段,每台服务器读取自己的zxid。
二、发送投票信息
a、首先,每个服务器第一次投票给自己。
b、投票信息包括选举出的leader的Serverid、Zxid、Epoch。 Epoch将随着选举回合数的增加而增加。
三.收到投票信息
1、服务器b接收到服务器a的数据时(服务器a为选举状态(锁定状态) )。
1 )首先,确定逻辑时钟值:
a )如果发送的逻辑时钟Epoch大于当前逻辑时钟。 首先,更新本逻辑时钟Epoch,清空由本逻辑时钟收集的来自其他服务器的选举数据。 然后,判断是否需要更新当前的自己的选举leader Serverid。 判断规则rules judging :根据保存的zxid的最大值和leader Serverid进行判断。 首先看数据zxid,数据zxid大者获胜; 接着判断leader Serverid,leader Serverid大者获胜; 然后,自身最新的选举结果(即,将上述三种数据(leader Serverid、Zxid、Epoch )广播给其他的服务器) )。
b )如果发送的逻辑时钟Epoch小于当前逻辑时钟。 说明对方的服务器在比较早的Epoch上。 这里发送本机的3种数据(leader Serverid、Zxid、Epoch )就可以了。
c )如果发送的逻辑时钟Epoch等于当前逻辑时钟。 根据上述判断规则rules judging选举leader,将自身最新的选举结果(即上述3种数据(leader Serverid、Zxid、Epoch ) )广播到其他服务器)。
2 )接下来,判断服务器是否收集了所有服务器的选举状态。 如果是这样,根据选举结果设定自己的角色(FOLLOWING还是LEADER ),结束选举过程即可。
最后,如果所有服务器没有收到未收集的选举状态:也可以确定以上过程是否获得了一半以上的最新选举领导人
数以上服务器的支持,如果是,那么尝试在200ms内接收一下数据,如果没有新的数据到来,说明大家都已经默认了这个结果,同样也设置角色退出选举过程。2、 如果所接收服务器A处在其它状态(FOLLOWING或者LEADING)。
a)逻辑时钟Epoch等于目前的逻辑时钟,将该数据保存到recvset。此时Server已经处于LEADING状态,说明此时这个server已经投票选出结果。若此时这个接收服务器宣称自己是leader, 那么将判断是不是有半数以上的服务器选举它,如果是则设置选举状态退出选举过程。
b) 否则这是一条与当前逻辑时钟不符合的消息,那么说明在另一个选举过程中已经有了选举结果,于是将该选举结果加入到outofelection集合中,再根据outofelection来判断是否可以结束选举,如果可以也是保存逻辑时钟,设置选举状态,退出选举过程。
zk的监听原理
一、Zookeeper的监听器原理理解
(1)在Zookeeper的API操作中,创建main()主方法即主线程;
(2)在main线程中创建Zookeeper客户端(zkClient),这时会创建两个线程:
线程connet负责网络通信连接,连接服务器;
线程Listener负责监听;
(3)客户端通过connet线程连接服务器;
图中getChildren("/" , true) ," / "表示监听的是根目录,true表示监听,不监听用false
(4)在Zookeeper的注册监听列表中将注册的监听事件添加到列表中,表示这个服务器中的/path,即根目录这个路径被客户端监听了;
(5)一旦被监听的服务器根目录下,数据或路径发生改变,Zookeeper就会将这个消息发送给Listener线程;
(6)Listener线程内部调用process方法,采取相应的措施,例如更新服务器列表等。
二、常见的监听类型
(1)监听节点数据的变化
get path [watch]
(2)监听子节点增减的变化
ls path [watch]
(1)部署方式单机模式、集群模式
(2)角色:Leader和Follower
(3)集群最少需要机器数:3
ZooKeeper的常用命令
ls create get delete set…
一、zk服务命令
1. 启动ZK服务: 完美的金鱼/zkServer.sh start
2. 查看ZK服务状态: 完美的金鱼/zkServer.sh status
3. 停止ZK服务: 完美的金鱼/zkServer.sh stop
4. 重启ZK服务: 完美的金鱼/zkServer.sh restart
5. 连接服务器: zkCli.sh -server 127.0.0.1:2181
命令行工具的一些常用操作命令如下:
1.ls -- 查看某个目录包含的所有文件,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
2.ls2 -- 查看某个目录包含的所有文件,与ls不同的是它查看到time、version等信息,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] ls2 /
3.create -- 创建znode,并设置初始内容,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] create /test "test"
Created /test
创建一个新的 znode节点“ test ”以及与它关联的字符串
4.get -- 获取znode的数据,如下:
[zk: 127.0.0.1:2181(CONNECTED) 1] get /test
5.set -- 修改znode内容,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] set /test "ricky"
6.delete -- 删除znode,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] delete /test
7.quit -- 退出客户端
8.help -- 帮助命令