基础概念 - Zookeeper 面试题及答案
Zookeeper 是什么?能做什么?
Zookeeper 是一个开源的,是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务。

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

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

ZooKeeper 提供的名称空间与标准文件系统的名称空间非常相似。名称是由斜杠(“ /”)分隔的一系列路径元素。ZooKeeper 命名空间中的每个 znode 均由路径标识。每个 znode 都有一个父对象,其路径是 znode 的前缀,元素少一个;此规则的例外是 root(“ /”),它没有父项。此外,与标准文件系统完全一样,如果 znode 有子节点,则无法删除它。
ZooKeeper 与标准文件系统之间的主要区别在于,每个 znode 都可以具有与之关联的数据(每个文件也可以是目录,反之亦然),并且 znode 限于它们可以拥有的数据量。ZooKeeper 旨在存储协调数据:状态信息,配置,位置信息等。这种元信息通常以千字节(如果不是字节)来度量。ZooKeeper 具有1M的内置完整性检查,以防止将其用作大型数据存储,但是通常,它用于存储小得多的数据。

Znode的三种类型:
- 持久节点(persistent node)节点会被持久
- 临时节点(ephemeral node),客户端断开连接后,ZooKeeper 会自动删除临时节点
- 顺序节点(sequential node),每次创建顺序节点时,ZooKeeper 都会在路径后面自动添加上10位的数字,从1开始,最大是2147483647 (2^32-1)

Znode的四种形式:
- 持久节点:如 create /test/a "hello",通过 create参数指定为持久节点
- 持久顺序节点:通过 create -s参数指定为顺序节点
- 临时节点:通过 create -e参数指定为顺序节点
- 临时顺序节点:通过 create -s -e参数指定为临时及顺序节点
Znode里面都存储了什么?
Znode包含了存储数据(data)、访问权限(acl)、子节点引用(child)、节点状态信息(stat)

- data: znode存储的业务数据信息
- acl: 记录客户端对znode节点的访问权限,如IP等。
- child: 当前节点的子节点引用
- stat: 包含Znode节点的状态信息,比如事务id、版本号、时间戳等等。
Zookeeper 的系统架构又是怎么样的?

ZooKeeper 分为 服务器端(Server) 和客户端(Client),客户端可以连接到整个 ZooKeeper 服务的任意服务器上(除非 leaderServes 参数被显式设置,leader 不允许接受客户端连接),客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送信息。
组成 ZooKeeper 服务的服务器必须彼此了解。它们维护一个内存中的状态图像,以及持久存储中的事务日志和快照,只要大多数服务器可用,ZooKeeper 服务就可用;

Zookeeper 集群中Server有三种角色,Leader、Follower 和 Observer
- Leader:负责投投票的发起与决议,更新系统状态,写数据
- Follower:用于接收客户端请求并用来返回结果,在选主过程中参与投票
- Observer:可以接受客户端连接,将写请求转发给leader节点,但是不参与投票过程,只同步leader状态,主要存在目的就是为了提高读取效率
将 server 分为三种是为了避免太多的从节点参与过半写的过程,导致影响性能,这样 Zookeeper 只要使用一个几台机器的小集群就可以实现高性能了,如果要横向扩展的话,只需要增加 Observer 节点即可。
Zookeeper 建议集群节点个数为奇数,只要超过一半的机器能够正常提供服务,那么整个集群都是可用的状态。
ZooKeeper 启动时,将从实例中选举一个 leader,Leader 负责处理数据更新等操作,一个更新操作成功的标志是当且仅当大多数 Server 在内存中成功修改数据。每个 Server 在内存中存储了一份数据。
Zookeeper 的数据一致性是依靠ZAB协议完成的。
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。
