热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

zookeeper入门及原理

一.zookeeper是干什么的?zookeeper是一个分布式协调框架,其内部主要提供了两个功能文件系统通知机制通过以上两个功能,

一.zookeeper是干什么的?

zookeeper是一个分布式协调框架,其内部主要提供了两个功能

  1. 文件系统
  2. 通知机制

通过以上两个功能,zookeeper可以为我们的分布式服务提供一下几个功能

  1. 命名服务
  2. 配置管理
  3. 队列管理
  4. 分布式锁
  5. 集群管理
    换句话说就是说zookeeper通过文件系统与通知机制为我们的分布式系统实现了以上五个功能

二.zookeeper的文件系统

zookeeper的文件系统我们可以理解为在自己电脑上创建文件夹,与电脑上创建的文件夹不同的是,zookeeper的文件夹是可以存储数据的(最多可以存储1M大小的数据) 每个文件夹我们称之为znode 这种节点是不可以重复的;

znode 也就是zookeeper的节点一共有四种类型的节点

  1. 临时有序
  2. 临时无序
  3. 持久有序
  4. 持久无序
    解释1:临时与持久
    首先我们要知道zookeeper总体上分为两个部分,服务端与客户端,建立节点的命令是客户端与服务端连接,然后在服务端中建立节点,我们上面所说的功能都是服务端的功能,客户端的作用可以理解为向服务端发送命令的作用。

理解了上面的话,我们应该知道 客户端需要与服务端建立连接,所谓临时节点 就是说我们客户端与服务端创建连接的时候 调用创建临时节点的方法 当客户端与服务端的连接断开的时候,这个客户端创建的临时节点就会消失,反之持久节点就是当客户端与服务端断开连接后,节点还存在。

解释2:有序与无序
假设现在zookeeper现存的目录的结构如下

root->p1->p2->p3->p4->pa1->pa2

如果我们现在先建立一个无序节点(有序无序均可),路径是root/p1/t
那么现在zookeeper的节点的结构就是

root->p1->t->p2->p3->p4->pa1->pa2

因为我们是创建的无序节点,这时候如果在创建路径是root/p1/t的节点,就会创建失败,反之如果创建的有序节点,那么即使路径是root/p1/t 我们仍然可以创建成功,这时候zookeeper会自动为我们创建的节点后面追加编号 先创建的节点的名字就是root/p1/t00001 后创建的是root/p1/t00002(00001与00002是为了便于理解而我自己加的 实际上不一定是这个数字 但是理论是一样的)

客户端创建节点额构造函数的参数:路径,数据,权限,节点类型(上面的四个)

至此zookeeper的文件系统的基本原理就基本完毕了

三.通知机制

客户端注册监听自己关心的目录节点,当注册的节点发生变化的时候(数据变动,子目录节点增加 删除等)客户端就会收到通知,客户端可以获取变动的详细信息,所以就可以进行相应的处理了

四.zookeeper在分布式系统中的应用


4.1 命名服务

因为zookeeper的目录的路径是唯一的,所以就可以保证命名是不会冲突的,即可以做服务发现

4.2 配置管理

因为zookeeper的节点可以存储数据,所以我们可以把配置相关的数据存储在zookeeper的节点中,然后客户端利用zookeeper的通知机制首次启动时获取节点中的数据,其次如果节点中的配置信息变动,就会通知监听这个节点的客户端,客户端就会获取最新的配置

4.3 集群管理

集群管理主要有两点,一是否有机器加入或者退出,而master选举

对于1 我们可以让机器连接后就创建临时节点,当机器断开连接的时候,临时节点就会被删除,这样其他的机器监听这个临时节点的父节点,有变化的时候就会通知。

4.4 队列管理

队列管理主要有两点:一个是同步队列怎么实现,另一个是如何实现先进先出(FIFO)
同步队列:只有当全部成员都到齐是,队列才可以用

zookeeper 对于同步队列的实现就是在目录下创建临时节点,然后监听节点数目是否满足要求,当满足要求的时候才可以用

对于第二点我们只需要给节点编号,然后取节点编号最小的数据

总上所述:在目录下创建临时有序节点然后客户端监听这个目录中节点的数目,节点编号最小的开始出队即可实现队列管理

4.5 分布式锁

分布式锁主要有两种,排他锁与共享锁

对于排他锁:所有客户端都去创建临时无序节点a,创建成功的获取共享锁;
对于共享锁:所有客户端都去创建临时有序节点a,编号最小的获取锁;其他的节点监听前一个编号的节点是否存在,不存在的时候本节点即获取锁

五.zookeeper集群的角色

上面所说的都是单服务器的例子,加入我们的服务器很多,就不可能仅仅使用一台zookeeper服务器,这时候就需要搭建zookeeper服务器集群
zookeeper的角色一共有三种

  1. leader:负责投票的发起和决议 更新
  2. follower:接受客户端的请求并返回结果,参与leader选举过程
  3. observer:不参与leader选举过程,不参与过半写成功策略,为了提高读取效率(话句话说只可以读数据)

大概了解以上信息接下来我们讲讲分布式与数据复制(上面一些术语会在下面解释)

六.分布式与数据复制


6.1 数据复制的好处


  1. 容错:一个zookeeper服务器挂掉,其他的服务器还可以用
  2. 可扩展:可以动态的增加节点,提高整体的负载能力
  3. 提高性能:可以直接访问距离客户端租最近的节点

6.2 数据复制的方式

一般来说数据复制有两种方式:

  1. 写主:写特定的节点
  2. 写任意:数据的修改可以任意的节点
    zookeeper采用写任意的策略:原因 可扩展性和吞吐率特别高,机器增加的时候吞吐量不会下降;

6.3 zookeeper的同步流程


  1. leader选举成功后开始进行同步流程
  2. leader与follwer连接,各个follower向leader发送自己最大的事务id zxid
  3. leader根据zxid确定同步点
  4. 完成同步后,会通知follower,状态变为uptodata了
  5. follower收到uptodata这个状态后就知道已经同步完成了,就又可以为客户端提供服务了

七.zookeeper的工作原理

原理就是原子广播:
保证各个server之间的同步,同步时候使用zab协议
zab协议主要又两个模式:同步模式(数据复制)与恢复模式(重新选举leader)
为了保证事务的一致性,zookeeper使用递增的失事务id 共64位,前32位是标识这个事务是在哪个leader下的事务,后32为用来递增
所谓事务 就是每一次会影响服务端状态改变的操作:节点的创建与删除,数据更新session失败

八.zookeeper的三种状态

客户端获取连接后:服务端返回给客户端的状态:

  1. looking 当前服务器不知道谁是leader
  2. leading 当前的服务器就是leader
  3. following 当前服务器集群又leader 但是本服务器不是leader 是follower

九.zookeeper的leader选举流程

几个概念:

  1. 服务器id 越大权重越大
  2. 事务id zxid 数值越大 权重越大
  3. 逻辑始终 投票次数
  4. 选举状态 looking leading following
    选举流程:
    每次都选投自己,然后广播给其他server zookeeper集群的个数需要时单数,便于leader选举
    假设现在又五个zookeeper服务器 ABCDE
    A启动----->投票给自己----->广播----->接受BC的广播—>c的机器id大投给C
    B启动----->投票给自己---->广播------>接受AC的广播—>c的机器id大投给C
    C启动----->投票给自己----->广播----->接受AB的广播—>c的机器id大投给C

因为已经投给C的已经超过半数了,所以DE的就无所谓了,C就是leader了


推荐阅读
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 本文详细介绍了在Windows XP系统中安装和配置Unix打印服务的方法,以支持远程行式打印机(LPR)功能。对于同时使用Windows 2000 Server打印服务器和Unix打印服务器的网络环境,该指南提供了实用的步骤和配置建议,确保不同平台之间的兼容性和高效打印。 ... [详细]
  • 在PHP的设计中,预定义了9个超级全局变量、8个魔术变量和13个魔术函数,这些变量和函数无需声明即可在脚本的任意位置使用。这些特性在PHP开发中极为常见,能够显著提升开发效率和代码的灵活性。相比之下,Java并没有类似的内置机制,但通过其他方式如上下文对象和反射机制,也可以实现类似的功能。本文将详细探讨这两种语言中这些特殊变量和函数的使用方法及其应用场景。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
author-avatar
ssben_530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有