zookeeper面试专题及答案
- 格式:pdf
- 大小:1.00 MB
- 文档页数:11
Zookeeper 是一个分布式的,开源的程序协调服务,是hadoop项目下的一个子项目。
主要功能有:配置管理,名字服务,分布式锁,集群管理。
1.配置管理。
它使用Zab 这种一致性协议来提供一致性。
2.名字服务3.分布式锁。
在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over 到另外的服务。
这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader 选举)。
4.集群管理。
一个分布式的SOA 架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba 开源的SOA 框架Dubbo 就采用了Zookeeper 作为服务发现的底层机制)。
Zookeeper底层是一套数据结构。
这个存储结构是一个树形结构,每一个节点,称为znode。
每个znode默认能存储1MB的数据。
可以使用zkCli命令,登陆到zookeeper,并通过ls,create,delete,get,set等命令来操作这些节点。
节点类型:持久化节点:创建之后,一直存在。
需要主动删除。
不会因为客户端会话失效而消失。
持久顺序节点:会记录每个节点创建的先后顺序。
在每个节点名字后递增数字,最大为整型的最大值。
临时节点:客户端会话失效,节点自动清除。
注意:会话失效,不是连接断开。
临时顺序节点:带有顺序的临时节点。
zoo.cfg 中的dataDir 配置数据缓存路径。
Zookeeper中的角色:Leader :投票的发起和决议,更新系统状态。
Learner:分为follower ,接受请求并返回结果,参与投票。
Observer,只接受请求并返回结果,不参与投票。
Client:客户端,请求发起方。
1.数据库优化及高效代码的优化消灭全表扫描。
Where 子句中使用了is null , is not null ,oracle优化器就不允许使用索引了.有|| 连接的列, 优化器也不用索引了.% like查询时,%出现在词首,索引失效.Order by 中的非索引列和计算表达式,都会降低查询速度.所以应该为其建立索引,并禁止在order by 中使用表达式.From 后,记录数最少的表,写在最后面.依次类推.三个以上的表,把交叉表放在最后.Where 后,能过滤掉最大条数的,写在最后面.Select后,避免使用*最高效的删除重复记录的方法,因为使用了rowIdDELETE FROM emp e where e.rowid >(Select min(x.rowid) from emp x where x.empid = e.empid)使用truncate代替delete,truncate是ddl,不是dml2.保证产品使用的安全性软件安全性测试包括程序、网络、数据库安全性测试。
大数据面试题及答案汇总版第1部分选择题1.1 Hadoop选择题1.1.1 HDFS1.下面哪个程序负责 HDFS 数据存储?A.NameNodeB.JobtrackerC.DatanodeD.secondaryNameNodeE.tasktracker2. HDFS 中的 block 默认保存几份?A.3份B.2份C.1份D.4份3. 下列哪个程序通常与NameNode 在一个节点启动?A. SecondaryNameNodeB.DataNodeC.TaskTrackerD. Jobtracker4. HDFS 默认 Block Size(新版本)A. 32MBB.64MBC.128MBD.256MB5. Client 端上传文件的时候下列哪项正确A. 数据经过 NameNode 传递给 DataNodeB.Client 端将文件切分为Block,依次上传C.Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作6. 下面与 HDFS 类似的框架是?A.NTFSB.FAT32C.GFSD.EXT37. 的8. 的1.1.2 集群管理1. 下列哪项通常是集群的最主要瓶颈A. CPUB.网络C.磁盘IOD.内存2. 关于SecondaryNameNode 哪项是正确的?A.它是 NameNode 的热备B.它对内存没有要求C.它的目的是帮助NameNode 合并编辑日志,减少NameNode 启动时间D.SecondaryNameNode 应与 NameNode 部署到一个节点3. 下列哪项不可以作为集群的管理?A. Puppet B.Pdsh C.ClouderaManager D.Zookeeper4. 配置机架感知的下面哪项正确A. 如果一个机架出问题,不会影响数据读写B.写入数据的时候会写到不同机架的 DataNode 中C.MapReduce 会根据机架获取离自己比较近的网络数据5. 下列哪个是 Hadoop 运行的模式A. 单机版B.伪分布式C.分布式6. Cloudera 提供哪几种安装 CDH 的方法A. Cloudera manager B.Tarball C.Yum D.Rpm7.1.2 Hbase选择题1.2.1 Hbase基础1. HBase 来源于哪篇博文? CA TheGoogle File SystemBMapReduceCBigTableD Chubby2. 下面对 HBase 的描述是错误的? AA 不是开源的B 是面向列的C 是分布式的D 是一种 NoSQL 数据库3. HBase 依靠()存储底层数据 AA HDFSB HadoopC MemoryDMapReduce4. HBase 依赖()提供消息通信机制 A AZookeeperB ChubbyC RPCD Socket5. HBase 依赖()提供强大的计算能力 DAZookeeperB ChubbyC RPCDMapReduce6. MapReduce 与 HBase 的关系,哪些描述是正确的? B、CA 两者不可或缺,MapReduce 是 HBase 可以正常运行的保证B 两者不是强关联关系,没有 MapReduce,HBase 可以正常运行CMapReduce 可以直接访问 HBaseD 它们之间没有任何关系7. 下面哪些选项正确描述了HBase 的特性? A、B、C、DA 高可靠性B 高性能C 面向列D 可伸缩8. 下面哪些概念是 HBase 框架中使用的?A、CA HDFSB GridFSCZookeeperD EXT39. D1.2.2 Hbase核心1. LSM 含义是?AA 日志结构合并树B 二叉树C 平衡二叉树D 长平衡二叉树2. 下面对 LSM 结构描述正确的是? A、CA 顺序存储B 直接写硬盘C 需要将数据 Flush 到磁盘D 是一种搜索平衡树3. LSM 更能保证哪种操作的性能?BA 读B 写C 随机读D 合并4. LSM 的读操作和写操作是独立的?AA 是。
⾯试题:分布式锁的多种实现!=!=未看⽬前⼏乎很多⼤型⽹站及应⽤都是分布式部署的,分布式场景中的数据⼀致性问题⼀直是⼀个⽐较重要的话题。
分布式的CAP理论告诉我们“任何⼀个分布式系统都⽆法同时满⾜⼀致性(Consistency)、可⽤性(Availability)和分区容错性(Partition tolerance),最多只能同时满⾜两项。
”所以,很多系统在设计之初就要对这三者做出取舍。
在互联⽹领域的绝⼤多数的场景中,都需要牺牲强⼀致性来换取系统的⾼可⽤性,系统往往只需要保证“最终⼀致性”,只要这个最终时间是在⽤户可以接受的范围内即可。
在很多场景中,我们为了保证数据的最终⼀致性,需要很多的技术⽅案来⽀持,⽐如分布式事务、分布式锁等。
有的时候,我们需要保证⼀个⽅法在同⼀时间内只能被同⼀个线程执⾏。
在单机环境中,Java中其实提供了很多并发处理相关的API,但是这些API在分布式场景中就⽆能为⼒了。
也就是说单纯的Java Api并不能提供分布式锁的能⼒。
所以针对分布式锁的实现⽬前有多种⽅案:基于数据库实现分布式锁基于缓存(redis,memcached)实现分布式锁基于Zookeeper实现分布式锁在分析这⼏种实现⽅案之前我们先来想⼀下,我们需要的分布式锁应该是怎么样的?(这⾥以⽅法锁为例,资源锁同理)可以保证在分布式部署的应⽤集群中,同⼀个⽅法在同⼀时间只能被⼀台机器上的⼀个线程执⾏。
这把锁要是⼀把可重⼊锁(避免死锁)这把锁最好是⼀把阻塞锁(根据业务需求考虑要不要这条)有⾼可⽤的获取锁和释放锁功能获取锁和释放锁的性能要好⼀. 基于数据库实现分布式锁1.1 基于数据库表要实现分布式锁,最简单的⽅式可能就是直接创建⼀张锁表,然后通过操作该表中的数据来实现了。
当我们要锁住某个⽅法或资源时,我们就在该表中增加⼀条记录,想要释放锁的时候就删除这条记录。
创建这样⼀张数据库表:CREATE TABLE `methodLock` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`method_name` varchar(64) NOT NULL DEFAULT '' COMMENT '锁定的⽅法名',`desc` varchar(1024) NOT NULL DEFAULT '备注信息',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '保存数据时间,⾃动⽣成',PRIMARY KEY (`id`),UNIQUE KEY `uidx_method_name` (`method_name `) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='锁定中的⽅法';当我们想要锁住某个⽅法时,执⾏以下SQL:insert into methodLock(method_name,desc) values (‘method_name’,‘desc’)因为我们对method_name做了唯⼀性约束,这⾥如果有多个请求同时提交到数据库的话,数据库会保证只有⼀个操作可以成功,那么我们就可以认为操作成功的那个线程获得了该⽅法的锁,可以执⾏⽅法体内容。
第1篇一、基础知识1. 请简述大数据的概念及其在当今社会中的重要性。
2. 什么是Hadoop?请简要介绍其架构和核心组件。
3. 请解释HDFS的工作原理,以及它在数据存储方面的优势。
4. 请说明MapReduce编程模型的基本原理和执行流程。
5. 什么是YARN?它在Hadoop生态系统中的作用是什么?6. 请描述Zookeeper在Hadoop集群中的作用和常用场景。
7. 什么是Hive?它与传统的数据库有什么区别?8. 请简述HBase的架构和特点,以及它在列式存储方面的优势。
9. 什么是Spark?它与Hadoop相比有哪些优点?10. 请解释Flink的概念及其在流处理方面的应用。
二、Hadoop集群搭建与优化1. 请描述Hadoop集群的搭建步骤,包括硬件配置、软件安装、配置文件等。
2. 请说明如何实现Hadoop集群的高可用性,例如HDFS和YARN的HA配置。
3. 请简述Hadoop集群的负载均衡策略,以及如何进行负载均衡优化。
4. 请解释Hadoop集群中的数据倾斜问题,以及如何进行数据倾斜优化。
5. 请说明如何优化Hadoop集群中的MapReduce任务,例如调整map/reduce任务数、优化Shuffle过程等。
6. 请描述Hadoop集群中的内存管理策略,以及如何进行内存优化。
7. 请简述Hadoop集群中的磁盘I/O优化策略,例如磁盘阵列、RAID等。
8. 请说明如何进行Hadoop集群的性能监控和故障排查。
三、数据存储与处理1. 请描述HDFS的数据存储格式,例如SequenceFile、Parquet、ORC等。
2. 请解释HBase的存储结构,以及RowKey和ColumnFamily的设计原则。
3. 请简述Hive的数据存储格式,以及其与HDFS的交互过程。
4. 请说明Spark的数据存储格式,以及其在内存和磁盘之间的数据交换过程。
5. 请描述Flink的数据流处理模型,以及其在数据流中的操作符和窗口机制。
云存储研发工程师岗位面试题及答案1.请解释什么是云存储,并给出一个常见的使用场景。
答案:云存储是将数据存储在由第三方托管的远程服务器上,而不是在本地硬件上。
这允许数据在多个设备之间轻松共享和访问。
常见使用场景包括企业备份数据,以便在硬件故障时进行恢复。
2.您能描述一下分布式存储的基本概念吗?答案:分布式存储是一种使用多台独立的连接存储设备来存储数据的方法。
它可以增加可用性、可扩展性和容错能力。
例如,HadoopHDFS就是一种常见的分布式存储系统。
3.请解释CAP定理在分布式系统中的意义。
答案:CAP定理指出,分布式存储系统不能同时满足一致性(C)、可用性(A)和分区容忍性(P)。
在网络分区或故障发生时,系统必须在一致性和可用性之间做出权衡。
例如,Cassandra选择牺牲一致性以获得更高的可用性和分区容忍性。
4.什么是对象存储?与块存储和文件存储有何不同?答案:对象存储将数据作为对象存储,每个对象包括数据、元数据和唯一标识符。
与块存储(将数据存储为固定大小的块)和文件存储(使用目录结构)不同,对象存储更适合大规模非结构化数据。
例如,AmazonS3就是一个广泛使用的对象存储服务。
5.请描述在实现分布式事务时,两阶段提交(2PC)与三阶段提交(3PC)的主要区别。
1/ 19答案:两阶段提交(2PC)包括准备阶段和提交阶段。
在准备阶段,协调者询问所有参与者是否准备提交;在提交阶段,根据参与者的反馈决定提交或中止事务。
三阶段提交(3PC)增加了超时机制和预提交阶段,以减轻协调者故障的问题。
这使得3PC在某些故障场景下更加健壮。
6.在分布式存储系统中,一致性哈希有什么作用?答案:一致性哈希用于在分布式环境中均匀分配数据。
通过使用一致性哈希,可以确保当添加或删除节点时,只有少部分数据需要重新分配。
这提高了可扩展性并减小了维护过程中的影响。
例如,在分布式缓存如Memcached中,一致性哈希有助于高效地分布数据。
第1篇一、Hadoop基础知识1. 请简述Hadoop的核心组件及其作用。
2. 什么是Hadoop生态系统?列举出Hadoop生态系统中的主要组件。
3. 什么是MapReduce?请简述MapReduce的原理和特点。
4. 请简述Hadoop的分布式文件系统HDFS的架构和特点。
5. 什么是Hadoop的YARN?它有什么作用?6. 请简述Hadoop的HBase、Hive、Pig等组件的特点和应用场景。
7. 什么是Hadoop的集群部署?请简述Hadoop集群的部署流程。
8. 什么是Hadoop的分布式缓存?请简述其作用和实现方式。
9. 什么是Hadoop的MapReduce作业?请简述MapReduce作业的执行流程。
10. 请简述Hadoop的HDFS数据复制策略。
11. 什么是Hadoop的NameNode和DataNode?它们各自有什么作用?12. 请简述Hadoop的HDFS数据写入和读取过程。
13. 什么是Hadoop的Zookeeper?它在Hadoop集群中有什么作用?14. 请简述Hadoop的HDFS数据块的校验和机制。
15. 什么是Hadoop的HDFS数据恢复机制?二、Hadoop核心组件面试题1. 请简述Hadoop的MapReduce组件的架构和执行流程。
2. 请简述Hadoop的HDFS数据块的读写过程。
3. 请简述Hadoop的YARN资源调度器的工作原理。
4. 请简述Hadoop的HBase组件的架构和特点。
5. 请简述Hadoop的Hive组件的架构和特点。
6. 请简述Hadoop的Pig组件的架构和特点。
7. 请简述Hadoop的Zookeeper组件的架构和特点。
8. 请简述Hadoop的HDFS数据块的复制策略。
9. 请简述Hadoop的HDFS数据块的校验和机制。
10. 请简述Hadoop的HDFS数据恢复机制。
三、Hadoop高级面试题1. 请简述Hadoop集群的故障转移机制。
Zookeeper面试题1.Zookeeper是什么?答案:Zookeeper是一个分布式协调服务,用于管理和协调分布式系统中的各种服务和进程。
它提供了一些基础的服务,如命名注册、配置管理、分布式同步等,被广泛应用于分布式系统中。
2.Zookeeper的主要特点是什么?答案:Zookeeper的主要特点包括:高性能、高可用性、分布式协调、低延迟等。
它提供了可靠的数据存储和访问控制,并且能够处理网络分区和故障转移。
3.Zookeeper的工作原理是什么?答案:Zookeeper的工作原理是基于分布式一致性协议(Zab算法)来实现分布式协调和管理的。
它维护了一个全局的命名空间,并提供了基于文件系统的数据模型和事件通知机制。
4.Zookeeper的节点类型有哪些?答案:Zookeeper的节点类型包括:临时节点(ephemeral node)、持久节点(persistent node)、顺序节点(sequential node)和容器节点(container node)。
5.Zookeeper的数据模型是什么?答案:Zookeeper的数据模型类似于一个文件系统,它维护了一个由路径唯一标识的数据结构,每个节点都可以存储数据,并且可以拥有子节点。
数据是持久化的,可以在客户端和服务器之间进行复制。
6.Zookeeper的集群管理是如何实现的?答案:Zookeeper的集群管理是通过选举机制来实现的。
在Zookeeper集群中,有一个主节点(leader)和多个从节点(follower),主节点负责处理客户端的请求和管理集群状态,从节点则负责分担主节点的负载。
当主节点出现故障时,从节点会进行选举,选出新的主节点接管集群管理。
7.Zookeeper的观察者模式是如何实现的?答案:Zookeeper的观察者模式是通过客户端注册监听指定的节点来实现的。
当节点发生变化时,Zookeeper会通知所有注册在该节点上的客户端。
kafka zookeeper篇(组件、原理、使用场景、面试)Kafka与Zookeeper的结合:1. Kafka是一个开源流处理平台,提供流数据生产和消费的服务。
它主要用于构建实时数据流管道和应用,如日志收集、消息分发、流数据处理等。
2. Zookeeper是一个分布式协调服务,提供分布式应用程序的数据同步、配置管理和服务发现等功能。
Kafka依赖于Zookeeper来管理集群的元数据信息和协调集群中的broker节点。
Kafka与Zookeeper的结合原理:1. Kafka集群中的每个broker节点都会将自己注册到Zookeeper中,并保存自身的元数据信息,如配置信息和broker状态等。
2. Zookeeper保存了整个Kafka集群的元数据信息,包括Topic信息、Partition信息和Broker信息等。
这些信息对Kafka的分布式协调非常重要,可以确保Kafka 集群的正常运行。
3. 当Kafka客户端进行生产或消费操作时,它会首先与Zookeeper进行交互,获取集群的状态信息和元数据信息,然后根据这些信息进行相应的操作。
Kafka与Zookeeper的使用场景:1. Kafka在实时数据处理领域广泛应用,如日志收集、消息分发和流数据处理等。
它可以处理大量的数据流,并提供高吞吐量和低延迟的服务。
2. Zookeeper常用于分布式系统中的协调和服务发现。
它可以管理分布式节点的状态信息和元数据信息,提供一致性和可靠性保证。
Kafka与Zookeeper的面试问题:1. Kafka是什么?它有哪些特点?2. Zookeeper是什么?它有哪些功能?3. Kafka与Zookeeper的关系是什么?它们是如何结合的?4. Kafka如何保证数据的安全性和可靠性?5. Zookeeper在Kafka中的作用是什么?它如何管理Kafka集群的元数据信息?。
zookeeper基础概念-回复什么是zookeeper?Zookeeper是一个开源的,高性能的分布式协调服务,为分布式应用程序提供数据同步、配置管理、分布式锁等功能。
它可以管理和协调大规模的集群,使得分布式应用程序可以在协作的环境中顺利地运作。
Zookeeper的特性:1. 简单易用:Zookeeper提供了简单易用的编程接口,开发人员可以通过创建文件夹和文件的方式来管理数据,并通过监听机制实现对数据变化的监控。
2. 一致性:Zookeeper采用了分布式数据一致性的算法ZAB(Zookeeper Atomic Broadcast),它可以保证在分布式环境中的数据一致性。
3. 高性能:Zookeeper在设计上注重高性能,它采用了内存读写的方式进行数据操作,并使用了数据修复和快照技术来提高读取和写入的性能。
4. 可靠性:Zookeeper支持数据的持久化存储,可以在节点故障或网络故障时保证数据的可靠性和一致性。
Zookeeper的概念:1. 节点(Node):Zookeeper将数据以节点的形式进行存储,节点可以是一个文件夹或一个文件,类似于操作系统中的文件系统。
2. 路径(Path):节点可以通过路径来进行唯一标识,路径是由斜杠分隔的字符串,例如:/root/node。
3. 会话(Session):客户端与Zookeeper服务器的连接称为会话,会话的创建和关闭由客户端控制,Zookeeper会监控会话的存活状态。
4. 事件(Event):Zookeeper可以监听节点数据的变化,并通过事件通知客户端,例如节点创建、节点删除等。
5. 版本(Version):每个节点都有一个版本号,用于标识节点数据的变化,每次对节点进行更新操作,版本号都会递增。
6. ACL(Access Control List):Zookeeper支持对节点进行权限控制,可以定义不同的角色和权限来限制对节点的访问。
Zookeeper的应用场景:1. 分布式协调:Zookeeper可以作为分布式系统的协调服务,实现分布式锁、选举和分布式队列等功能,保证分布式系统的一致性和可靠性。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。
最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
客户端的读请求可以被集群中的任意一台机器处理,如果读请求在节点上注册了监听器,这个监听器也是由所连接的zookeeper机器来处理。
对于写请求,这些请求会同时发给其他zookeeper机器并且达成一致后,请求才会返回成功。
因此,随着zookeeper的集群机器增多,读请求的吞吐会提高但是写请求的吞吐会下降。
有序性是zookeeper中非常重要的一个特性,所有的更新都是全局有序的,每个更新都有一个唯一的时间戳,这个时间戳称为zxid(Zookeeper Transaction Id)。
而读请求只会相对于更新有序,也就是读请求的返回结果中会带有这个zookeeper最新的zxid。
1、文件系统2、通知机制Zookeeper提供一个多层级的节点命名空间(节点称为znode)。
与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。
Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M。
1、PERSISTENT-持久化目录节点客户端与zookeeper断开连接后,该节点依旧存在2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号3、EPHEMERAL-临时目录节点客户端与zookeeper断开连接后,该节点被删除4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号client端会对某个znode建立一个watcher事件,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。
1、命名服务2、配置管理3、集群管理4、分布式锁5、队列管理命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。
程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。
所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点的子节点变化消息。
一旦有机器挂掉,该机器与zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。
新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。
有了zookeeper的一致性文件系统,锁的问题变得容易。
锁服务可以分为两类,一个是保持独占,另一个是控制时序。
对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。
所有客户端都去创建/distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。
用完删除掉自己创建的distribute_lock 节点就释放出锁。
对于第二类,/distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。
在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。
客户端调用createNode方法在locker下创建临时顺序节点,然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。
客户端获取到所有的子节点path之后,如果发现自己创建的节点在所有创建的子节点序号最小,那么就认为该客户端获取到了锁。
如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时对其注册事件监听器。
之后,让这个被关注的节点删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是locker子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
当前这个过程中还需要许多的逻辑判断。
代码的实现主要是基于互斥锁,获取分布式锁的重点逻辑在于BaseDistributedLock,实现了基于Zookeeper实现分布式锁的细节。
两种类型的队列:1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
2、队列按照FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。
在特定的目录下创建PERSISTENT_SEQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。
此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL序列号就是消息的编号,按序取出即可。
由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。
Zookeeper作为一个集群提供一致的数据服务,自然,它要在所有机器间做数据复制。
数据复制的好处:1、容错:一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作;2、提高系统的扩展能力:把负载分布到多个节点上,或者增加节点来提高系统的负载能力;3、提高性能:让客户端本地访问就近的节点,提高用户访问速度。
从客户端读写访问的透明度来看,数据复制集群系统分下面两种:1、写主(WriteMaster) :对数据的修改提交给指定的节点。
读无此限制,可以读取任何一个节点。
这种情况下客户端需要对读与写进行区别,俗称读写分离;2、写任意(Write Any):对数据的修改可提交给任意的节点,跟读一样。
这种情况下,客户端对集群节点的角色与变化透明。
对zookeeper来说,它采用的方式是写任意。
通过增加机器,它的读吞吐能力和响应能力扩展性非常好,而写,随着机器的增多吞吐能力肯定下降(这也是它建立observer的原因),而响应能力则取决于具体实现方式,是延迟复制保持最终一致性,还是立即复制快速响应。
Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。
实现这个机制的协议叫做Zab协议。
Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。
状态同步保证了leader和Server具有相同的系统状态。
zookeeper采用了递增的事务Id来标识,所有的proposal(提议)都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch(时期; 纪元; 世; 新时代)用来标识leader是否发生改变,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。
当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
每个Server在工作过程中有三种状态:LOOKING:当前Server不知道leader是谁,正在搜寻LEADING:当前Server即为选举出来的leaderFOLLOWING:leader已经选举出来,当前Server与之同步当leader崩溃或者leader失去大多数的follower,这时zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。
Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。
系统默认的选举算法为fast paxos。
1、Zookeeper选主流程(basic paxos)(1)选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;(2)选举线程首先向所有Server发起一次询问(包括自己);(3)选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;(4)收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;(5)线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。
通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 每个Server启动后都会重复以上流程。
在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。
2、Zookeeper选主流程(basic paxos)fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。