当前位置: 首页 新闻详细

java面试题基础(java面试题基础)|Java面试题Zookeeper篇

专业小程序设计开发——助力新电商新零售

电话+V:159999-78052,欢迎咨询保险类型java面试题及答案详解,[小程序设计与开发],[小程序投流与推广],[小程序后台搭建],[小程序整套源码打包],[为个体及小微企业助力],[电商新零售模式],[小程序运营推广及维护]

一、java面试题基础(java面试题基础)

java经典面试题

抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

java异常机制的原理与应用每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。

Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。

java中变量在内存中的分配类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。

Java基础知识Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。

Java面试题,基本都是Java基础题目,大家看看咋做

prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。

构造方法常用于初始化,可以传几个参数进去。不写构造方法默认会有一个参数空的构造方法,如果你写了带参数构造方法最好加上空的,因为系统此时不会帮你加了。jdkjava开发包,jrejava运行环境。

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。Java支持多继承么?不支持,Java不支持多继承。

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。

java异常机制的原理与应用每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。

第三,StaticNestedClass和InnerClass的不同,说得越多越好(面试题有的很笼统)。NestedClass(一般是C++的说法),InnerClass(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。

Java基础知识面试题异常相关的选择题

(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。(2)一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。

A错,有些异常表示的错误是不可恢复的,只能中断程序的执行,如java虚拟机发生的内部异常。B错,在catch语句中,也可以用Exception的子类来引用异常。C对。D错,main也可以。

实例变量是类的成员变量。正确实例变量用关键字static声明。错误在一个class中定义的变量,如果是以static修饰的变量,就是公共实例变量,如果没有,就是实例变量。这两类变量自然都是成员变量。

常见的有1在方法签名处抛出异常2在需要扑捉异常的地方用trycatch语句来捕捉java语言采取了一个统一的异常处理机制。什么是异常?运行时发生的可被捕获和处理的错误。在java语言中,Exception是所有异常的父类。

(对)在异常处理中,若try中的代码可能产生多种异常则可以对应多个catch语句,若catch中的参数类型有父类子类关系,此时应该将父类放在后面,子类放在前面。

java基础面试题有哪些?

1、正如圈内的大佬所说的那样,基础很重要。浙江优就业的老师帮你总结一下。

2、java异常机制的原理与应用每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。

3、Java基础知识Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。

4、面试题。java基础部分(常见的):java有几种基本数据类型。

5、面向对象基础类java基础类描述一下java的访问修饰符,和它们之间的区别?如果可以回到出public,private,protected,就算是ok;回答出default的,加分。

谁有比较全面的的Java面试题?

去Java面试题库app。去Java面试题库app可以看比较全面的java面试题,Java面试题库app提供全面的java基础面试题,java基础知识点。

java异常机制的原理与应用每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。

第三,StaticNestedClass和InnerClass的不同,说得越多越好(面试题有的很笼统)。NestedClass(一般是C++的说法),InnerClass(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。

二、Java面试题及答案整理(2024年金三银四最新版,持续更新)


Java面试题及答案整理(2024年金三银四版)


金三银四求职季,我们整理了一份详尽的Java面试指南,覆盖了MyBatis、Zookeeper、Dubbo等技术热点,以及Java基础、并发编程、Spring等核心知识点。以下是部分精华内容:



  • JDK与JRE的区别:JDK包含了JRE,不仅有编译器javac和调试工具,JDK还需编译才能运行,而JRE则用于直接运行Java程序。

  • ==与equals的区别:==用于基本类型比较值,引用类型则比较引用;equals默认是引用比较,但在String和Integer等类中通常实现为值比较。

  • hashCode与equals的关系:哈希码相同不一定equals为true,如"通话"与"重地"的哈希码相同,但它们不相等。

  • final的作用:final用于修饰类、方法和变量,表示不可变性或方法不可被重写,如final类不能被继承。

  • Math.round(-1.5)的计算:结果为-1,因为取整时,负数0.5会被舍弃。

  • String类操作和区别:String操作类包括String、StringBuffer和StringBuilder,区别在于String不可变,而后两者允许修改。


  • 继续查看完整指南,包括容器类、多线程、反射、对象拷贝、Web技术、数据库管理以及Spring框架等内容,涵盖面试中不可或缺的各类知识点。想要获取全部内容的朋友,请点击相关链接获取详细资料。


    Java面试题Zookeeper篇

    原创2023-06-15 07:12·第三视角1,说说Zookeeper是什么?直译:从名字上直译就是动物管理员,动物指的是Hadoop一类的分布式软件,管理员三个字体现了ZooKeeper的特点:维护、协调、管理、监控。

    简述:有些软件你想做成集群或者分布式,你可以用ZooKeeper帮你来辅助实现。

    特点:

  • 最终一致性:客户端看到的数据最终是一致的。
  • 可靠性:服务器保存了消息,那么它就一直都存在。
  • 实时性:ZooKeeper不能保证两个客户端同时得到刚更新的数据。
  • 独立性(等待无关):不同客户端直接互不影响。
  • 原子性:更新要不成功要不失败,没有第三个状态。
  • 注意:回答面试题,切忌只是简单一句话回答,可以将你对概念的理解,特点等多个方面描述一下,哪怕你自己认为不完全切中题意的也可以说说,面试官不喜欢会打断你的,你的目的是让面试官认为你是好沟通的。当然了,如果不会可别装作会,说太多不专业的想法。

    2,ZooKeeper有哪些应用场景?数据发布与订阅

    发布与订阅即所谓的配置管理,顾名思义就是将数据发布到ZooKeeper节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使用数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到ZooKeeper的一个或一系列的节点上,供订阅者进行数据订阅,达到动态获取数据的目的。

    配置信息一般有几个特点:

  • 1.数据量小的KV
  • 2.数据内容在运行时会发生动态变化
  • 3.集群机器共享,配置一致

  • ZooKeeper采用的是推拉结合的方式。

  • 1.推:服务端会推给注册了监控节点的客户端Wathcer事件通知
  • 2.拉:客户端获得通知后,然后主动到服务端拉取最新的数据
  • 命名服务

    作为分布式命名服务,命名服务是指通过指定的名字来获取资源或者服务的地址,利用ZooKeeper创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

    统一命名服务的命名结构图如下所示:


    1、在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。

  • 类似于域名与IP之间对应关系,IP不容易记住,而域名容易记住。
  • 通过名称来获取资源或服务的地址,提供者等信息。
  • 2、按照层次结构组织服务/应用名称。

  • 可将服务名称以及地址信息写到ZooKeeper上,客户端通过ZooKeeper获取可用服务列表类。
  • 配置管理

    程序分布式的部署在不同的机器上,将程序的配置信息放在ZooKeeper的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watch通知给各个客户端从而更改配置。

    ZooKeeper配置管理结构图如下所示:


    1、分布式环境下,配置文件管理和同步是一个常见问题。

  • 一个集群中,所有节点的配置信息是一致的,比如Hadoop集群。
  • 对配置文件修改后,希望能够快速同步到各个节点上。
  • 2、配置管理可交由ZooKeeper实现。

  • 可将配置信息写入ZooKeeper上的一个Znode。
  • 各个节点监听这个Znode。
  • 一旦Znode中的数据被修改,ZooKeeper将通知各个节点。
  • 集群管理

    所谓集群管理就是:是否有机器退出和加入、选举master。

    集群管理主要指集群监控和集群控制两个方面。前者侧重于集群运行时的状态的收集,后者则是对集群进行操作与控制。开发和运维中,面对集群,经常有如下需求:

  • 1.希望知道集群中究竟有多少机器在工作
  • 2.对集群中的每台机器的运行时状态进行数据收集
  • 3.对集群中机器进行上下线的操作
  • 集群管理结构图如下所示:


    1、分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整。

    2、可交由ZooKeeper实现。

  • 可将节点信息写入ZooKeeper上的一个Znode。
  • 监听这个Znode可获取它的实时状态变化。
  • 3、典型应用

  • Hbase中Master状态监控与选举。
  • 利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建/currentMaster节点,最终一定只有一个客户端请求能够创建成功

    分布式通知与协调

    1、分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。

  • a)NameNode需知道各个Datanode的状态。
  • b)JobTracker需知道各个TaskTracker的状态。
  • 2、心跳检测机制可通过ZooKeeper来实现。

    3、信息推送可由ZooKeeper来实现,ZooKeeper相当于一个发布/订阅系统。

    分布式锁

    处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁。

    分布式锁具有以下特性:写锁、读锁、时序锁。

    写锁:在zk上创建的一个临时的无编号的节点。由于是无序编号,在创建时不会自动编号,导致只能客户端有一个客户端得到锁,然后进行写入。

    读锁:在zk上创建一个临时的有编号的节点,这样即使下次有客户端加入是同时创建相同的节点时,他也会自动编号,也可以获得锁对象,然后对其进行读取。

    时序锁:在zk上创建的一个临时的有编号的节点根据编号的大小控制锁。

    分布式队列

    分布式队列分为两种:

    1、当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。

  • a)一个job由多个task组成,只有所有任务完成后,job才运行完成。
  • b)可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时的Znode,一旦临时节点数目达到task总数,则表明job运行完成。
  • 2、队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。

    3、说说Zookeeper的工作原理?Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。

    Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。

    Zab协议的全称是ZookeeperAtomicBroadcast**(Zookeeper原子广播)。Zookeeper是通过Zab协议来保证分布式事务的最终一致性。Zab协议要求每个Leader都要经历三个阶段:发现,同步,广播。

    当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

    为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

    epoch:可以理解为皇帝的年号,当新的皇帝leader产生后,将有一个新的epoch年号。

    每个Server在工作过程中有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻。
  • LEADING:当前Server即为选举出来的leader。
  • FOLLOWING:leader已经选举出来,当前Server与之同步。
  • 4,请描述一下Zookeeper的通知机制是什么?Zookeeper允许客户端向服务端的某个znode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据Watcher通知状态和事件类型做出业务上的改变。

    大致分为三个步骤:

  • 客户端注册Watcher
  • 1、调用getData、getChildren、exist三个API,传入Watcher对象。

    2、标记请求request,封装Watcher到WatchRegistration。

    3、封装成Packet对象,发服务端发送request。

    4、收到服务端响应后,将Watcher注册到ZKWatcherManager中进行管理。

    5、请求返回,完成注册。

  • 服务端处理Watcher
  • 1、服务端接收Watcher并存储。

    2、Watcher触发、调用process方法来触发Watcher。

  • 客户端回调Watcher
  • 1,客户端SendThread线程接收事件通知,交由EventThread线程回调Watcher。

    2,客户端的Watcher机制同样是一次性的,一旦被触发后,该Watcher就失效了。

    client端会对某个znode建立一个watcher事件,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。

    5,Zookeeper对节点的watch监听通知是永久的吗?不是,一次性的。无论是服务端还是客户端,一旦一个Watcher被触发,Zookeeper都会将其从相应的存储中移除。这样的设计有效的减轻了服务端的压力,不然对于更新非常频繁的节点,服务端会不断的向客户端发送事件通知,无论对于网络还是服务端的压力都非常大。

    6,Zookeeper集群中有哪些角色?

    在一个集群中,最少需要3台。或者保证2N+1台,即奇数。为什么保证奇数?主要是为了选举算法。

    7,Zookeeper集群中Server有哪些工作状态?
  • LOOKING
  • 寻找Leader状态;当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态

  • FOLLOWING
  • 跟随者状态;表明当前服务器角色是Follower

  • LEADING
  • 领导者状态;表明当前服务器角色是Leader

  • OBSERVING
  • 观察者状态;表明当前服务器角色是Observer

    8,Zookeeper集群中是怎样选举leader的?当Leader崩溃了,或者失去了大多数的Follower,这时候Zookeeper就进入恢复模式,恢复模式需要重新选举出一个新的Leader,让所有的Server都恢复到一个状态LOOKING

    Zookeeper有两种选举算法:基于basicpaxos实现和基于fastpaxos实现。默认为fastpaxos由于篇幅问题,这里推荐:选举流程

    9,Zookeeper是如何保证事务的顺序一致性的呢?Zookeeper采用了递增的事务id来识别,所有的proposal(提议)都在被提出的时候加上了zxid。zxid实际上是一个64位数字。

    高32位是epoch用来标识Leader是否发生了改变,如果有新的Leader产生出来,epoch会自增。低32位用来递增计数。当新产生的proposal的时候,会依据数据库的两阶段过程,首先会向其他的Server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。

    10,ZooKeeper集群中个服务器之间是怎样通信的?Leader服务器会和每一个Follower/Observer服务器都建立TCP连接,同时为每个Follower/Observer都创建一个叫做LearnerHandler的实体。

  • LearnerHandler主要负责Leader和Follower/Observer之间的网络通讯,包括数据同步,请求转发和proposal提议的投票等。
  • Leader服务器保存了所有Follower/Observer的LearnerHandler。
  • 11,ZooKeeper分布式锁怎么实现的?如果有客户端1、客户端2等N个客户端争抢一个Zookeeper分布式锁。大致如下:

  • 1.大家都是上来直接创建一个锁节点下的一个接一个的临时有序节点
  • 2.如果自己不是第一个节点,就对自己上一个节点加监听器
  • 3.只要上一个节点释放锁,自己就排到前面去了,相当于是一个排队机制。
  • 而且用临时顺序节点的另外一个用意就是,如果某个客户端创建临时顺序节点之后,不小心自己宕机了也没关系,Zookeeper感知到那个客户端宕机,会自动删除对应的临时顺序节点,相当于自动释放锁,或者是自动取消自己的排队。

    本地锁,可以用JDK实现,但是分布式锁就必须要用到分布式的组件。比如ZooKeeper、Redis。

    网上代码一大段,面试一般也不要写,我这说一些关键点。

    几个需要注意的地方如下。

    死锁问题:锁不能因为意外就变成死锁,所以要用ZK的临时节点,客户端连接失效了,锁就自动释放了。

    锁等待问题:锁有排队的需求,所以要ZK的顺序节点。

    锁管理问题:一个使用使用释放了锁,需要通知其他使用者,所以需要用到监听。

    监听的羊群效应:比如有1000个锁竞争者,锁释放了,1000个竞争者就得到了通知,然后判断,最终序号最小的那个拿到了锁。其它999个竞争者重新注册监听。这就是羊群效应,出点事,就会惊动整个羊群。应该每个竞争者只监听自己前面的那个节点。比如2号释放了锁,那么只有3号得到了通知。

    12、了解Zookeeper的系统架构吗?

    ZooKeeper的架构图中我们需要了解和掌握的主要有:

    (1)ZooKeeper分为服务器端(Server)和客户端(Client),客户端可以连接到整个

    ZooKeeper服务的任意服务器上(除非leaderServes参数被显式设置,leader不允许接受客户端连接)。

    (2)客户端使用并维护一个TCP连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送心跳。如果这个TCP连接中断,客户端将自动尝试连接到另外的ZooKeeper服务器。客户端第一次连接到ZooKeeper服务时,接受这个连接的ZooKeeper服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。

    (3)上图中每一个Server代表一个安装Zookeeper服务的机器,即是整个提供Zookeeper服务的集群(或者是由伪集群组成);

    (4)组成ZooKeeper服务的服务器必须彼此了解。它们维护一个内存中的状态图像,以及持久存储中的事务日志和快照,只要大多数服务器可用,ZooKeeper服务就可用;

    (5)ZooKeeper启动时,将从实例中选举一个leader,Leader负责处理数据更新等操作,一个更新操作成功的标志是当且仅当大多数Server在内存中成功修改数据。每个Server在内存中存储了一份数据。

    (6)Zookeeper是可以集群复制的,集群间通过Zab协议(ZookeeperAtomicBroadcast)来保持数据的一致性;

    (7)Zab协议包含两个阶段:leaderelection阶段和AtomicBrodcast阶段。

  • a)集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。
  • b)当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。
  • c)当leader被选举出来,且大多数服务器完成了和leader的状态同步后,leadderelection的过程就结束了,就将会进入到Atomicbrodcast的过程。
  • d)AtomicBrodcast同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。
  • 13、Zookeeper为什么要这么设计?ZooKeeper设计的目的是提供高性能、高可用、顺序一致性的分布式协调服务、保证数据最终一致性。

    高性能(简单的数据模型)

  • 1.采用树形结构组织数据节点;
  • 2.全量数据节点,都存储在内存中;
  • 3.Follower和Observer直接处理非事务请求;
  • 高可用(构建集群)

  • 1.半数以上机器存活,服务就能正常运行
  • 2.自动进行Leader选举
  • 顺序一致性(事务操作的顺序)

  • 1.每个事务请求,都会转发给Leader处理
  • 2.每个事务,会分配全局唯一的递增id(zxid,64位:epoch+自增id)
  • 最终一致性

  • 1.通过提议投票方式,保证事务提交的可靠性
  • 2.提议投票方式,只能保证Client收到事务提交成功后,半数以上节点能够看到最新数据
  • 14、你知道Zookeeper中有哪些角色?系统模型:


    领导者(leader)

    Leader服务器为客户端提供读服务和写服务。负责进行投票的发起和决议,更新系统状态。

    学习者(learner)

    跟随者(follower)Follower服务器为客户端提供读服务,参与Leader选举过程,参与写操作“过半写成功”策略。

    观察者(observer)

    Observer服务器为客户端提供读服务,不参与Leader选举过程,不参与写操作“过半写成功”策略。用于在不影响写性能的前提下提升集群的读性能。

    客户端(client)

    服务请求发起方。

    15、你熟悉Zookeeper节点ZNode和相关属性吗?节点有哪些类型?Znode两种类型:

    持久的(persistent):客户端和服务器端断开连接后,创建的节点不删除(默认)。

    短暂的(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除。

    Znode有四种形式:

  • 持久化目录节点(PERSISTENT):客户端与Zookeeper断开连接后,该节点依旧存在持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
  • 客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号:临时目录节点(EPHEMERAL)
  • 客户端与Zookeeper断开连接后,该节点被删除:临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
  • 客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
  • 「注意」:创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。

    节点属性有哪些

    一个znode节点不仅可以存储数据,还有一些其他特别的属性。接下来我们创建一个/test节点分析一下它各个属性的含义。

    [zk:localhost:2181(CONNECTED)6]get/test456cZxid=0x59ac//ctime=MonMar3015:20:08CST2020mZxid=0x59admtime=MonMar3015:22:25CST2020pZxid=0x59accversion=0dataVersion=2aclVersion=0ephemeralOwner=0x0dataLength=3numChildren=0属性说明:


    16、请简述Zookeeper的选主流程?Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。leader选举是保证分布式数据一致性的关键。

    出现选举主要是两种场景:初始化、leader不可用。当zk集群中的一台服务器出现以下两种情况之一时,就会开始leader选举。

  • (1)服务器初始化启动。
  • (2)服务器运行期间无法和leader保持连接。
  • 而当一台机器进入leader选举流程时,当前集群也可能处于以下两种状态。

  • (1)集群中本来就已经存在一个leader。
  • (2)集群中确实不存在leader。
  • 首先第一种情况,通常是集群中某一台机器启动比较晚,在它启动之前,集群已经正常工作,即已经存在一台leader服务器。当该机器试图去选举leader时,会被告知当前服务器的leader信息,它仅仅需要和leader机器建立连接,并进行状态同步即可。

    重点是leader不可用了,此时的选主制度。投票信息中包含两个最基本的信息。

  • sid:即serverid,用来标识该机器在集群中的机器序号。
  • zxid:即zookeeper事务id号。
  • ZooKeeper状态的每一次改变,都对应着一个递增的Transactionid,,该id称为zxid.,由于zxid的递增性质,如果zxid1小于zxid2,,那么zxid1肯定先于zxid2发生。创建任意节点,或者更新任意节点的数据,或者删除任意节点,都会导致Zookeeper状态发生改变,从而导致zxid的值增加。

    以(sid,zxid)的形式来标识一次投票信息。

    例如:如果当前服务器要推举sid为1,zxid为8的服务器成为leader,那么投票信息可以表示为(1,8)集群中的每台机器发出自己的投票后,也会接受来自集群中其他机器的投票。每台机器都会根据一定的规则,来处理收到的其他机器的投票,以此来决定是否需要变更自己的投票。

    规则如下:

  • (1)初始阶段,都会给自己投票。
  • (2)当接收到来自其他服务器的投票时,都需要将别人的投票和自己的投票进行pk,规则如下:
  • 优先检查zxid。zxid比较大的服务器优先作为leader。如果zxid相同的话,就比较sid,sid比较大的服务器作为leader。

    所有服务启动时候的选举流程:三台服务器server1、server2、server3:

  • 1.server1启动,一台机器不会选举。
  • 2.server2启动,server1和server2的状态改为looking,广播投票
  • 3.server3启动,状态改为looking,加入广播投票。
  • 4.初识状态,互不认识,大家都认为自己是王者,投票也投自己为Leader。
  • 5.投票信息说明,票信息本来为五元组,这里为了逻辑清晰,简化下表达。
  • 初识zxid=0,sid是每个节点的名字,这个sid在zoo.cfg中配置,不会重复。

    节点

    sid

    server1

    1

    server2

    2

    server3

    3

  • 1.初始zxid=0,server1投票(1,0),server2投票(2,0),server3投票(3,0)
  • 2.server1收到投票(2,0)时,会先验证投票的合法性,然后自己的票进行pk,pk的逻辑是先比较zxid,server1(zxid)=server2(zxid)=0,zxid相等再比较sid,server1(sid)<server2(sid),pk结果为server2的投票获胜。server1更新自己的投票为(2,0),server1重新投票。
  • 3.TODO这里最终是2还是3,需要做实验确定。
  • 4.server2收到server1投票,会先验证投票的合法性,然后pk,自己的票获胜,server不用更新自己的票,pk后,重新在发送一次投票。
  • 5.统计投票,pk后会统计投票,如果半数以上的节点投出相同的票,确定选出了Leader。
  • 6.选举结束,被选中节点的状态由LOOKING变成LEADING,其他参加选举的节点由LOOKING变成FOLLOWING。如果有Observer节点,如果Observer不参与选举,所以选举前后它的状态一直是OBSERVING,没有变化。
  • 简单地说

    开始投票->节点状态变成LOOKING->每个节点选自己->收到票进行PK->sid大的获胜->更新选票->再次投票->统计选票,选票过半数选举结果->节点状态更新为自己的角色状态。

    17、为什么Zookeeper集群的数目,一般为奇数个?首先需要明确zookeeper选举的规则:leader选举,要求可用节点数量>总节点数量/2。

    比如:标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效。同样,Zookeeper选择领导者节点也是在超过一半节点同意时才有效。最后,Zookeeper是否正常是要根据是否超过一半的节点正常才算正常。这是基于CAP的一致性原理。

    zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。

    也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;

    同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;

    同理:

  • 2->0;两个zookeeper,最多0个zookeeper可以不可用。
  • 3->1;三个zookeeper,最多1个zookeeper可以不可用。
  • 4->1;四个zookeeper,最多1个zookeeper可以不可用。
  • 5->2;五个zookeeper,最多2个zookeeper可以不可用。
  • 6->2;两个zookeeper,最多0个zookeeper可以不可用。
  • ....

    会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢。

    zookeeper的选举策略也是需要半数以上的节点同意才能当选leader,如果是偶数节点可能导致票数相同的情况。

    18、知道Zookeeper监听器的原理吗?

  • 1.创建一个Main()线程。
  • 2.在Main()线程中创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)。
  • 3.通过connect线程将注册的监听事件发送给Zookeeper。
  • 4.将注册的监听事件添加到Zookeeper的注册监听器列表中。
  • 5.Zookeeper监听到有数据或路径发生变化时,把这条消息发送给Listener线程。
  • 6.Listener线程内部调用process()方法
  • 19、说说Zookeeper中的ACL权限控制机制?UGO(User/Group/Others)

    目前在Linux/Unix文件系统中使用,也是使用最广泛的权限控制方式。是一种粗粒度的文件系统权限控制模式。

    ACL(AccessControlList)访问控制列表

    包括三个方面:

    权限模式(Scheme)

    (1)IP:从IP地址粒度进行权限控制;(2)Digest:最常用,用类似于username:password的权限标识来进行权限配置,便于区分不同应用来进行权限控制;
  • (3)World:最开放的权限控制方式,是一种特殊的digest模式,只有一个权限标识“world:anyone”;
  • (4)Super:超级用户。
  • 授权对象

    授权对象指的是权限赋予的用户或一个指定实体,例如IP地址或是机器灯。

    权限Permission

  • (1)CREATE:数据节点创建权限,允许授权对象在该Znode下创建子节点
  • (2)DELETE:子节点删除权限,允许授权对象删除该数据节点的子节点
  • (3)READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等
  • (4)WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作
  • (5)ADMIN:数据节点管理权限,允许授权对象对该数据节点进行ACL相关设置操作
  • 20、Zookeeper有哪几种几种部署模式?Zookeeper有三种部署模式:

  • 1.单机部署:一台集群上运行;
  • 2.集群部署:多台集群运行;
  • 3.伪集群部署:一台集群启动多个Zookeeper实例运行。
  • 21、Zookeeper集群支持动态添加机器吗?其实就是水平扩容了,Zookeeper在这方面不太好。两种方式:

    全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。

    逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。

    3.5版本开始支持动态扩容。

    22、描述一下ZAB协议?ZAB协议是ZooKeeper自己定义的协议,全名ZooKeeper原子广播协议。

    ZAB协议有两种模式:Leader节点崩溃了如何恢复和消息如何广播到所有节点。

    整个ZooKeeper集群没有Leader节点的时候,属于崩溃的情况。比如集群启动刚刚启动,这时节点们互相不认识。比如运作Leader节点宕机了,又或者网络问题,其他节点Ping不通Leader节点了。

    这时就需要ZAB中的节点崩溃协议,所有节点进入选举模式,选举出新的Leader。整个选举过程就是通过广播来实现的。选举成功后,一切都需要以Leader的数据为准,那么就需要进行数据同步了。

    23、ZAB和Paxos算法的联系与区别?相同点:

    (1)两者都存在一个类似于Leader进程的角色,由其负责协调多个Follower进程的运行;(2)Leader进程都会等待超过半数的Follower做出正确的反馈后,才会将一个提案进行提交;
  • (3)ZAB协议中,每个Proposal中都包含一个epoch值来代表当前的Leader周期,Paxos中名字为Ballot
  • 不同点:

    ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统。

    24、ZooKeeper宕机如何处理?ZooKeeper本身也是集群,推荐配置奇数个服务器。因为宕机就需要选举,选举需要半数+1票才能通过,为了避免打成平手。进来不用偶数个服务器。

    如果是Follower宕机了,没关系不影响任何使用。用户无感知。如果Leader宕机,集群就得停止对外服务,开始选举,选举出一个Leader节点后,进行数据同步,保证所有节点数据和Leader统一,然后开始对外提供服务。

    为啥投票需要半数+1,如果半数就可以的话,网络的问题可能导致集群选举出来两个Leader,各有一半的小弟支持,这样数据也就乱套了。

    25、描述一下ZooKeeper的session管理的思想?分桶策略:

    简单地说,就是不同的会话过期可能都有时间间隔,比如15秒过期、15.1秒过期、15.8秒过期,ZooKeeper统一让这些session16秒过期。这样非常方便管理,看下面的公式,过期时间总是ExpirationInterval的整数倍。

    计算公式:

    ExpirationTime=currentTime+sessionTimeoutExpirationTime=(ExpirationTime/ExpirationInrerval+1)*ExpirationInterval,见图片:


    默认配置的session超时时间是在2tickTime~20tickTime。

    26、ZooKeeper负载均衡和Nginx负载均衡有什么区别?ZooKeeper:

    不存在单点问题,zab机制保证单点故障可重新选举一个Leader;
  • 只负责服务的注册与发现,不负责转发,减少一次数据交换(消费方与服务方直接通信)
  • 需要自己实现相应的负载均衡算法
  • Nginx:

  • 存在单点问题,单点负载高数据量大,需要通过KeepAlived辅助实现高可用
  • 每次负载,都充当一次中间人转发角色,本身是个反向代理服务器
  • 自带负载均衡算法
  • 27、说说ZooKeeper的序列化?序列化:

  • 内存数据,保存到硬盘需要序列化。
  • 内存数据,通过网络传输到其他节点,需要序列化。
  • ZK使用的序列化协议是Jute,Jute提供了Record接口。接口提供了两个方法:

  • serialize序列化方法
  • deserialize反序列化方法
  • 要系列化的方法,在这两个方法中存入到流对象中即可。

    28,在Zookeeper中Zxid是什么,有什么作用?Zxid,也就是事务id,为了保证事务的顺序一致性,ZooKeeper采用了递增的事务Zxid来标识事务。proposal都会加上了Zxid。Zxid是一个64位的数字,它高32位是Epoch用来标识朝代变化,比如每次选举Epoch都会加改变。低32位用于递增计数。

    Epoch:可以理解为当前集群所处的年代或者周期,每个Leader就像皇帝,都有自己的年号,所以每次改朝换代,Leader变更之后,都会在前一个年代的基础上加1。这样就算旧的Leader崩溃恢复之后,也没有人听它的了,因为Follower只听从当前年代的Leader的命令。

    29、讲解一下ZooKeeper的持久化机制?什么是持久化

  • 数据,存到磁盘或者文件当中。
  • 机器重启后,数据不会丢失。内存->磁盘的映射,和序列化有些像。
  • ZooKeeper的持久化:

  • SnapShot快照,记录内存中的全量数据
  • TxnLog增量事务日志,记录每一条增删改记录(查不是事务日志,不会引起数据变化)
  • 为什么持久化这么麻烦,一个不可用吗?

    快照的缺点,文件太大,而且快照文件不会是最新的数据。增量事务日志的缺点,运行时间长了,日志太多了,加载太慢。二者结合最好。

    快照模式:

    将ZooKeeper内存中以DataTree数据结构存储的数据定期存储到磁盘中。

    由于快照文件是定期对数据的全量备份,所以快照文件中数据通常不是最新的。

    见图片:


    30、Zookeeper选举中投票信息的五元组是什么?
  • Leader:被选举的Leader的SID
  • Zxid:被选举的Leader的事务ID
  • Sid:当前服务器的SID
  • electionEpoch:当前投票的轮次
  • peerEpoch:当前服务器的Epoch
  • Epoch>Zxid>Sid

    Epoch,Zxid都可能一致,但是Sid一定不一样,这样两张选票一定会PK出结果。

    31、说说Zookeeper中的脑裂?简单点来说,脑裂(Split-Brain)就是比如当你的cluster里面有两个节点,它们都知道在这个cluster里需要选举出一个master。那么当它们两个之间的通信完全没有问题的时候,就会达成共识,选出其中一个作为master。但是如果它们之间的通信出了问题,那么两个结点都会觉得现在没有master,所以每个都把自己选举成master,于是cluster里面就会有两个master。

    对于Zookeeper来说有一个很重要的问题,就是到底是根据一个什么样的情况来判断一个节点死亡down掉了?在分布式系统中这些都是有监控者来判断的,但是监控者也很难判定其他的节点的状态,唯一一个可靠的途径就是心跳,Zookeeper也是使用心跳来判断客户端是否仍然活着。

    使用ZooKeeper来做LeaderHA基本都是同样的方式:每个节点都尝试注册一个象征leader的临时节点,其他没有注册成功的则成为follower,并且通过watch机制监控着leader所创建的临时节点,

    Zookeeper通过内部心跳机制来确定leader的状态,一旦leader出现意外Zookeeper能很快获悉并且通知其他的follower,其他flflower在之后作出相关反应,这样就完成了一个切换,这种模式也是比较通用的模式,基本大部分都是这样实现的。

    但是这里面有个很严重的问题,如果注意不到会导致短暂的时间内系统出现脑裂,因为心跳出现超时可能是leader挂了,但是也可能是zookeeper节点之间网络出现了问题,导致leader假死的情况,leader其实并未死掉,但是与ZooKeeper之间的网络出现问题导致Zookeeper认为其挂掉了然后通知其他节点进行切换,这样follower中就有一个成为了leader;

    但是原本的leader并未死掉,这时候client也获得leader切换的消息,但是仍然会有一些延时,zookeeper需要通讯需要一个一个通知,这时候整个系统就很混乱可能有一部分client已经通知到了连接到新的leader上去了,有的client仍然连接在老的leader上,如果同时有两个client需要对leader的同一个数据更新,并且刚好这两个client此刻分别连接在新老的leader上,就会出现很严重问题。

    这里做下小总结:

    假死:由于心跳超时(网络原因导致的)认为leader死了,但其实leader还存活着。

    脑裂:由于假死会发起新的leader选举,选举出一个新的leader,但旧的leader网络又通了,导致出现了两个leader,有的客户端连接到老的leader,而有的客户端则连接到新的leader。

    32、Zookeeper脑裂是什么原因导致的?主要原因是Zookeeper集群和Zookeeperclient判断超时并不能做到完全同步,也就是说可能一前一后,如果是集群先于client发现,那就会出现上面的情况。

    同时,在发现并切换后通知各个客户端也有先后快慢。一般出现这种情况的几率很小,需要leader节点与Zookeeper集群网络断开,但是与其他集群角色之间的网络没有问题,还要满足上面那些情况,但是一旦出现就会引起很严重的后果,数据不一致。

    33、Zookeeper是如何解决脑裂问题的?要解决Split-Brain脑裂的问题,一般有下面几种种方法:Quorums(法定人数)方式:比如3个节点的集群,Quorums=2,也就是说集群可以容忍1个节点失效,这时候还能选举出1个lead,集群还可用。比如4个节点的集群,它的Quorums=3,Quorums要超过3,相当于集群的容忍度还是1,如果2个节点失效,那么整个集群还是无效的。这是zookeeper防止"脑裂"默认采用的方法。

    采用Redundantcommunications(冗余通信)方式:集群中采用多种通信方式,防止一种通信方式失效导致集群中的节点无法通信。

    Fencing(共享资源)方式:比如能看到共享资源就表示在集群中,能够获得共享资源的锁的就是Leader,看不到共享资源的,就不在集群中。

    要想避免zookeeper"脑裂"情况其实也很简单,在follower节点切换的时候不在检查到老的leader节点出现问题后马上切换,而是在休眠一段足够的时间,确保老的leader已经获知变更并且做了相关的shutdown清理工作了然后再注册成为master就能避免这类问题了,这个休眠时间一般定义为与zookeeper定义的超时时间就够了,但是这段时间内系统可能是不可用的,但是相对于数据不一致的后果来说还是值得的。

    1、zooKeeper默认采用了Quorums这种方式来防止"脑裂"现象。即只有集群中超过半数节点投票才能选举出Leader。这样的方式可以确保leader的唯一性,要么选出唯一的一个leader,要么选举失败。在zookeeper中Quorums作用如下:

  • 集群中最少的节点数用来选举leader保证集群可用。
  • 通知客户端数据已经安全保存前集群中最少数量的节点数已经保存了该数据。一旦这些节点保存了该数据,客户端将被通知已经安全保存了,可以继续其他任务。而集群中剩余的节点将会最终也保存了该数据。
  • 假设某个leader假死,其余的followers选举出了一个新的leader。这时,旧的leader复活并且仍然认为自己是leader,这个时候它向其他followers发出写请求也是会被拒绝的。因为每当新leader产生时,会生成一个epoch标号(标识当前属于那个leader的统治时期),这个epoch是递增的,followers如果确认了新的leader存在,知道其epoch,就会拒绝epoch小于现任leaderepoch的所有请求。

    那有没有follower不知道新的leader存在呢,有可能,但肯定不是大多数,否则新leader无法产生。Zookeeper的写也遵循quorum机制,因此,得不到大多数支持的写是无效的,旧leader即使各种认为自己是leader,依然没有什么作用。

    zookeeper除了可以采用上面默认的Quorums方式来避免出现"脑裂",还可以可采用下面的预防措施:

    2、添加冗余的心跳线,例如双线条线,尽量减少“裂脑”发生机会。

    3、启用磁盘锁。正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。

    4、设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端,不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

    34、说说Zookeeper的CAP问题上做的取舍?一致性C:Zookeeper是强一致性系统,为了保证较强的可用性,“一半以上成功即成功”的数据同步方式可能会导致部分节点的数据不一致。所以Zookeeper还提供了sync()操作来做所有节点的数据同步,这就关于C和A的选择问题交给了用户,因为使用sync()势必会延长同步时间,可用性会有一些损失。

    可用性A:Zookeeper数据存储在内存中,且各个节点都可以相应读请求,具有好的响应性能。

    Zookeeper保证了数据总是可用的,没有锁。并且有一大半的节点所拥有的数据是最新的。

    分区容忍性P:Follower节点过多会导致增大数据同步的延时(需要半数以上follower写完提交)。同时选举过程的收敛速度会变慢,可用性降低。Zookeeper通过引入observer节点缓解了这个问题,增加observer节点后集群可接受client请求的节点多了,而且observer不参与投票,可以提高可用性和扩展性,但是节点多数据同步总归是个问题,所以一致性会有所降低。

    35、watch监听为什么是一次性的?如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。

    一般是客户端执行getData(节点A,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。

    在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。

    【WINDRISES MINIPROGRAM PROMOTION】尊享直接对接老板

    电话+V: 159999-78052

    专注于小程序推广配套流程服务方案。为企业及个人客户提供了高性价比的运营方案,解决小微企业和个体拓展客户的问题

    保险类型java面试题及答案详解
    发布人:3581121254 发布时间:2024-11-27