1.什么是 ZooKeeper?
答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案。设计目的是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的系统,并以一系列简单易用的原子操作提供给用户使用。
2.ZooKeeper 提供了哪些功能?
答:ZooKeeper 主要提供以下功能:
- 分布式服务注册与订阅:在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,比较典型的服务注册与订阅,如 Dubbo。
- 分布式配置中心:发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者获取数据,实现配置信息的集中式管理和动态更新。
- 命名服务:在分布式系统中,通过命名服务客户端应用能够根据指定名字来获取资源、服务地址和提供者等信息。
- 分布式锁:这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。
3.ZooKeeper 有几种搭建模式?
答:ZooKeeper 通常有三种搭建模式:
- 单机模式:zoo.cfg 中只配置一个 server.id 就是单机模式了,此模式一般用在测试环境,如果当前主机宕机,那么所有依赖于当前 ZooKeeper 服务工作的其他服务器都不能进行正常工作;
- 伪分布式模式:在一台机器启动不同端口的 ZooKeeper,配置到 zoo.cfg 中,和单机模式相同,此模式一般用在测试环境;
- 分布式模式:多台机器各自配置 zoo.cfg 文件,将各自互相加入服务器列表,上面搭建的集群就是这种完全分布式。
4.ZooKeeper 有哪些特性?
答: ZooKeeper 特性如下:
- 顺序一致性(Sequential Consistency):来自相同客户端提交的事务,ZooKeeper 将严格按照其提交顺序依次执行;
- 原子性(Atomicity):于 ZooKeeper 集群中提交事务,事务将“全部完成”或“全部未完成”,不存在“部分完成”;
- 单一系统镜像(Single System Image):客户端连接到 ZooKeeper 集群的任意节点,其获得的数据视图都是相同的;
- 可靠性(Reliability):事务一旦完成,其产生的状态变化将永久保留,直到其他事务进行覆盖;
- 实时性(Timeliness):事务一旦完成,客户端将于限定的时间段内,获得最新的数据。
5.以下关于 ZooKeeper 描述错误的是?
A:所有的节点都具有稳定的存储能力 B:ZooKeeper 任意节点之间都能够进行通信(消息发送 & 接收) C:为了提高性能,ZooKeeper 允许同一份数据存在一部分节点写成功,另一部分节点写失败 D:ZooKeeper 集群运行期间,只要半数以上节点存活,ZooKeeper 就能正常服务 答:C 题目解析:ZooKeeper 不允许同一份数据存在一部分节点写成功,另一部分节点写失败的情况,这不符合 ZooKeeper“一致性”的原则。
6.ZooKeeper 如何实现分布式锁?
答:ZooKeeper 实现分布式锁的步骤如下:
- 客户端连接 ZooKeeper,并在 /lock 下创建临时的且有序的子节点,第一个客户端对应的子节点为 /lock/lock-10000000001,第二个为 /lock/lock-10000000002,以此类推。
- 客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知后重复此步骤直至获得锁;
- 执行业务代码;
- 完成业务流程后,删除对应的子节点释放锁。
整体流程如下图所示:
1