Zookeeper 面试题(一)
1. ZooKeeper 适合哪些应用场景?
ZooKeeper 是一个高性能、高可靠的分布式协调系统,它在分布式系统和大数据领域中有着广泛的应用。以下是 ZooKeeper 适合的一些应用场景:
-
数据发布/订阅:ZooKeeper 可以作为配置中心,用于数据发布和订阅。在分布式系统中,各个节点的配置信息需要保持一致,ZooKeeper 可以将配置信息写入一个 ZNode,其他节点可以订阅这个 ZNode 来获取配置信息,并在配置更新时通过 Watcher 机制得到通知[1]。
-
负载均衡:在服务提供者和消费者之间,ZooKeeper 可以用来实现负载均衡。服务提供者启动时会在 ZooKeeper 中注册自己的服务信息,而服务消费者则可以根据这些信息和一定的算法选择服务[1]。
-
命名服务:ZooKeeper 提供了命名服务,可以将服务名称、地址等信息存放在 ZooKeeper 中,方便资源的定位和使用[1]。
-
分布式协调/通知:利用 ZooKeeper 的 Watcher 机制,可以实现不同客户端对同一数据节点的注册和异步通知,适用于 Master 节点检测 Slave 节点状态等场景[1]。
-
集群管理:ZooKeeper 可以记录集群中节点的工作状态和数量,以及对节点进行上下线操作的管理[1]。
-
Master 选举:在分布式系统中,经常需要选举出一个 Master 节点来协调其他节点的操作,ZooKeeper 的强一致性可以保证只有一个客户端能够创建节点成功,从而实现 Master 选举[1]。
-
分布式锁:在需要对资源进行同步访问的场景中,ZooKeeper 可以用来实现分布式锁。通过创建临时顺序节点,可以保证只有一个客户端能够创建锁成功,其他客户端则需要等待[1]。
-
分布式队列:ZooKeeper 可以用于实现两种分布式队列:同步队列和先进先出(FIFO)队列。同步队列要求所有成员都到达后才能使用,而 FIFO 队列则利用临时顺序节点来实现消息的顺序处理[1]。
-
服务提供者和服务消费者管理:在分布式系统中,服务提供者在启动时会在 ZooKeeper 上注册自己的服务信息,而服务消费者则可以订阅这些信息,并在服务提供者列表变更时通过 Watcher 机制得到通知,实现动态的服务发现和负载均衡[2]。
-
集群机器监控:ZooKeeper 可以用于监控集群中机器的状态,通过在 ZooKeeper 上创建临时节点,可以实时监测机器的存活状态[3]。
-
日志收集系统:在分布式日志收集系统中,ZooKeeper 可以用于动态地为日志收集器分配日志源机器,以及监控收集器的状态和进行任务的重新分配[3]。
这些应用场景展示了 ZooKeeper 在分布式系统中的核心作用,它通过其一致性、可靠性和高性能的特点,为分布式应用提供了强有力的支持。
2. 简述什么是Zookeeper ?
Zookeeper是一个开源的分布式协调服务,它由Apache软件基金会提供。它用于维护配置信息、命名、提供分布式同步和提供组服务等。Zookeeper的核心是它的一致性文件系统,它具有高性能、可靠性和可伸缩性。它广泛应用于大型分布式系统,用于解决分布式环境中的一致性和协调问题。
Zookeeper的主要特性包括:
- 顺序一致性:客户端更新的顺序将被精确地保持。
- 原子性:更新要么成功,要么失败,没有中间状态。
- 可靠性:一旦服务端成功应用了更新,它将保证不会丢失。
- 实时性:Zookeeper能够保证客户端在合理的时间内获得服务端的最新状态。
- 高可用性:Zookeeper通过主从复制的方式,确保服务的高可用性。
Zookeeper在许多场景中都有应用,比如:
- 配置管理:在分布式系统中,配置信息需要被多个节点共享,Zookeeper可以用来存储和更新这些配置。
- 命名服务:Zookeeper可以作为分布式系统中的命名服务,提供唯一标识符。
- 分布式锁:在需要同步访问共享资源的情况下,Zookeeper可以用来实现分布式锁。
- 集群管理:Zookeeper可以用于管理集群节点的状态,如节点的加入和退出。
简而言之,Zookeeper是一个强大的工具,用于帮助分布式系统解决协调和一致性问题。
3. 简述Zookeeper 目录结构和作用 ?
Apache ZooKeeper是一个分布式协调服务,它提供了一个简单的接口来管理集群中的节点状态。在ZooKeeper中,数据被存储在一个称为"znode"的树状结构中,类似于文件系统的目录结构。
ZooKeeper目录结构:
-
根节点:ZooKeeper的根节点是"/",所有其他节点都从这里开始。
-
持久节点:这些节点在创建它们的会话结束之后仍然存在。它们可以用来存储配置信息或集群状态。
-
临时节点:这些节点在创建它们的会话结束时会被自动删除。它们通常用于选举领导者或管理短暂的状态信息。
-
有序节点:在创建节点时,可以指定节点是有序的。这意味着每个新创建的节点都会被赋予一个唯一的序列号,这有助于实现有序的节点列表。
ZooKeeper的作用:
-
配置管理:ZooKeeper可以存储配置信息,集群中的所有节点都可以访问这些信息,确保配置的一致性。
-
集群管理:ZooKeeper可以用于管理集群中的节点,包括节点的注册、注销和状态监控。
-
分布式锁:ZooKeeper提供了一种机制来实现分布式锁,这对于同步分布式系统中的操作非常有用。
-
领导者选举:在分布式系统中,ZooKeeper可以用来选举领导者,确保集群中只有一个节点负责特定的任务。
-
状态同步:ZooKeeper可以帮助集群中的节点同步状态,确保所有节点都处于一致的状态。
-
事件监听:ZooKeeper允许客户端监听节点的变化,当节点状态发生变化时,客户端可以接收到通知。
-
服务发现:ZooKeeper可以作为服务发现的注册中心,客户端可以在ZooKeeper上注册服务,并查询可用的服务。
ZooKeeper通过其简单的API和一致性模型,为分布式系统提供了一个强大的基础,使得开发者可以更容易地构建可扩展和可靠的分布式应用程序。
4. 简述Zookeeper的工作原理 ?
ZooKeeper是一个分布式协调服务,它提供了一系列的原语,用于维护配置信息、命名、提供分布式同步和提供组服务等。以下是ZooKeeper工作原理的简要概述:
-
集群架构:ZooKeeper由一组服务器(称为节点)组成,这些节点可以是物理机或虚拟机。一个典型的ZooKeeper集群由3到5个节点组成,以确保高可用性和容错性。
-
角色定义:在ZooKeeper集群中,节点可以扮演不同的角色:
- Leader:负责处理所有的写请求,以及在集群中进行领导者选举。
- Follower:处理读请求,并将写请求转发给Leader处理。Follower也参与Leader选举过程。
- Observer:从ZooKeeper 3.3.0版本开始引入,Observer只处理读请求,不参与选举过程,主要用于扩展系统的读取能力。
-
数据模型:ZooKeeper使用一个分层的命名空间(类似于文件系统),称为ZNode树。每个ZNode可以存储数据和子节点,并且每个ZNode都有其版本信息和状态。
-
Watcher机制:客户端可以对特定的ZNode注册Watcher。当ZNode的数据或子节点发生变化时,ZooKeeper会通知所有注册了Watcher的客户端。
-
原子广播:ZooKeeper通过其内部的原子广播机制,确保所有服务器状态的一致性。这个机制基于一个简单的原理:所有的更新操作必须被顺序地、一个接一个地应用到所有服务器上。
-
持久性和临时性:ZooKeeper允许客户端创建持久的ZNode,这意味着即使创建它的客户端崩溃或与ZooKeeper断开连接,这些节点仍然存在。此外,也可以创建临时ZNode,这些节点在创建它们的客户端会话结束时会被自动删除。
-
顺序一致性:ZooKeeper保证创建的ZNode在全局上有一个严格的顺序,即使在网络分区的情况下也是如此。这意味着即使在分布式环境中,ZNode的创建顺序也是一致的。
-
故障转移和恢复:如果Leader节点失败,集群会通过选举过程选择一个新的Leader。这个过程是自动的,并且确保了服务的连续性和数据的一致性。
-
客户端-服务器通信:客户端与ZooKeeper服务器之间的通信是通过TCP协议进行的。客户端可以连接到集群中的任何节点,并通过心跳消息维持会话。
-
事务日志:为了确保数据的一致性和持久性,ZooKeeper服务器会将所有事务操作记录到事务日志中。
ZooKeeper的工作原理通过这些机制和特性,为分布式系统提供了一个强大的协调服务,使得开发者可以构建出可靠和可扩展的分布式应用。
5. 简述zoo.cfg 配置项目和对应的作用 ?
zoo.cfg
是 Apache ZooKeeper 的配置文件,它包含了启动 ZooKeeper 服务所需的各种配置项。以下是一些常见的配置项及其作用:
-
dataDir:指定 ZooKeeper 存储数据的目录。这包括事务日志、快照等持久性数据。
-
clientPort:指定 ZooKeeper 服务监听客户端连接的端口。默认情况下,这个端口是 2181。
-
tickTime:这是 ZooKeeper 内部的基本时间单位,用于确定其他配置参数的时间长度。例如,heartbeats 和 session timeout。
-
initLimit:初始化时,follower 和 observer 允许与 leader 通信的最大延迟时间(以 tickTime 为单位)。这影响着集群启动时的同步过程。
-
syncLimit:在运行时,follower 和 observer 与 leader 通信的最大延迟时间(以 tickTime 为单位)。如果延迟超过这个值,leader 会认为 follower 或 observer 不可达。
-
serverId:在服务器列表中,用于标识当前服务器的唯一 ID。
-
serverList:这是一个服务器列表,列出了集群中所有服务器的信息。格式通常是
serverId=host:port1:port2
,其中host
是服务器的主机名或 IP 地址,port1
是客户端连接的端口,port2
是集群内部通信的端口。 -
maxClientCnxns:指定 ZooKeeper 服务器能够接受的最大客户端连接数。
-
minSessionTimeout 和 maxSessionTimeout:设置客户端会话超时时间的最小值和最大值(以 tickTime 为单位)。
-
autopurge.snapRetainCount 和 autopurge.purgeInterval:用于自动清理数据的配置。
autopurge.snapRetainCount
指定要保留的快照数量,autopurge.purgeInterval
指定自动清理的时间间隔。 -
jvmFlags:如果需要,可以指定 JVM 参数,例如内存设置。
-
metricsProvider.className:指定用于收集和报告 ZooKeeper 性能指标的类。
-
quorum:与领导者选举相关的配置,例如
quorum.listenOnAllIPs
可以设置为 “true” 以允许 quorum 监听所有网络接口。 -
electionAlg:指定领导者选举算法,可以是
0
(默认的基本领导者选举算法)或1
(领导者选举的快速算法)。 -
observer:标识一个节点作为 observer,不参与投票过程。
这些配置项可以根据实际的需求和环境进行调整,以优化 ZooKeeper 集群的性能和行为。在修改配置文件后,通常需要重启 ZooKeeper 服务以使更改生效。
6. 请列举Zookeeper的常用命令 ?
Zookeeper提供了一系列的命令,用于管理和操作Zookeeper服务。以下是一些常用的Zookeeper命令:
-
ls [path]:列出给定路径下的子节点。
-
get [path]:获取给定路径节点的数据和状态信息。
-
set [path] [data]:设置给定路径节点的数据。
-
create [path] [data] [acl]:创建一个节点,可以指定节点的初始数据和访问控制列表。
-
delete [path] [version]:删除一个节点,version是节点的版本号,用于乐观锁。
-
stat [path]:显示给定路径节点的状态信息。
-
exists [path]:检查给定路径的节点是否存在。
-
rmr [path]:递归删除给定路径的节点及其所有子节点。
-
printwatches:打印所有现存的监视器。
-
close:关闭当前客户端会话。
-
quit:退出客户端。
-
history:显示客户端命令历史。
-
addauth [scheme] [auth]:添加客户端认证信息。
-
sync [path]:同步给定路径的节点。
-
redo [xid]:重做事务日志。
-
multi:开始一个事务。
-
commit:提交一个事务。
-
abort:中止一个事务。
-
config:显示当前服务器配置。
这些命令可以通过Zookeeper的命令行客户端使用,也可以通过编程接口在应用程序中调用。在使用这些命令时,需要根据实际的需求和场景选择合适的命令。
7. 列举Zookeeper服务启动日志的组成结构 ?
ZooKeeper服务的启动日志包含了一系列的信息,这些信息有助于了解服务的启动状态、配置和潜在的问题。以下是ZooKeeper服务启动日志的一般组成结构:
-
启动时间:记录服务启动的具体时间。
-
版本信息:显示ZooKeeper的版本号,包括JVM版本和其他依赖库的版本。
-
配置参数:列出ZooKeeper服务的配置参数,例如数据目录、日志目录、客户端端口、tick时间、初始化限制、同步限制等。
-
日志级别:显示当前ZooKeeper实例的日志级别。
-
JVM参数:显示启动JVM时使用的参数。
-
启动参数:显示启动ZooKeeper服务时使用的命令行参数。
-
服务状态:指示服务是否成功启动,或者在启动过程中遇到的错误和异常。
-
数据目录状态:检查数据目录是否存在,是否可写,以及是否为空。
-
日志目录状态:检查日志目录是否存在,是否可写。
-
集群信息:如果是集群模式,会显示集群成员信息,包括服务器ID、IP地址和端口。
-
领导者选举:如果是集群的一部分,会记录领导者选举的过程。
-
客户端连接:记录客户端连接到ZooKeeper服务的信息。
-
警告和错误:任何启动过程中的警告或错误信息都会被记录。
-
服务运行信息:一旦服务启动,可能会记录一些运行时的状态信息,例如内存使用情况、线程信息等。
-
关闭和重启日志:如果服务在启动后关闭或重启,相关的日志信息也会被记录下来。
-
审计日志:如果启用了审计日志,会记录有关安全和访问控制的详细信息。
-
性能指标:在某些配置下,可能会记录性能相关的指标,如请求处理时间等。
请注意,ZooKeeper的日志结构可能会根据版本和配置的不同而有所变化。查看具体的日志文件时,应该根据实际的ZooKeeper版本和配置来解析日志信息。
相关文章:
Zookeeper 面试题(一)
1. ZooKeeper 适合哪些应用场景? ZooKeeper 是一个高性能、高可靠的分布式协调系统,它在分布式系统和大数据领域中有着广泛的应用。以下是 ZooKeeper 适合的一些应用场景: 数据发布/订阅:ZooKeeper 可以作为配置中心,…...
怎么安装django特定版本
要安装Django的特定版本,你可以使用Python的包管理工具pip。以下是在命令行中安装Django特定版本的步骤: 确保你的计算机上已经安装了Python和pip。如果没有安装,你可以从Python官方网站下载并安装最新版本的Python,pip通常会随Py…...
关于Broken pipe异常的一点学习记录
什么是Broken pipe? pipe,管道,管道里面自然就是数据,通过指从文件或网络套接字读取的数据。当一个进程试图向一个已关闭的管道(pipe)写数据或者从一个已关闭的通道读数据时就会出现中断,也就是Broken pi…...

第十一课,end关键字、简单while循环嵌套、初识for循环
一,end关键字 end关键字用于在print输出的内容后面声明结束的字符,我们之前学过并且十分了解print是默认输出内容之后跟着换行的,如果我们不希望换行而希望使用其它字符来代替换行,就可以用end关键字来实现 特殊的,en…...

spring boot 集成mongodb
引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.2.0.RELEASE</version></dependency>配置db: spring:data:mongodb:host: 127.0.…...

从零开始搭建SpringCloud Alibaba微服务架构
Spring Cloud Alibaba是Spring Cloud的一个拓展项目,它用于构建基于阿里巴巴的微服务应用。它提供了多个阿里巴巴的开源组件,如Nacos、Sentinel、Dubbo等,用于解决微服务架构中的服务注册、配置管理、流量控制等问题。 Spring Cloud Alibaba…...
SpringBoot(八)之JdbcTemplate
SpringBoot(八)之JdbcTemplate 文章目录 SpringBoot(八)之JdbcTemplate1.添加依赖项:2. 配置数据库连接3.创建表信息4. 创建数据模型5. 创建 Repository6.测试,创建TestController spring-boot-starter-jdbc 是 Spring…...

ClickHouse 24.4 版本发布说明
本文字数:13148;估计阅读时间:33 分钟 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 新的一个月意味着新版本的发布! 发布概要 本次ClickHouse 24.4版本包含了13个新功能🎁…...

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法
电脑丢失amtlib.dll文件是什么情况?出现amtlib.dll打不开怎么办?这样的情况有什么解决方法呢?今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法?一起来看看amtlib.dll文件丢失会有哪些方法修复? a…...
【退役之重学Java】关于 volatile 关键字
一、是什么 volatile 是Java中的关键字,用于声明变量,具有两个主要特性使其特殊。 二、两个特性 首先,如果有一个volatile变量,任何线程都无法将其缓存在计算机的缓存中。访问始终从主内存中进行。其次,如果volatile变…...

“大数据建模、分析、挖掘技术应用研修班”的通知!
随着2015年9月国务院发布了《关于印发促进大数据发展行动纲要的通知》,各类型数据呈现出了指数级增长,数据成了每个组织的命脉。今天所产生的数据比过去几年所产生的数据大好几个数量级,企业有了能够轻松访问和分析数据以提高性能的新机会&am…...
Uniapp自定义默认返回按钮回退页面
//自定义后退时的操作onBackPress() {this.back1();return true;}, methods: { //跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面back1() {uni.switchTab({url: /pages/mangement/mangement});},//关闭所有页面,打开到应用内的某个页面。back1() {uni…...

音视频开发5 补充 - Nginx搭建rtmp流媒体服务器,目的是让ffmpeg 可以直播推流
直播推流 ffmpeg -re -i out.mp4 -c copy flv rtmp://server/live/streamName -re, 表示按时间戳读取文件 参考: Nginx 搭建 rtmp 流媒体服务器 (Ubuntu 16.04) https://www.jianshu.com/p/16741e363a77 第一步 准备工作 安装nginx需要的依赖包 打开 ubutun 终端…...

小猫咪的奇幻冒险:一个简单的Python小游戏
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、游戏简介与演示 二、游戏开发与运行 1. 环境搭建 2. 代码解析 3. 加速机制 三、游戏…...
专注于运动控制芯片、运动控制产品研发、生产与销售为一体的技术型芯片代理商、方案商——青牛科技
深圳市青牛科技实业有限公司,是专注于运 动控制芯片、运动控制产品研发、生产与销售为一体的技术型 芯片代理商、方案商。现今代理了国产品牌GLOBALCHIP,芯谷,矽普,TOPPOWER等品牌。其中代理品牌TOPPOWER为电源模块,他们公司通过了…...

【C++】继承(二)深入理解继承:派生类默认成员函数与友元、静态成员的奥秘
目录 派生类的默认成员函数①派生类的构造函数②派生类的拷贝构造函数③派生类的赋值构造④派生类的析构函数 继承与友元继承与静态成员 前言 我们在上一章讲解了: 继承三部曲,本篇基于上次的基础继续深入了解继承的相关知识,欢迎大家和我一起学习继承 派…...

【MATLAB源码-第214期】基于matlab的遗传算法GA最短路径路由优化算法仿真。
操作环境: MATLAB 2022a 1、算法描述 在现代网络通信和路径规划领域,最短路径路由优化算法是一项关键技术。它涉及在给定的网络拓扑中寻找从源点到目标点的最短或成本最低的路径。近年来,遗传算法(GA)因其出色的全局…...
数据结构(四)顺序栈 链式栈
一、概念 栈是一种先进后出的数据结构。FILO(firt in late out) 逻辑结构:线性结构 二、存储结构: (一) 顺序存储 顺序栈 基于一个数组配合一个栈顶"指针(数组下标)–top" 顺序栈的本质就是对…...

【linux】g++/gcc编译器
目录 背景知识 gcc如何完成 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 链接(生成可执行文件或库文件) 在这里涉及到一个重要的概念:函数库 函数库一般分为静态库和动态库两…...

VBA批量合并带有图片、表格与文本框的Word
本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符(https://blog.csdn.net/zhebu…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...