公众号 :moon聊技术面试

《面试八股文》之Zookeeper11卷

2021-06-08  本文已影响0人  moon聊技术

微信公众号:「moon聊技术」
关注选择“ 「星标」 ”, 重磅干货,第一 时间送达!
[如果你觉得文章对你有帮助,欢迎「关注,在看,点赞,转发」]


image

其他《面试八股文》系列文章请点这里

「每天一个知识点」


「目录」


1.Zookeeper 是什么?能做什么?

Zookeeper 是一个「开源的」,是用于维护配置信息,命名,提供「分布式」同步和提供组服务的集中式服务。

image

可以基于 Zookeeper 实现诸如「数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列」等功能。

image

Zookeeper 最常用的一个使用场景就是作为「注册中心」,生产者将自己提供的服务注册到 Zookeeper,然后消费者从 Zookeeper 中「拿到生产者的服务列表信息」,然后再去「调用生产者」的内容数据,比如 「Dubbo,Kafka」 都是使用 Zookeeper 作为注册中心的。

2.说说 Zookeeper 的数据结构吧

image

ZooKeeper 提供的名称空间与标准文件系统的名称空间非常相似。名称是由斜杠(“ /”)分隔的一系列路径元素。ZooKeeper 命名空间中的每个 znode 均由路径标识。「每个 znode 都有一个父对象」,其路径是 znode 的前缀,元素少一个;此规则的例外是 root(“ /”),它没有父项。此外,与标准文件系统完全一样,「如果 znode 有子节点,则无法删除它」

ZooKeeper 与标准文件系统之间的主要区别在于,「每个 znode 都可以具有与之关联的数据」(每个文件也可以是目录,反之亦然),并且 znode 限于它们可以拥有的数据量。ZooKeeper 旨在存储协调数据:状态信息,配置,位置信息等。这种元信息通常以千字节(如果不是字节)来度量。「ZooKeeper 具有1M的内置完整性检查,以防止将其用作大型数据存储」,但是通常,它用于存储小得多的数据。

image

「Znode的三种类型:」

image

「Znode的四种形式:」

3.Znode里面都存储了什么?

Znode包含了「存储数据(data)」「访问权限(acl)」「子节点引用(child)」「节点状态信息(stat)」

image

4.Zookeeper 的系统架构又是怎么样的?

image

ZooKeeper 分为「服务器端」(Server) 和「客户端」(Client),客户端可以连接到整个 ZooKeeper 服务的任意服务器上(除非 leaderServes 参数被显式设置,leader 不允许接受客户端连接),客户端使用并维护一个 「TCP 连接」,通过这个连接发送请求、接受响应、获取观察的事件以及发送信息。

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

image

Zookeeper 集群中「Server有三种角色」,Leader、Follower 和 Observer

将 server 分为三种是为了「避免太多的从节点参与过半写」的过程,导致影响性能,这样 Zookeeper 只要使用一个几台机器的小集群就可以实现高性能了,如果要横向扩展的话,只需要增加 Observer 节点即可。

Zookeeper 建议集群节点个数为奇数,只要「超过一半的机器」能够正常提供服务,那么整个集群都是可用的状态。

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

Zookeeper 的数据一致性是依靠「ZAB协议」完成的。

5.那你继续给我讲讲 ZAB 协议吧

ZAB(ZooKeeper Atomic Broadcast 原子广播) 协议是为 ZooKeeper 特殊设计的一种「支持崩溃恢复」的原子广播协议。 在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。

ZAB 协议包括有两种模式,分别是 「崩溃恢复和消息广播」

6.Zookeeper初始化是如何进行Leader选举的?

image

在集群初始化阶段,只有两台以以上的 ZK 启动才会发生leader选举,过程如下:

7.如果Leader挂了,进入崩溃恢复,怎么选举Leader?

image

8.说说Wather监听机制和它的原理?

image

具体的步骤如下:

简单的理解就是 client 会对某个 znode 注册一个 watcher 事件,当该 「znode 发生变化」时,这些 client 会「收到 ZooKeeper 的通知」

四个特性:

9.Zookeeper有哪些特性呢?

image

10.Zookeeper 如何识别请求的先后顺序?

image

Leader 收到请求之后,会将每个请求分配一个全局唯一递增的事务ID:zxid,然后把请求放入到一个 「FIFO 的队列」中,之后就会按照 FIFO 的策略发送给所有的 Follower。

11.选举 leader 后是怎么进行数据同步的

image

前面提到写数据是由 leader 负责的,而 leader 会将每个请求分配一个 ZXID,放入一个队列中,依次执行,每次 leader 执行完一个请求后,会记录下执行的这个 ZXID。

我们将这个队列中最大的 ZXID 称为 「maxZXID」,最小的 ZXID 称为 「minZXID」

将 Observer 和 follower 中最新的 ZXID 「称为lastSyncZXID」

「proposal」:其实就是将请求中的一些信息,ZXID 等封装到一个 proposal对象中

12.Zookeeper 会有数据不一致的情况发生吗?

还是会有的,因为 Zookeeper 采用的是「过半写」机制,意味着「3台服务器只要有两台写成功就代表整个集群写成功」,如果刚好有请求打在这台还「未写的服务器」上就查询不到该数据,就会有数据不一致的情况产生。

上一篇下一篇

猜你喜欢

热点阅读