linux怎么查看本机内存大小
274
2022-09-28
搞不定Zookeeper面试,速看全面Zookeeper面试题及答案整理总结
Zookeeper是一个开源的分布式协调服务,由雅虎创建是Google Chubby的开源实现。分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列等功能。
ZooKeeper是什么?
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper提供了什么?ZooKeeper提供了文件系统和通知机制。Zookeeper文件系统是什么?ZooKeeper的命名空间就是 ZooKeeper 应用的文件系统,它和Linux的文件系统很像,也是树状,这样就可以确定每个路径都是唯一的,对于命名空间的操作必须都是绝对路径操作。与Linux文件系统不同的是,Linux文件系统有目录和文件的区别,而**ZooKeeper统一叫znode,**一个znode节点可以包含子znode,同时也可以包含数据。
znode即是文件夹又是文件的概念,所以在ZooKeeper中既不叫文件也不叫文件夹,而是叫znode,每个znode有唯一的路径标识,既能存储数据也能创建子znode。但是znode只适合存储非常小的数据,不能超过1M,最好都小于1K。
Zookeeper是如何保证事务的顺序一致性的?
Zookeeper采用了全局递增的事务Id来标识,所有的proposal(提议)都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch(时期; 纪元; 世; 新时代)用来标识leader周期,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。
当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
分布式集群中为什么会有Master?
在分布式环境中有些业务逻辑只需要集群中的某一台服务器进行执行,其他的服务器可以共享这个结果即可,这样可以大大减少重复计算从而提高性能,于是就需要进行master选举。
Zookeeper是如何选取主leader的?
当leader崩溃或者leader失去大多数的follower,这时zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。1、Zookeeper选主流程(basic paxos)1)选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;2)选举线程首先向所有Server发起一次询问(包括自己);3)选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;4)收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;5)线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。2、Zookeeper选主流程(fast paxos)
fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。
说一说对Zookeeper分布式锁如何理解的?
分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性。
Zookeeper有哪几种几种部署模式?
单机模式:Zookeeper只运行在一台服务器上,适合测试环境;伪集群模式:一台物理机上运行多个Zookeeper实例;
集群模式:Zookeeper运行在一个物理集群上,适合生产环境。
集群不得少于几台服务器,集群规则是什么?
集群不得少于3台服务器,集群规则是可用节点数量大于总节点数量除以二。
Zookeeper的java客户端都有哪些?
Zookeeper的java客户端是自带的zkclient及Apache开源的Curator。
说一说zookeeper常用的命令有哪些?
常用命令包括ls ls2 get set create deleteall rmr等。
ZAB和Paxos算法的联系与区别?
ZAB协议并不是Paxos算法的一个典型实现,在讲解ZAB和Paxos之间的区别之前,我们首先来看下两者的联系。两者都存在一个类似于Leader进程的角色,由其负责协调多个Follow进程的运行。Leader进程都会等待超过半数的Follower做出正确的反馈后,才会将一个提案进行提交。在ZAB协议中,每个Proposal中都包含了一个epoch值,用来代表当前Leader周期,在Paxos算法中,同样存在这样一个标识,只是名字变成了Ballot。在Paxos算法中,一个新选举产生的主进程会进行两个阶段的工作。第一阶段被称为读阶段,在这个阶段中,这个新的主进程会通过和所有其他进程进行通信的方式来收集上一个主进程的提案,并将他们提交。第二阶段被称为写阶段,在这个阶段,当前主进程开始提出他自己的提案。在Paxos算法设计的基础上,ZAB协议额外添加了一个同步阶段。在同步阶段之前,ZAB协议也存在一个和Paxos算法中的读阶段非常类似的过程,称为发现(Discovery)阶段。在同步阶段中,新的Leader会确保存在过半的Follower已经提交了之前Leader周期中的所有事务Proposal。这一同步阶段的引入,能够有效地保证Leader在新的周期中提出事务Proposal之前,所有的进程都已经完成了对之前所有事务Proposal的提交。一旦完成同步阶段后,那么ZAB就会执行和Paxos算法类似的写阶段。
总的来讲,ZAB协议和Paxos算法的本质区别在于,两者的设计目标不太一样。ZAB协议主要用于构建一个高可用的分布式数据主备系统,例如ZooKeeper,而Paxos算法则是用于构建一个分布式的一致性状态机系统。
Zookeeper负载均衡和Nginx负载均衡有什么区别?
Zookeeper的负载均衡是可以调控,Nginx只是能调权重,其他需要可控的部分是需要单独编写插件;但是Nginx的吞吐量比Zookeeper大很多,通常情况下都是按业务选择使用哪种方式。
说一说客户端注册Watcher实现原理?
Zookeeper 提供的了分布式数据的公布/订阅功能,通过Watch机制来实现这样的分布式的通知功能。Zookeeper 同意client向server注册一个Watch监听。当服务端的一些指定的事件触发了这个Watch 。就会向指定的client发送一个事件通知来实现分布式通知。整个Watch的注册和通知过程如图
Zookeeper的Watcher 机制主要包含client现成、client WatchManager、Zookeeper server三部分。
详细流程:client 向Zookeeper注册的同一时候。把Watcher对象存储在client的WatchManager中,当Zookeeperserver端触发Watcher事件后,会向client发送通知。client线程从WatchManager中取出相应的Watcher对象运行回调逻辑。
集群支持动态添加服务器吗?
Zookeeper集群动态添加服务器其实就是水平扩容,Zookeeper在这方面不太好。两种方式:全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。
Zookeeper3.5版本开始支持动态扩容。
Zookeeper节点宕机如何处理?
Zookeeper本身也是集群,推荐配置不少于3个服务器。Zookeeper自身也要保证当一个节点宕机时,其他节点会继续提供服务。如果是一个Follower宕机,还有2台服务器提供访问,因为Zookeeper上的数据是有多个副本的,数据并不会丢失;如果是一个Leader宕机,Zookeeper会选举出新的Leader。Zookeeper集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在Zookeeper节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。
因此3个节点的cluster可以挂掉1个节点(leader可以得到2票>1.5);2个节点的cluster就不能挂掉任何1个节点了(leader可以得到1票<=1)。
Zookeeper对节点的watch监听通知是永久的吗?为什么?Zookeeper对节点的watch监听通知不是持久的,主要是因为Zookeeper无法保证性能。使用watch需要注意以下几点要求:1)Watches通知是一次性的,必须重复注册。2)发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。3)节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。4)对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除。5)同一个Zookeeper客户端对某一个节点注册相同的watch,只会收到一次通知。
6)Watcher对象只会保存在客户端,不会传递到服务端。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~