Java架构师之面试题

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: ZooKeeper

21. 集群最少要几台机器,集群规则是怎样的?

集群规则为 2N+1 台,N>0,即 3 台。

22.集群支持动态添加机器吗?

其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式

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

2.逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供 服务。这是比较常用的方式。 3.5 版本开始支持动态扩容。

23. Zookeeper 对节点的 watch监听通知是永久的吗?为什么 不是永久的?

不是。官方声明:一个 Watch 事件是一个一次性的触发器,当被设置了 Watch 的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端, 以便通知它们。

为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况 下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。 一般是客户端执行 getData(“/节点 A”,true),如果节点 A 发生了变更或删除, 客户端会得到它的 watch 事件,但是在之后节点 A 又发生了变更,而客户端又没 有设置 watch 事件,就不再给客户端发送。 在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我 只要最新的数据即可。

24. Zookeeper 的 java 客户端都有哪些?

java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。

25. chubby 是什么,和 zookeeper 比你怎么看?

chubby 是 google 的,完全实现 paxos 算法,不开源。zookeeper 是 chubby 的开源实现,使用 zab 协议,paxos 算法的变种。

26. 说几个 zookeeper 常用的命令。

常用命令:ls get set create delete 等。

27.ZAB 和 Paxos 算法的联系与区别?

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

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

28. Zookeeper 的典型应用场景

Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员 可以使用它来进行分布式数据的发布和订阅。

通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机 制,可以非常方便的构建一系列分布式应用中年都会涉及的核心功能,如:

1、数据发布/订阅

2、负载均衡

3、命名服务

4、分布式协调/通知

5、集群管理

6、Master 选举

7、分布式锁

8、分布式队列

\1. 数据发布/订阅

介绍 :数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者 进行数据订阅。

目的: 动态获取数据(配置信息) 实现数据(配置信息)的集中式管理和数据的动态更新

设计模式 :Push 模式 Pull 模式  数据(配置信息)

特性 :

1、数据量通常比较小

2、数据内容在运行时会发生动态更新

3、集群中各机器共享,配置一致 如:机器列表信息、运行时开关配置、数据库配置信息等

基于 Zookeeper 的实现方式 :

数据存储:将数据(配置信息)存储到 Zookeeper 上的一个数据节点

数据获取:应用在启动初始化节点从 Zookeeper 数据节点读取数据,并 在该节点上注册一个数据变更 Watcher

数据变更:当变更数据时,更新 Zookeeper 对应节点数据,Zookeeper 会将数据变更通知发到各客户端,客户端接到通知后重新读取变更后的数据即 可。

  1. 负载均衡
    zk 的命名服务
    命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局 的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址, 或者一个远程的对象等等。
    分布式通知和协调
    对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态, 然后 zk 将这些变化发送给注册了这个节点的 watcher 的所有客户端。对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点。并携带工 作的进度数据,这样汇总的进程可以监控目录子节点的变化获得工作进度的实时 的全局情况。

zk 的命名服务(文件系统)

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

zk 的配置管理(文件系统、通知机制)

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

Zookeeper 集群管理(文件系统、通知机制)

所谓集群管理无在乎两点:是否有机器退出和加入、选举 master。 对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点 的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper 的连接断开,其所创 建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于 是,所有人都知道:它上船了。 新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount 又有了, 对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选 取编号最小的机器作为 master 就好。

Zookeeper 分布式锁(文件系统、通知机制)

有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分为两类, 一个是保持独占,另一个是控制时序。

对于第一类,我们将 zookeeper 上的一个 znode 看作是一把锁,通过 createznode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那 个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放 出锁。

对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺 序编号目录节点,和选 master 一样,编号最小的获得锁,用完删除,依次方便。

Zookeeper 队列管理(文件系统、通知机制)

两种类型的队列:

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

2、队列按照 FIFO 方式进行入队和出队操作。

第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。

第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按 编号。在特定的目录下创建 PERSISTENT_SEQUENTIAL 节点,创建成功时 Watcher 通知等待的队列,队列删除序列号最小的节点用以消费。此场景下 Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内 容,SEQUENTIAL 序列号就是消息的编号,按序取出即可。由于创建的节点是持 久化的,所以不必担心队列消息的丢失问题。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
2天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
2天前
|
Java
[Java 面试题] ArrayList篇
[Java 面试题] ArrayList篇
|
2天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
28 1
|
2天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
15 0
|
2天前
|
Java 编译器
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
14 0
|
3月前
|
设计模式 消息中间件 缓存
2024年Java架构师面试宝典 图文并茂 10G面试题 请收藏
2024年Java架构师面试宝典 图文并茂 10G面试题 请收藏
244 1
|
8月前
|
架构师 网络协议 Java
严禁外传!字节跳动2023春招Java岗位架构师面试题(暂定版)发布
说来说去废话也是那么多,今天小编实在是不想写前言了“原谅我一次”让我任性一回!
134 0
|
存储 SQL 安全
|
SQL 存储 安全
|
存储 SQL 缓存